首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle JVM 8:启用Codecache刷新时,刷新量是多少?

Oracle JVM 8:启用Codecache刷新时,刷新量是多少?
EN

Stack Overflow用户
提问于 2016-07-03 19:26:22
回答 1查看 3K关注 0票数 2

我正在运行一个启用了ReservedCodeCacheSize=128M和UseCodeCacheFlushing的OracleJava8JVM(服务器,而不是客户机或嵌入式)。几天后,Codecache迅速下降,从93%满到80%满。我想我看到了一个Codecache冲水,但令人惊讶的是,冲洗后大小接近100%满,而不是50%满。

JVM如何决定要刷新多少Codecache?

此Oracle Java 8页描述了该选项,但没有量化已刷新的Codecache:

在关闭编译器之前启用代码缓存的刷新。默认情况下启用此选项。若要在关闭编译器之前禁用代码缓存的刷新,请指定-XX:-UseCodeCacheFlushing。

这篇Oracle博客文章说,

有一个JVM选项UseCodeCacheFlushing可以用来控制Codecache的刷新。启用此选项后,JVM调用一个紧急刷新,丢弃了编译后的代码(Nmethods)的旧一半,以使CodeCache中的空间可用。

可以想象,编译后的代码的前半部分只占整个Codecache的20%,但另一个可能的解释是上面的博客文章是不准确的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-04 03:41:32

“老一半”并不意味着所有方法的50%。用于扫描编译代码的HotSpot逻辑有点复杂;最好的解释是它的源代码,但我将在下面给出一个简短的总结。

如果至少满足下列条件之一,则调用该清扫器:

  1. 代码缓存已经满了。
  2. 自上次扫描以来,有足够的状态变化(JDK 8将“足够”度量为ReservedCodeCacheSize的1%以上)。
  3. 自上次扫荡以来,一定的间隔已经过去了。代码缓存中可用的空间越多,调用扫频程序的频率就越低。确切的公式是这里

当清理程序运行时,它总是释放所有僵尸方法,即卸载、去优化或重新编译没有激活的方法。

此外,如果启用了UseCodeCacheFlushing,就会释放足够冷的活动方法。冷处理方法确定如下:

  • 在每个safepoint上,具有活动堆栈帧的nmethods的热计数器被重置为默认值。默认的热度值是2 * (ReservedCodeCacheSize / 1MB)
  • 每次清洗机运行时,它都会将活跃方法的热计数器降低1。
  • 如果热计数器小于计算阈值,则释放nmethod。阈值取决于代码缓存空闲比率和-XX:NmethodSweepActivity选项(默认情况下为10)。越大的is NmethodSweepActivity和越小的is码缓存空闲率越大,编译的方法就越容易被清除。这里是公式。

因此,没有确切的数字,有多少编译的方法被清理。这是在运行时计算的,取决于保留的代码缓存大小、空闲空间的数量、僵尸方法的数量、冷方法的数量以及像NmethodSweepActivity这样的JIT人机工程学选项。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38173592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档