如何获取 Java8 元空间转储(不是堆转储)

How to get Java8 Metaspace dump (not heap dump)

是否有任何工具能够从 Java8 热点虚拟机获取元空间转储?

您似乎遇到了 class 加载泄漏。
使用

  • jmap -clstats PID 转储 class 加载程序统计信息;
  • jcmd PID GC.class_stats 打印有关每个加载的内存使用情况的详细信息 class。后者需要 -XX:+UnlockDiagnosticVMOptions.

堆转储也会有所帮助,因为元空间中的每个 class 在堆中都有对应的 java.lang.Class 实例。

如果您想深入了解您的元空间分配是什么,更深入的选择是使用本机内存跟踪。您可能希望使用详细级别的本机内存跟踪,这可以通过将 -XX:NativeMemoryTracking=detail 传递给 JVM 来启用。那么你可以运行

jcmd <pid> VM.native_memory baseline

建立基线。然后让JVM运行直到问题应该重现后,就可以运行

jcmd <pid> VM.native_memory detail.diff

然后 NMT diff 中的 Class 分配将提供元空间分配。 orcale docs 有更多关于 NMT 的信息。