我正在运行一个启用了ReservedCodeCacheSize=128M和UseCodeCacheFlushing的OracleJava8JVM(服务器,而不是客户机或嵌入式)。几天后,Codecache迅速下降,从93%满到80%满。我想我看到了一个Codecache冲水,但令人惊讶的是,冲洗后大小接近100%满,而不是50%满。
JVM如何决定要刷新多少Codecache?
此Oracle Java 8页描述了该选项,但没有量化已刷新的Codecache:
在关闭编译器之前启用代码缓存的刷新。默认情况下启用此选项。若要在关闭编译器之前禁用代码缓存的刷新,请指定-XX:-UseCodeCacheFlushing。
有一个JVM选项UseCodeCacheFlushing可以用来控制Codecache的刷新。启用此选项后,JVM调用一个紧急刷新,丢弃了编译后的代码(Nmethods)的旧一半,以使CodeCache中的空间可用。
可以想象,编译后的代码的前半部分只占整个Codecache的20%,但另一个可能的解释是上面的博客文章是不准确的。
发布于 2016-07-04 03:41:32
“老一半”并不意味着所有方法的50%。用于扫描编译代码的HotSpot逻辑有点复杂;最好的解释是它的源代码,但我将在下面给出一个简短的总结。
如果至少满足下列条件之一,则调用该清扫器:
ReservedCodeCacheSize的1%以上)。当清理程序运行时,它总是释放所有僵尸方法,即卸载、去优化或重新编译没有激活的方法。
此外,如果启用了UseCodeCacheFlushing,就会释放足够冷的活动方法。冷处理方法确定如下:
2 * (ReservedCodeCacheSize / 1MB)。-XX:NmethodSweepActivity选项(默认情况下为10)。越大的is NmethodSweepActivity和越小的is码缓存空闲率越大,编译的方法就越容易被清除。这里是公式。因此,没有确切的数字,有多少编译的方法被清理。这是在运行时计算的,取决于保留的代码缓存大小、空闲空间的数量、僵尸方法的数量、冷方法的数量以及像NmethodSweepActivity这样的JIT人机工程学选项。
https://stackoverflow.com/questions/38173592
复制相似问题