读深入理解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....
}
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐