我看到以下相关问题 - how-is-the-java-memory-pool-divided和garbage-collection-not-running-for-code-cache-memory-pool但我没有相关的答案。
正如您通过 Jconsole 看到的,内存池中没有更多可用的代码缓存,需要关于它的替代品的一些详细信息以及我们在哪里可以找到有关更改的更多详细信息?
我相信重组伴随着Java 9
.
代码缓存不是只有一个代码堆,而是被分割成不同的代码堆,每个代码堆都包含特定类型的编译代码。这样的设计能够将具有不同属性的代码分开。
主要想法是提高性能并启用未来的扩展。
编译代码有三种不同的顶级类型:
对应的代码堆是:
包含非方法代码的非方法代码堆,例如编译器缓冲区和字节码解释器。此代码类型将永远保留在代码缓存中。
一个分析代码堆,包含生命周期短的轻度优化的分析方法。
一个非剖析代码堆,包含完全优化的非剖析方法,生命周期可能很长。
你可以在JEP-197 中找到一些有用的细节(比如这种重组的动机,如何配置新堆等) :)