Java 8:为什么Metaspace大小增加但加载类的数量保持不变?

时间:2015-06-19 12:32:36

标签: jvm java-8 metaspace

在我们在Jdk 8上运行的应用程序中,我们使用VisualVM来跟踪已加载类的使用情况以及元空间的使用情况。

在我们的应用程序运行的某个时间点,我们看到已加载的类的数量不再增加,但在我们的程序运行时,元空间的大小仍会增加。那么除了类之外还有哪些东西存储在元空间中,这可能会导致这种情况?

2 个答案:

答案 0 :(得分:5)

当您的程序正在运行时,代码的某些部分可能会被确定为" hot"通过HotSpot的JIT编译器。这将导致这些部分被转换/编译为本机代码,并且还可以将其他一些代码内联到其中。这个本机代码表示必须在某个地方,它与其他类元数据 - Metaspace进入同一个地方。

它解释了您所看到的持续增长:热门部分是通过使用该代码执行多少次的简单指标来确定的。随着时间的推移,越来越多的代码片段将被JIT'因为它们会达到-XX:CompileThreshold (defaults to 10000)设置的阈值

答案 1 :(得分:0)

我不确定,但我(http://java.dzone.com/articles/java-8-permgen-metaspace)为此付出了资金

  

一旦类元数据使用达到“MaxMetaspaceSize”,就会触发死类和类加载器的垃圾收集。

这可能是增加元空间大小的原因。