【发布时间】:2016-07-03 19:26:22
【问题描述】:
我正在运行一个启用了 ReservedCodeCacheSize=128M 和 UseCodeCacheFlushing 的 Oracle Java 8 JVM(服务器,不是客户端或嵌入式)。几天后,Codecache 的使用率从 93% 迅速下降到 80%。我假设我目睹了 Codecache 刷新,但令人惊讶的是,刷新后的大小接近 100% 满而不是 50% 满。
JVM 如何决定要刷新多少 Codecache?
This Oracle Java 8 page 描述了选项,但没有量化刷新的 Codecache:
在关闭编译器之前启用代码缓存的刷新。默认情况下启用此选项。要在关闭编译器之前禁用代码缓存刷新,请指定 -XX:-UseCodeCacheFlushing。
有一个 JVM 选项 UseCodeCacheFlushing 可用于控制 Codecache 的刷新。启用此选项后,JVM 会调用紧急刷新,丢弃旧的一半已编译代码(nmethods),以在 CodeCache 中腾出可用空间。
可以想象,编译后的代码的旧一半仅占整个 Codecache 的 20%,但另一种可能的解释是上述博文不准确。
【问题讨论】: