本篇主要针对Java虚拟机的晚期编译优化,Java内存模型与线程,线程安全与锁优化进行总结,其余部分总结请点击Java虚拟总结上篇 ,Java虚拟机总结篇。
本篇主要针对Java虚拟机的晚期编译优化,Java内存模型与线程,线程安全与锁优化进行总结,其余部分总结请点击Java虚拟总结上篇 ,Java虚拟机总结篇。
< div> 一.晚期运行期优化 即时编译器JIT的作用就是热点代码转换为平台相关的机器码,并进行优化,它并不是一个虚拟机所必须的部分,只能说有它是锦上添花。 热点代码 热点代码分类 被多次调用的方法 被多次调用的循环体 热点探测判定方法 ·基于采样的热点探测,虚拟机周期性地检查栈顶,发现某个方法经常出现在栈顶,那么这个方法就是热点方法,简单高效但不精确 基于计数器热点探测,为每个方法建立计数器来统计执行次数,超过阈值就是热点方法,Hotpot就是采用这种方法。分为方法计数器(统计方法),回边计数器(统计循环) 编译过程(Client Complier) 第一阶段:将字节码构造成高级中间代码表示(HIR) 第二阶段:将HIR变为LIR 第三阶段:使用线性扫描算法,在LIR上分配寄存器,产生机器代码 优化方法 公共子表达式优化 当一个表达式A的结果已经计算过了,且A中的所有变量都没有发生过变化,那么下一次要用到A时就不用计算了,而是直接取之前A的结果。 数组边界检查消除 方法内联 逃逸分析 逃逸的定义:一个在方法里定义的变量,作为参数传递给其他方法(方法逃逸),或者赋值给类变量(线程逃逸)。 优化方法: 栈上分配:不会逃逸的对象就不在堆上分配了,就在栈上分配,那么对象所占的 空间就可以随栈帧的出栈而销毁,减少垃圾收集系统的压力。 同步消除:如果一个变量肯定不会逃逸出线程,那么关于这个变量的同步措施就可以去掉。