问题
为什么说Java程序运行时间越久,执行效率越高?
jvm的执行策略
现在大多数开发环境中都是用是HotSpot虚拟机,而HotSpot虚拟机的默认执行策略是混合式模式的。也就是解释执行和编译执行一起工作。
这个我们可以通过在终端输入以下指令来查看(笔者使用的是jdk1.8):
java -version
控制台输出为:
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)
其中mixed mode
就代表的混合执行策略。
JVM解释执行
虚拟机将编译好的字节码一行一行地翻译为对应平台的机器码执行顺序执行。代码没有优化,需要花费额外的解释时间,执行速度较慢
JVM编译执行
虚拟机以方法为单位,将所属字节码一次性翻译为机器码后执行,代码经过虚拟机优化,执行速度块
JIT即时编译器
JIT: Just-In-Time Compiler
Hot-Spot虚拟机采用即时编译器,会将字节码中热点代码编译成本地机器码,提高执行速度
热点代码
包括两种:
- 频繁调用的方法
- 多次执行的循环体
热点代码检测机制
- 采样:定期检查所有线程jvm栈的栈顶方法
- 计数器:每个方法都持有一个计数器,调用一次则累加一次
- 基于踪迹热点探测的检测机制(Dalvik虚拟机)
解释
由于JVM的混合执行机制,在程序运行的时间够久以后,频繁调用的方法都被编译成了本地机器码,调用效率自然就变高了。
但是需要注意的是,应用占用的内存也会升高。