如何获取 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 的信息。
是否有任何工具能够从 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 的信息。