java热点代码 java热点代码分析( 四 )


HotSpot虚拟机中内置了两个JIT编译器:Client Complier和Server Complier,分别用在客户端和服务端,目前主流的HotSpot虚拟机中默认是采用解释器与其中一个编译器直接配合的方式工作 。
运行过程中会被即时编译器编译的“热点代码”有两类:
被多次调用的方法 。
被多次调用的循环体 。
两种情况,编译器都是以整个方法作为编译对象,这种编译也是虚拟机中标准的编译方式 。要知道一段代码或方法是不是热点代码,是不是需要触发即时编译,需要进行Hot Spot Detection(热点探测) 。目前主要的热点 判定方式有以下两种:
基于采样的热点探测:采用这种方法的虚拟机会周期性地检查各个线程的栈顶,如果发现某些方法经常出现在栈顶,那这段方法代码就是“热点代码” 。这种探测方法的好处是实现简单高效,还可以很容易地获取方法调用关系,缺点是很难精确地确认一个方法的热度,容易因为受到线程阻塞或别的外界因素的影响而扰乱热点探测 。
基于计数器的热点探测:采用这种方法的虚拟机会为每个方法,甚至是代码块建立计数器,统计方法的执行次数,如果执行次数超过一定的阀值,就认为它是“热点方法” 。这种统计方法实现复杂一些,需要为每个方法建立并维护计数器 , 而且不能直接获取到方法的调用关系,但是它的统计结果相对更加精确严谨 。
在HotSpot虚拟机中使用的是第二种——基于计数器的热点探测方法,因此它为每个方法准备了两个计数器:方法调用计数器和回边计数器 。
方法调用计数器用来统计方法调用的次数 , 在默认设置下,方法调用计数器统计的并不是方法被调用的绝对次数 , 而是一个相对的执行频率,即一段时间内方法被调用的次数 。
回边计数器用于统计一个方法中循环体代码执行的次数(准确地说,应该是回边的次数,因为并非所有的循环都是回边),在字节码中遇到控制流向后跳转的指令就称为“回边” 。
在确定虚拟机运行参数的前提下,这两个计数器都有一个确定的阀值,当计数器的值超过了阀值,就会触发JIT编译 。触发了JIT编译后 , 在默认设置下,执行引擎并不会同步等待编译请求完成,而是继续进入解释器按照解释方式执行字节码,直到提交的请求被编译器编译完成为止(编译工作在后台线程中进行) 。当编译工作完成后,下一次调用该方法或代码时 , 就会使用已编译的版本 。
由于方法计数器触发即时编译的过程与回边计数器触发即时编译的过程类似 , 因此这里仅给出方法调用计数器触发即时编译的流程:
java中方法的内联是怎么回事Java编译器会对编译的类进行类继承关系分析java热点代码,当确认class A的方法get只有一个版本(不是抽象方法也没有重写java热点代码,java热点代码我是直接定义final达到此效果)java热点代码,就会进行方法内联编译优化 。
属于Java虚拟机的运行优化java热点代码,System.out.println(i);,应该属于热点代码,虚拟机可能会将这个代码编译本地代码来执行 。
关于java热点代码和java热点代码分析的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

推荐阅读