1将字节码指令解释/编译为对应平台上的本地机器指令。
|------->win jvm
Java程序--编译-->字节码文件----执行引擎(在虚拟机上翻译)--------->linux jvm
|------->mac jvm
2java代码编译和执行过程:
橙色部分(前端编译)和jvm无关,是前端编译器。字节码是一种中间状态的二进制文件(实现跨平台)。
6解释器对字节码采用逐行解释方式执行,JIT编译器:jvm将源代码直接编译成和本地机器平台相关的机器语言。既可以解释也可以编译执行。
8、高级语言----汇编语言----机器语言
9、解释器比较低效,而即时编译器可以避免函数被解释执行,将整个函数体编译成为机器码,每次函数执行之后只执行编译后的机器码即可。
10、取长补短:JIT(即时编译器)比解释器执行速度快。保留解释器,解释器响应速度快,省去编译时间。但jit需要把代码编译成本地代码,这需要一定时间。(hotspot)在看重启动时间的场景会需要两者搭配,而像服务端应用就不需要,一般只保留解释器。
JIT编译器
前端编译器(javac):.java--->.class;后端编译器(JIT):字节码---->机器码;静态提前编译器(AOT):.java--->机器码。
计数器探测热点代码的调用次数,Client(c1)模式阈值是1500次,Server(c2)模式下是10000次,超过阈值,JIT编译就触发。
JIT编译出来的机器码性能比解释器要高,c2启动时长比c1慢,系统稳定执行之后,c2执行速度远远快于c1.
即时编译:在程序运行的当中,将字节码转换为可在硬件上直接运行的机器码。
AOT:在程序运行之前,将字节码转换为机器码的过程。减少编译器预热,第一次运行快。