编译器优化,运行时优化
读深入理解JAVA虚拟机 第十,十一章,记一下内容编译器优化,运行时优化虚拟机设计团队把对性能的优化集中到了后端的即时编译器中,这个可以让那些不是由javac产生的class文件有(比如其他语言编译的class文件)也享受到编译器优化带来的好处。但是javac做了许多针对java语言编码过程的优化措施,来改善程序员的编码风格和提高编码效率,相当多的新生的java语法特性,都是靠编译器通...
读深入理解JAVA虚拟机 第十,十一章,记一下内容
编译器优化,运行时优化
虚拟机设计团队把对性能的优化集中到了后端的即时编译器中,这个可以让那些不是由javac产生的class文件有(比如其他语言编译的class文件)也享受到编译器优化带来的好处。
但是javac做了许多针对java语言编码过程的优化措施,来改善程序员的编码风格和提高编码效率,相当多的新生的java语法特性,都是靠编译器通过“语法糖”实现,而不是虚拟机底层改进来支持。
javac编译器由java语言实现
语义分析与字节码生成过程中:
常量折叠
在编译期间,在进行标注检查的时候,有一个重要的动作叫做常量折叠,比如
int a= 1+2;
//会直接在语法树上变成
int a = 3;
所以在代码里写a =1+2,不会比a =3在运行期增加任何的运算量
数据及控制流分析
局部变量final
局部变量的final类型,编译后,在class文件中是看不见final类型修饰符的,和不带final修饰符的局部变量,在class文件中是没有区别的
通过控制流分析flow()方法,来保证不会去改变带final字段的值,以及保证其他的赋值,返回值,各种if else路径流程的控制
语法糖
语法糖:对程序功能本身没有影响,但是能够增加程序的可读性,
比如java中的泛型,变长参数,自动装箱/拆箱,在虚拟机运行时是不支持这些语法的,他们在编译阶段被还原回简单的基础语法结构。这个过程叫做解语法糖
字节码生成
javac编译的最后一个阶段,把之前的语法树,符号表转化成字节码写到磁盘中,同时进行少量的代码优化工作
比如添加实例构造器()和类构造器();
比如字符串加号操作替换成stringBuffer或StringBuilder(取决于目标代码版本是否大于或等于JDK1.5)的append操作。
语法糖:
条件编译:
if(true){
123...
}else{
456...
}
针对这段代码,编译的时候会自动做优化,把不可达的else部分去掉,class文件中就变成只保留了“123…”的部分,连if(true)都去掉了。
根据布尔值的真假,编译器把分支中不成立的代码块消除掉。归属于解语法糖阶段。
其他的语法糖比如:泛型,自动装箱,自动拆箱,遍历循环,变长参数,条件编译,以及内部类,枚举类,断言语句,(jdk1.7以后的)对枚举和字符串的switch支持,try语句中定义和关闭资源等
运行期优化
方法内联
//以下是.java中的方法a和b
public void a(){
aa....
b();
}
public void b(){
bb....
}
//在运行时进行内联,变成下面的写法,并且会消除一些无用的行,做优化等等
public void a(){
aa....
bb....
}
更多推荐
所有评论(0)