gpt4 book ai didi

java - Oracle JVM 8 : when Codecache flushing is enabled, 刷新了多少?

转载 作者:行者123 更新时间:2023-12-01 16:52:05 25 4
gpt4 key购买 nike

我正在运行 Oracle Java 8 JVM(服务器,不是客户端或嵌入式),并且启用了 ReserveCodeCacheSize=128M 并启用了 UseCodeCacheFlushing。几天后,Codecache 的利用率从 93% 快速下降到 80%。我假设我目睹了 Codecache 刷新,但令人惊讶的是刷新后的大小更接近 100% 已满而不是 50% 已满。

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

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

Enables flushing of the code cache before shutting down the compiler. This option is enabled by default. To disable flushing of the code cache before shutting down the compiler, specify -XX:-UseCodeCacheFlushing.

This Oracle blog post说,

There is a JVM option UseCodeCacheFlushing that can be used to control the flushing of the Codecache. With this option enabled JVM invokes an emergency flushing that discards older half of the compiled code(nmethods) to make space available in the CodeCache.

可以想象,较早的一半编译代码仅占整个 Codecache 的 20%,但另一种可能的解释是上述博文不准确。

最佳答案

“Older half” 的字面意思并不是所有 nmethods 的 50%。 HotSpot 扫描编译代码的逻辑有点复杂;最好的解释是它的source code ,但我将在下面给出一个简短的总结。

如果至少满足以下条件之一,则调用清理器:

  1. 代码缓存即将满。
  2. 自上次扫描以来有足够多的状态更改(JDK 8 测量“足够”超过 ReservedCodeCacheSize 的 1%)。
  3. 自上次扫描以来已经过了一定的时间间隔。代码缓存中的可用空间越多,调用清理器的频率就越低。确切的公式是here .

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

此外,如果UseCodeCacheFlushing启用后,它会释放足够 Activity 方法。冷法确定如下:

  • 在每个安全点,具有 Activity 堆栈帧的 nmethods 的热度计数器都会重置为默认值。默认热度值为2 * (ReservedCodeCacheSize / 1MB) .
  • 每次清理器运行时,它都会将 Activity 方法的热度计数器减少 1。
  • 如果热度计数器变得小于计算的阈值,则释放 nmethod。该阈值取决于代码缓存空闲率和 -XX:NmethodSweepActivity选项(默认为 10)。较大的是NmethodSweepActivity Code Cache 空闲比率越小,编译方法被清除得越积极。 Here是公式。

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

关于java - Oracle JVM 8 : when Codecache flushing is enabled, 刷新了多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38173592/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com