面试题答案
一键面试即时编译(JIT)基本原理
- 热点代码识别:JVM 采用“热点代码探测”技术,通过计数器统计方法调用次数、循环执行次数等,找出执行频繁的“热点代码”。例如一个被多次调用的方法或者循环体中的代码。
- 编译:当热点代码的热度达到一定阈值,JIT 编译器将其编译为本地机器码。编译过程中会进行优化,如方法内联(将被调用的方法代码嵌入到调用处,减少方法调用开销)、逃逸分析(判断对象是否会在方法外部被访问,若不会则可进行优化,如栈上分配等)等。
- 缓存与替换:编译后的本地机器码会被缓存起来,下次执行到相同热点代码时,直接执行本地机器码,而不再通过解释器解释执行,大大提高执行效率。随着程序运行,若热点代码热度下降,相关的本地机器码缓存可能会被回收。
JIT编译与解释执行的区别
- 执行方式
- 解释执行:解释器逐行读取字节码,将其翻译为机器码并立即执行。就像实时翻译,一句一句地处理,无需等待整个程序全部翻译完。
- JIT编译:先识别热点代码,然后将热点代码编译成机器码缓存起来,后续执行直接运行编译后的机器码。类似于将常用内容预先翻译好,下次直接使用。
- 启动速度与运行效率
- 解释执行:启动速度快,因为无需等待编译过程。但对于热点代码,由于每次都要解释,执行效率相对较低。
- JIT编译:启动时因为需要时间识别热点代码并编译,启动速度相对较慢。但对于热点代码,一旦编译完成,后续执行效率高,随着热点代码执行次数增多,整体性能提升明显。
- 资源占用
- 解释执行:内存占用小,因为不需要额外存储编译后的机器码。但由于每次都要翻译执行,运行时可能需要更多的 CPU 资源用于翻译过程。
- JIT编译:编译过程需要占用一定的 CPU 资源。编译后的机器码缓存会占用额外的内存空间,但运行时 CPU 负担相对较小,尤其是对于热点代码的多次执行。