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