如何分析PermGen内容?

我想得到PermGen的转储,看看为什么它正在填充。 有没有办法分析这个? 我已经知道像log4j,tomcat webapp重新加载等常见的嫌疑人,但我的应用程序中也有一些自定义代理生成代码,只是想深入了解。

这有可能吗?

PermGen通常由字符串文字池和加载的类组成。 为了回答部分问题,即字符串文字池,我编写了一个实用程序来打印正在运行的JVM的字符串文字池。 它在这里可用:

https://github.com/puneetlakhina/javautils/blob/master/src/com/blogspot/sahyog/PrintStringTable.java

它基于PermStat ,它是用于通过jmap工具打印permgen统计数据的类。

你可以使用标志:

-XX:+TraceClassLoading -XX:+TraceClassUnloading 

它们在从永久世代加载/卸载时打印类的标识。 如果添加-XX:+PrintGCDetails您还可以跟踪permgen的大小。

请注意,我不确定除Sun之外的JVM中是否支持这些标志。

PermGen内存错误的另一个嫌疑人是字符串实习 。 检查代码中实习生字符串的位置。

如果您想获得所有加载类的列表,可以使用jconsole 。 单击“类”选项卡,然后单击“详细输出”。 这将打印加载到stdout每个类。 我发现这非常有用,可以追踪JAXB代理类问题。

您可能必须使用-Dcom.sun.management.jmxremote命令行选项启动应用程序,以便jconsole附加到它。

jmap -permgen满足要求吗?

请参阅Java的故障排除指南http://java.sun.com/javase/6/webnotes/trouble/TSG-VM/html/memleaks.html#gbyuu