JVM学习-JVM的自动优化

目录

1.语法糖

1.1默认构造器

1.2自动拆装箱

1.3泛型集合取值

1.4可变参数实现

[1.5 foreach循环](#1.5 foreach循环)

[1.6 switch配合String使用](#1.6 switch配合String使用)

[1.7 switch配合枚举使用​编辑](#1.7 switch配合枚举使用编辑)

[1.8 try-with-resources](#1.8 try-with-resources)

1.9方法重写的桥接方法

2.运行时优化

2.1分层优化以及逃逸分析

2.2方法内联

2.3字段优化


JVM会进行两部分的优化:一部分是编译时优化,也就是语法糖;另一部分是运行时优化。

1.语法糖

指的是在对源码编译成字节码的期间,自动生成和转换的一些代码,为减轻程序员的负担所做出的优化。

1.1默认构造器

在平常编写类时不写构造方法但程序也会正常运行,这是因为在编译期间会自动生成默认构造器,使用了父类的构造方法。

1.2自动拆装箱

装箱是指将基本类型转换为包装类型,拆箱则是将包装类型转换为基本类型。所谓基本类型共八个,分别是int、char、byte、short、long、boolean、float以及double,对应的包装类型则是Integer、Character、Byte、Short、Long、Boolean、Float以及Double,包装类型主要是将这些基本类型包装成对象。两种类型的转换其实是需要调用方法的,比如Integer对象转换成基本类型int需要调用对象的intValue()方法,而int转换成Integer对象则需要调用Integer.valueOf(数字)方法;此时就可以利用语法糖,通过在编译期间自动生成这些代码来实现无需方法调用直接进行类型转换,比如我们可以直接使用Integer x=1和int y=x来进行类型转换,既减轻了编码负担又增加了可读性。

1.3泛型集合取值

1.4可变参数实现

见另一篇博客JVM学习-底层字节码的执行过程-CSDN博客中的可变参数实现部分。

1.5 foreach循环

用于所有数组以及实现了Iterable接口的集合,Iterable用来获取集合的迭代器。对于数组来说,foreach在编译期间其实是一个for循环,从第一个开始遍历,且遍历的长度就是数组的长度。对于集合来说则在编译期间变成一个while循环,先是通过集合的iterator()方法获取迭代器,然后通过hasnext()方法查看是否还有下一个元素,如果没有则终止循环;在遍历时由于使用的是迭代器,需要通过.next()方法获取下一个元素,但由于进行了泛型擦除,所以拿到的元素都是Object类型,需要进行强制转换,当然在使用foreach循环时不需要,因为在编译时会自动进行优化。要注意的是foreach遍历的是副本而不是其对象本身,所以使用foreach修改内部元素是无效的。

以list集合为例:

源码:

java 复制代码
List<Integer> list=new Arrays.asList(1,2,3);
        foreach(Integer i : list){
                     System.out.println(i);                 
         }

编译后形成的字节码相当于以下代码:

java 复制代码
List<Integer> list=new Arrays.asList(1,2,3);
        Iterator it=list.iterator();
        while(it.hasnext()){
                 Integer i=(Integer)it.next();
                 System.out.println(i);
        }

1.6 switch配合String使用

1.7 switch配合枚举使用

1.8 try-with-resources

1.9方法重写的桥接方法

2.运行时优化

2.1分层优化以及逃逸分析

2.2方法内联

2.3字段优化

字段优化是针对于普通成员变量或静态成员变量的操作进行的优化,在频繁访问普通成员变量或静态成员变量时,JVM会复制一个副本,这个副本是一个局部变量,由于局部变量存储在栈中而成员变量存储在堆中,所以在运行时就不用再去堆中找成员变量了,直接使用栈中的副本能够节省较多的时间;所以在访问成员变量时既可以手动复制一个副本也可以在运行时让JVM自动优化。

相关推荐
十月的皮皮9 分钟前
C语言学习笔记202606008- 三角形判断(3种方法)
c语言·笔记·学习
XGeFei10 分钟前
【Fastapi学习笔记(6)】—— Fastapi文件上传、请求头自动转换
笔记·学习·fastapi
程序员晨曦11 分钟前
Java 并发修仙传:ThreadLocal 从“闭关修炼”到“走火入魔”的救赎之路
java·开发语言
AIGS00113 分钟前
探索向量空间JBoltAI:工业企业数智化升级的基础设施
java·人工智能·人工智能ai大模型应用
一口吃俩胖子23 分钟前
【脉宽调制DCDC功率变换学习笔记024】频域性能
笔记·学习
吃着火锅x唱着歌24 分钟前
深度探索C++对象模型 学习笔记 第五章 构造、解构、拷贝语意学(2)
c++·笔记·学习
zhangjw3435 分钟前
第18篇:Java网络编程零基础详解,IP、端口、TCP、UDP、Socket通信、实战文件传输
java·网络·tcp/ip
中小企业实战军师刘孙亮36 分钟前
快消纺织五金怎么融合?三大业态协同发展战略思路-佛山鼎策创局破局增长咨询
学习·面试·创业创新·制造·学习方法
我命由我1234537 分钟前
Java 开发 - Jar 包与 War 包
java·开发语言·java-ee·intellij-idea·jar·idea·intellij idea
Upsy-Daisy41 分钟前
Hermes Agent 学习笔记 04:工具调用系统,让 Agent 从“会说”变成“会做”
java·笔记·学习