由于编译执行会占用用户程序的执行时间, 所以如果想让程序快速的执行, 那么使用解释执行.
在虚拟机默认混合模式下面, 程序刚开始的时候都是解释执行, 会将一些热点代码进行编译执行,
生成本地机器码. 下次执行热点代码的时候, 直接编译执行机器码, 缩短程序执行时间.
JVM 通过计数器进行计数, 当代码执行的次数超过阈值的时候, 会向编译器提交编译的请求.
程序不会等待编译器编译执行完毕, 而是继续以解释执行的方式执行. 之后, 如果编译执行完毕, 下次程序执行的时候, 会去执行编译执行生成的机器码.
热点代码一般是方法和循环体. 循环体一般是指的是方法中的循环执行的代码.
方法一般使用方法计数器计数, 循环体一般使用回边计数器计数.
jvm 执行方法或者循环体的时候, 会根据方法计数器和回边计数器的值的和和阈值进行大小的比较, 如果超过则向编译器提交编译请求.
方法计数器在在一定的时间, 进行次数值的衰减, 程序半衰期. 方法计数器才有半衰期的概念, 使用的不是方法调用的绝对次数, 是一定的时间内方法调用的次数,
而回表计数器没有半衰期的概念, 则他是根据循环体执行的绝对次数进行判断.
编译器分为两种, 即 Client Complier 编译速度比较快, 但是没办法加入全局的监控, 信息的收集等, 质量没有 Server Complier 编译器的产生的机器码质量高.
Client Complier 即时 C1 编译器 Server Complier 即时 C2 编译器.
方法计数器触发的编译请求:
回边计数器触发的编译请求, 即方法内部的循环体
来源: http://www.bubuko.com/infodetail-2986684.html