JIT 编译器 2

-XX:ReservedCodeCacheSize=1024m 可以帮助设置JIT编译的本地代码的最大容量

你可以简单的改大这个值以获取更多的本地代码空间, 不过内存始终是一种有限资源, 也可以通过编译阀值来控制编译行为

影响编译阀值的最主要因素是代码的执行频率,一旦执行达到了一定次数,就达到了编译阀值,编译器就可以获取足够的信息然后编译代码了

jvm通过两种值来确定代码的执行频率的

1. 方法调用计数器, 也就是方法被调用了多少次

2. 方法中的循环回边计数器, 也就是方法中的for或者while的运行次数, 全部循环结束或者continue都算做完整的循环回边

如果一段代码达到了编译条件, 就会被送进编译队列.

但是还有一种极端情况例如while(true), 这种循环永远不会退出, jvm会在其不中断运行的情况下直接stack上的代码(On-Stack Replacement, OSR)

普通的编译触发可以通过-XX:CompileThreshold=N修改, client的默认值是1500, server的默认值是10000

OSR的阀值不同由公式

OSR trigger = ( Compilethreshold * ( (OnstackReplacePercentage – InterpreterProfilePercentage)/100 ) ) 来确定

client                                  1500             *  ( (                    933                            –                      33           ) / 100 ))    =   13500

server                                1000             *  ( (                    140                            –                      33           ) / 100 ))    =   10700

可以看到client模式对于方法而言进入编译期更早

而server模式对于循环回边而言, 进入OSR更早