Java编译执行过程
解释器和及时编译器
Java代码的执行可分为编译期和执行期:Java通过前端编译器将Java源代码编译为字节码,再通过解释器执行字节码,并通过及时编译器检测和编译热点代码提高执行效率。
- 前端编译器:javac就是前端编译器,可以将Java文件编译为字节码文件。
- 解释器:解释器是一行一行的将字节码解析为机器码,解释到哪里就执行到哪里。解释器可以快速启动,省去编译时间,立即执行。
- 及时编译器:即(Just In-Time compiler)JIT,已方法为单位,将热点代码的字节码一次性转为机器码,并缓存在本地,避免了解释器逐行解释执行的效率问题。
热点代码检测:
- 方法计数器:监测方法执行频率;
- 循环计数器:检测循环执行频率。
-Xmixed -Xint -Xcomp
- -Xmixed:混合模式执行,为默认模式,开始解释执行,启动速度较快,对热点代码实行检测和编译。
- -Xint:仅解释模式执行,启动很快,执行稍慢。
- -Xcomp:仅编译模式执行,执行很快,启动很慢。
测试代码
public class Demo {
public static void main(String[] args) {
for (int i = 0; i < 10_0000; i++) {
test();
}
long start = System.currentTimeMillis();
for (int i = 0; i < 10_0000; i++) {
test();
}
long end = System.currentTimeMillis();
System.out.println("耗时:" + (end - start));
}
public static void test() {
for (long i = 0; i < 10_0000L; i++) {
long j = i % 3;
}
}
}
测试 -Xmixed 混合模式
执行多次依次输出:
耗时:2185
耗时:2184
耗时:2184
测试 -Xint 仅解释模式
执行多次依次输出:
耗时:159085
耗时:159064
测试 -Xcomp 仅编译模式
执行多次依次输出:
耗时:2187
耗时:2191
耗时:2186
|