-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更早