详解Java执行引擎
执行引擎时Java虚拟机核心组成部分之一,任务就是将字节码指令解释/编译为对于平台的本地机器指令才可以,这里的编译需要与java程序编译成字节码文件区分
Java代码编译和执行的过程
- 橙色部分由javac实现,生成字节码文件。
- 绿色为解释的过程,逐行翻译执行
- 蓝色为编译的过程,编译成机器指令后,直接执行机器指令
解释器:当虚拟机启动时会根据预定义的规范对字节码采用逐行解释的方式执行,将每条字节码文件中的内容翻译为本地机器的指令直接执行
JIT(Just In Time Compiler):将源代码直接编译成和本地机器相关的机器语言
以上两种就代表了绿色和蓝色的流程,这就解释了为什么Java是半编译半解释型语言
为什么编译快,因为执行到相同方法时,解释器也是逐条翻译执行,而编译直接使用该方法缓存的机器指令,避免了重复翻译的过程,相当于代码运行缓存了!
下图可以看出编译和解释的区别
HotSpot采用解释器与即时编译器并存的架构
解释器很慢,为什么还要保留它呢?
- 程序启动时,解释器能马上发挥作用,省去编译的时间,编译器得先编译成本地代码,才能发挥作用
- HotSpot的做法,程序运行后,解释器首先发挥作用,而不必等即时编译器全部编译后再执行,省去编译时间,随着程序的运行,即时编译器逐渐发挥作用,根据热点探测功能,将有价值的字节码编译成本地机器指令,加快效率
- 解释执行在编译器进行激进优化不成立时,可以作为编译器的“逃生门”
JIT热点代码和探测方法
热点代码探测
JVM会对执行频率高的代码进行JIT编译,存储在Code Cache中。
热度衰减
如果不做任何设置,方法计数器并不是方法的绝对次数,而是一个相对频率,超过一定时间就次数减半(即计数器有半衰期),
进行热度衰减的动作是虚拟机进行垃圾回收时顺便进行的,
-XX:-UseCounterDecay来关闭半衰期,-XX:CounterHalfLifeTime设置半衰期时间,单位秒
ecay来关闭半衰期,-XX:CounterHalfLifeTime设置半衰期时间,单位秒
版权声明:本文为lzh804121985原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。