java-运行期优化

由于编译执行会占用用户程序的执行时间,所以如果想让程序快速的执行,那么使用解释执行。

在虚拟机默认混合模式下面,程序刚开始的时候都是解释执行,会将一些热点代码进行编译执行,

生成本地机器码。下次执行热点代码的时候,直接编译执行机器码,缩短程序执行时间。

JVM通过计数器进行计数,当代码执行的次数超过阈值的时候,会向编译器提交编译的请求。

程序不会等待编译器编译执行完毕,而是继续以解释执行的方式执行。之后,如果编译执行完毕,下次程序执行的时候,会去执行编译执行生成的机器码。

热点代码一般是方法和循环体。循环体一般是指的是方法中的循环执行的代码。

方法一般使用方法计数器计数,循环体一般使用回边计数器计数。

jvm执行方法或者循环体的时候,会根据方法计数器和回边计数器的值的和和阈值进行大小的比较,如果超过则向编译器提交编译请求.

方法计数器在在一定的时间,进行次数值的衰减,程序半衰期.方法计数器才有半衰期的概念,使用的不是方法调用的绝对次数,是一定的时间内方法调用的次数,

而回表计数器没有半衰期的概念,则他是根据循环体执行的绝对次数进行判断.

编译器分为两种,Client Complier 编译速度比较快,但是没办法加入全局的监控,信息的收集等,质量没有 Server Complier 编译器的产生的机器码质量高。

Client Complier 即时C1编译器 Server Complier即时 C2编译器

方法计数器触发的编译请求:

回边计数器触发的编译请求,即方法内部的循环体

原文地址:https://www.cnblogs.com/histlyb/p/10528369.html