如何转储Permgen?

22

我想要获取应用服务器Permgen的转储。

我不想使用-XX:+TraceClassLoading -XX:+TraceClassUnloading,因为我不想重启服务器,也不想使用jconsole

是否有类似于jmap的工具(用于堆转储),以获取Permgen,这样我就可以只提供pid


这个有帮助解决你的问题吗,Vikas? - Amir Afghani
我之前尝试过,但它说选项无效并显示使用情况,只允许-histo和-dump(堆转储)。我正在使用jdk/bin中的jmap,这是正确的吗? - Vikas Madhusudana
“permstat”选项在MS Windows上不可用。 - kschneid
3个回答

17
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  

这不是完整的转储,但这样做将允许您进行一些调查。

我仍在寻找如何找到更多信息。


13

无法像堆一样“dump permgen”。

除了其他人提到的 jmap -permstat,您还可以分析标准堆转储文件以揭示您的永久代问题,如此博客文章:“未知的代:Perm”所述。

由于堆转储文件对 Perm 区域的信息不太充分,因此 Perm 问题难以解决。最近,我发现了作者 Sporar、Sundararajan 和 Kieviet 的这篇优秀文章。作者们帮助我们了解了永久代。当然,我必须立刻检查一下是否可以使用 Eclipse Memory Analyzer 来分析这个“未知”的代。这就是本文讨论的内容。


1
jmap -permstat <pid>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接