我想转储应用程序服务器的 Permgen。
我不想使用-XX:+TraceClassLoading -XX:+TraceClassUnloading
,因为我不想重新启动服务器,我也不想使用jconsole
.
我有任何工具jmap
(用于堆转储没有找到 permgen 的任何选项)来获取 permgen,以便我只能提供pid
.
jmap -permstat <pid>
将产生这样的输出:
30337 intern Strings occupying 2746200 bytes.
class_loader classes bytes parent_loader alive? type
<bootstrap> 2031 7253392 null live <internal>
0x517474f0 1 1760 null dead sun/reflect/DelegatingClassLoader@0x43f95d38
0x4f83f670 1 1744 0x4ebfb8e8 dead sun/reflect/DelegatingClassLoader@0x43f95d38
[...]
total = 287 10020 35889952 N/A alive=3, dead=284 N/A
这不是一个完整的转储,但这样做可以让您进行一些调查。
我仍在寻找如何找到更多信息。
不可能像对堆那样“转储 permgen”。
除了jmap -permstat
其他人所介绍的那样,您还可以分析标准堆转储以了解您的永久代,如本博客条目中所述:“未知代:永久”。
因为堆转储实际上并没有包含很多关于永久空间的信息,所以永久问题很难解决。最近,我发现了 Sporar、Sundararajan 和 Kieviet 的这篇很棒的文章。作者对永久一代有所了解。当然,我必须立即检查是否以及如何使用 Eclipse 内存分析器来分析这个“未知”生成。这就是这个博客的内容。
jmap -permstat <pid>