如何分析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