[讨论] JAVA jit 预热 何解
xgj1988
2011-04-27
JAVA jit 预热 是什么意思呢?
我记得看过测试JIT速度的一个代码,开始一个for循环,然后里面没做什么。只是作者写了个那段代码是JIT预热,,但是是怎么回事没讲,而且后面有人也提问了,作者也没回答。希望这个问题能重现一下。 |
|
RednaxelaFX
2011-04-27
能找出原本那段代码么?可以针对具体代码来讨论。
没有具体例子的话讨论就空泛了。不过可以把机会留给IcyFenix再来宣传一下他的书里11.2.2 编译对象与触发条件的内容 ^_^ 我以前做分享用的演示稿里也有提到相关的内容,199-202页 |
|
IcyFenix
2011-04-27
嗯,其实我觉得LZ应该首先搞清楚JIT是什么,用来做什么,之后再来看看什么时候即时编译器会做这些事情。
撒迦提到的那节,我截取一部分关于方法编译的,OSR编译的算起来复杂一些就没有截了。 引用 要知道一段代码是不是热点代码,是不是需要触发即时编译,这个行为称为热点探测(Hot Spot Detection),其实进行热点探测并不一定要知道方法具体被调用了多少次,目前主要的热点探测判定方式有两种 ,分别是:
基于采样的热点探测(Sample Based Hot Spot Detection):采用这种方法的虚拟机会周期性地检查各个线程的栈顶,如果发现某个(或某些)方法经常出现在栈顶,那这个方法就是“热点方法”。基于采样的热点探测的好处是实现简单高效,还可以很容易地获取方法调用关系(将调用堆栈展开即可),缺点是很难精确地确认一个方法的热度,容易因为受到线程阻塞或别的外界因素的影响而扰乱热点探测。 基于计数器的热点探测(Counter Based Hot Spot Detection):采用这种方法的虚拟机会为每个方法(甚至是代码块)建立计数器,统计方法的执行次数,如果执行次数超过一定的阈值就认为它是“热点方法”。这种统计方法实现起来麻烦一些,需要为每个方法建立并维护计数器,而且不能直接获取到方法的调用关系。但是它的统计结果相对来说更加精确严谨。 在HotSpot虚拟机中使用的是第二种——基于计数器的热点探测方法,因此它为每个方法准备了两个计数器:方法调用计数器(Invocation Counter)和回边计数器(Back Edge Counter)。 在确定虚拟机运行参数的前提下,这两个计数器都有一个确定的阈值,当计数器超过阈值溢出了,就会触发JIT编译。 我们首先来看看方法调用计数器。顾名思义,这个计数器就是用于统计方法被调用的次数,它的默认阈值在Client模式下是1500次,在Server模式下是10000次,这个阈值可以通过虚拟机参数-XX:CompileThreshold来人工设定。当一个方法被调用时,会先检查该方法是否存在被JIT编译过的版本,如果存在,则优先使用编译后的本地代码来执行。如果不存在已被编译过的版本,则将此方法的调用计数器值加1,然后判断方法调用计数器与回边计数器值之和是否超过方法调用计数器的阈值。如果已超过阈值的话,将会向即时编译器提交一个该方法的代码编译请求。 |
|
xgj1988
2011-04-27
RednaxelaFX 写道 能找出原本那段代码么?可以针对具体代码来讨论。
没有具体例子的话讨论就空泛了。不过可以把机会留给IcyFenix再来宣传一下他的书里11.2.2 编译对象与触发条件的内容 ^_^ 我以前做分享用的演示稿里也有提到相关的内容,199-202页 呵呵,RednaxelaFX 你用的什么工具画的图?感觉还可以。 |
|
RednaxelaFX
2011-04-28
啊,除了有两张动画我是用Fireworks画的之外,其它都是直接用PowerPoint画的。别笑我土orz
|
|
xgj1988
2011-04-28
:cry: 我以为用的一些专业工具画的呢。
|
|
xgj1988
2011-04-28
IcyFenix 写得有书。不知道教什么名字。
|
|
RednaxelaFX
2011-04-28
|