在我们在 Jdk 8 上运行的应用程序中,我们使用 VisualVM 来跟踪加载的类的使用情况和元空间的使用情况。
在我们的应用程序运行的某个时间点,我们看到加载的类的数量不再增加,但是当我们的程序运行时元空间的大小仍然增加。那么除了类之外还有什么存储在元空间中,这可能导致这种情况?
当您的程序正在运行时,您的代码的某些部分可能会被 HotSpot 的 JIT 编译器确定为“热”。这将导致这些部分被转换/编译为本机代码,并且一些其他代码可能被内联到其中。这种原生代码表示必须去某个地方,并且它与其他类元数据进入同一个地方 - 元空间。
它解释了您所看到的持续增长:使用一段代码执行了多少次的简单指标随着时间的推移确定热门部分。随着时间的推移,越来越多的代码片段将被 JIT 处理,因为它们将达到设置的阈值-XX:CompileThreshold
(默认为 10000)
我不确定,但我 ( http://java.dzone.com/articles/java-8-permgen-metaspace ) 我资助了这个
一旦类元数据使用量达到“MaxMetaspaceSize”,就会触发死类和类加载器的垃圾收集。
也许这是增加元空间大小的原因。