1. java程序的编译和解释运行的原理:
- 解释器:当 jvm 启动时会根据预定义的规范对字节码采用逐行解释的方式执行,将每条字节码文件中的内容翻译成对应平台的本地机器指令执行
- JIT:JVM 将源代码直接编译成和本地机器平台相关的机器语言
2. jvm 解释器与jit 各自的优劣:
优势 | 劣势 | |
解释器 |
1.当程序启动后,解释器可以马上发挥作用,省去编译的时间,立即实行 2.解释执行在进行激进优化不成立时,作为编译期的后备选项 |
字节码逐行解释执行,执行效率不如jit |
jit | 编译为本地代码后执行效率高 | jit想要发挥作用,把代码编译成本地代码,需要一定的时间。 |
总结 | 当虚拟机启动时,解释器可以首先发挥作用,而不必等待即时编译器全部编译完成再执行,这样可以省去许多不必要的编译时间。并随着程序运行时间的推移,即时编译器逐渐发挥作用,根据热点探测功能,将有价值的字节码编译为本地机器指令,以换取更高的程序执行效率 |
3. 热点探测确定何时 jit:HotSpot 会为每个方法建立两个计数器,分别为方法调用计数器和回边计数器
- 方法调用计数器:用于统计方法的调用次数
- 回边计数器:用于统计循环体执行的循环次数
- 计数器计数次数可以用 -XX:CompileThreshold 来人为设定,默认为 10000
4. 解释器与 jit 使用的命令设置:
- -Xint:完全采用解释器模式执行
- -XComp:完全采用 jit 模式执行,若 jit 出现问题,解释器会介入执行
- -Xmixed:采用解释器+ jit 混合共同执行