是什么?
Java在执行过程中包含解释器和编译器(JVM规范并没有规定必须包含编译器,但是通常会作为一个评判JVM好坏的标准);
解释器:将class文件解析执行;
编译器:将class文件编译成为字节码,提高底层执行效率;
JIT内置了两个即时编译器C1(Client)和C2(Server),两个工作模式不太一样,默认会根据机器硬件来进行选择,但是也可以通过手工配置(-client或-server);
为了达到启动响应时间和运行效率的平衡,出现了分层编译:
0层:没有编译;
1层:C1编译,将字节码编译为本地代码;
2层:C2编译,将字节码编译为本地代码,同时加入一些优化和性能监控;
编译谁?
热点代码
热点代码怎么检测?
- 计数
- 采样
- 踪迹
计数热点代码统计
方法调用计数器(Client 1500次,Server 10000次),计数器不仅会增加,还会衰减;
回边计数器,执行到"}"才计数(Client 13995,Server 10700次);
编译过程
同步编译:编译完成后才返回执行结果
异步编译:后台编译;
两种不同编译器
- Client Compiler:关注局部性能优化,过程(class->高级中间代码->低级中间代码->机器代码);
- Server Compiler:关注全局,会优化,比较慢