第十章 前端编译与优化
10.2 Javac编译器
10.3.1 泛型 类型擦除
10.3.2 自动装箱、拆箱与遍历循环
10.3.3 条件编译(ifelse)
第十一章 后端编译与优化
11.2 即时编译器
11.2.1 解释器与编译器
程序需要迅速启动和执行时,解释器先发挥作用,立即运行。随着时间的推移,编译器发挥作用,把越来越多的代码编译成本地代码,提高执行效率。当环境对内存的限制较大,使用解释器节约内存,反之,使用编译器可以提高效率。
HotSpot内置了两个(或三个)编译器,其中两个是客户端编译器C1、服务端编译器C2,第三个在JDK10出现,Graal编译器,长期目标时取代C2。
11.2.2 编译对象与触发条件
在运行过程中会被即时编译器编译的目标是“热点代码”,主要包括两类:被多次调用的代码;被多次执行的循环体
对于“多次”的定量:
要知道某段代码是不是“热点代码”,需要执行热点检测,方法有两种:基于采样的热点检测;基于计数器的热点检测。
基于采样就是周期检查栈顶,如果某个方法经常出现在栈顶,即使热点方法;
基于方法的就是维护计数器,HotSpot使用计数器;
两种计数器:方法调用计数器(针对方法)、回边计数器(针对循环体)
方法计数器:在客户端模式下,默认1500次;在服务端模式下,默认10000次。
回边计数器在客户端模式下,默认13995次;在服务端模式下,默认10700次。