文章收录在网站:http://hardyfish.top/
文章收录在网站:http://hardyfish.top/
文章收录在网站:http://hardyfish.top/
文章收录在网站:http://hardyfish.top/
即时编译
Java编译器经过解释执行,其执行速度必然会比直接执行可执行的二进制字节码慢很多。
- 为了解决这种效率问题,引入了 JIT(Just In Time ,即时编译) 技术。
当JVM发现某个方法或代码块运行特别频繁的时候,就会认为这是热点代码:
- JIT会把部分热点代码翻译成本地机器相关的机器码,并进行优化,然后再把翻译后的机器码缓存起来,以备下次使用。
热点检测
目前主要的热点代码识别方式是热点探测,HotSpot虚拟机中采用的主要是基于计数器的热点探测。
采用这种方法的虚拟机会为每个方法,甚至是代码块建立计数器,统计方法的执行次数。
某个方法超过阀值就认为是热点方法,触发JIT编译。
编译优化
JIT在做了热点检测识别出热点代码后,除了会对其字节码进行缓存,还会对代码做各种优化。
- 逃逸分析,锁消除,锁膨胀,方法内联等。
逃逸分析
当一个对象在方法中被定义后,它可能被外部方法所引用,例如作为调用参数传递到其他地方中,称为方法逃逸。
有了逃逸分析,可以判断出一个方法中的变量是否有可能被其他线程所访问或者改变,基于这个特性,JIT做了一些优化:
- 标量替换,栈上分配
通过逃逸分析,Hotspot编译器能够分析出一个新的对象的引用的使用范围从而决定是否要将这个对象分配到堆上。
标量替换
如果经过逃逸分析,发现一个对象不会被外界访问,经过JIT优化,就会把这个对象拆解成若干个其中包含的若干个成员变量来代替。
栈上分配
经过逃逸分析技术发现这个对象并没有被外部引用且仅在当前线程使用,那么它就会将该对象分配在栈上。
锁消除
逃逸分析某些没有被外部方法或者其他线程引用的情况下,会将某些锁消除。
方法内联
对于可以内联的方法,直接复制到调用者代码中,减少方法调用次数和性能消耗。