如何分析 PermGen 的内容?
Posted
技术标签:
【中文标题】如何分析 PermGen 的内容?【英文标题】:How to analyze PermGen contents? 【发布时间】:2011-02-20 01:00:16 【问题描述】:我想获取 PermGen 的转储,看看它为什么会被填充。有没有办法分析这个?我已经知道 log4j、tomcat webapp 重新加载等常见问题,但我的应用程序中也有一些自定义代理生成代码,只是想深入了解一下。
这有可能吗?
【问题讨论】:
【参考方案1】:PermGen 通常由字符串文字池和加载的类组成。为了回答您的部分问题,即字符串文字池,我编写了一个实用程序来打印正在运行的 JVM 的字符串文字池。可在此处获得:
https://github.com/puneetlakhina/javautils/blob/master/src/com/blogspot/sahyog/PrintStringTable.java
它基于PermStat,这是jmap工具用来打印permgen stats的类。
【讨论】:
好东西!这正是我所需要的! 您能否说明我们如何解决“正在附加到进程 ID XXXX,请稍候...附加到进程时出错:尝试连接到调试服务器时超时(请启动 SwDbgSrv.exe)。 "在 Windows 上运行此程序?【参考方案2】:您可以使用标志:
-XX:+TraceClassLoading -XX:+TraceClassUnloading
当它们从永久代加载/卸载时,它们会打印类的标识。如果添加-XX:+PrintGCDetails
,还可以跟踪permgen 的大小。
请注意,我不确定 Sun 以外的 JVM 是否支持这些标志。
PermGen 内存不足错误的另一个嫌疑人是string interning。检查您在代码中实习字符串的位置。
【讨论】:
这并没有解决实际问题......如何转储永久堆。 @Stephen:你是对的,但我希望在这种情况下就足够了 :) 接受了,因为这对我帮助最大,即使它没有完全解决我的问题。在编写了一个解析我的日志输出并计算所有加载类的大小的脚本后,我发现 160MB pern gen 真的不够用。 (在阅读我的评论时,我看到至少 2 个 WTF)【参考方案3】:如果您想获取所有已加载类的列表,您可以使用jconsole
。单击类选项卡,然后单击“详细输出”。这将打印加载到stdout
的每个类。我发现这对跟踪 JAXB 代理类问题非常有用。
您可能必须使用-Dcom.sun.management.jmxremote
命令行选项启动您的应用程序,以便jconsole
附加到它。
【讨论】:
抱歉,我的 permgen 已经快满了。我不知道用什么。 这应该会打印出加载 PermGen 空间的类。您可以重新启动您的应用程序并打开此日志记录吗? 没有用,实际上与在第一条评论中提供 -XX:+TraceClassLoading -XX:+TraceClassUnloading 相同。【参考方案4】:jmap -permgen
符合要求吗?
请参阅 Java 故障排除指南 http://java.sun.com/javase/6/webnotes/trouble/TSG-VM/html/memleaks.html#gbyuu
【讨论】:
没有。我已经知道了,但我真的需要一种方法来看看里面已经有什么。 尝试使用-permstat
,但刚刚得到:Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process
以上是关于如何分析 PermGen 的内容?的主要内容,如果未能解决你的问题,请参考以下文章