Java 如何分析永久素含量?

Java 如何分析永久素含量?,java,permgen,Java,Permgen,我想倒一杯永磁发电机,看看它为什么会充满。有什么方法可以分析这个问题吗?我已经知道log4j、tomcatwebapp重载等常见的可疑问题,但我的应用程序中也有一些自定义代理生成代码,我只是想了解一下 这有可能吗?您可以使用以下标志: -XX:+TraceClassLoading -XX:+TraceClassUnloading 在从永久生成中加载/卸载类时,它们打印类的标识。如果添加-XX:+PrintGCDetails,还可以跟踪永久发电机的大小 注意,我不确定这些标志在Sun以外的JVM

我想倒一杯永磁发电机,看看它为什么会充满。有什么方法可以分析这个问题吗?我已经知道log4j、tomcatwebapp重载等常见的可疑问题,但我的应用程序中也有一些自定义代理生成代码,我只是想了解一下

这有可能吗?

您可以使用以下标志:

-XX:+TraceClassLoading -XX:+TraceClassUnloading
在从永久生成中加载/卸载类时,它们打印类的标识。如果添加
-XX:+PrintGCDetails
,还可以跟踪永久发电机的大小

注意,我不确定这些标志在Sun以外的JVM中是否受支持


PermGen内存不足错误的另一个怀疑是。检查代码中插入字符串的位置。

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


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

jmap-permgen是否符合要求

请参阅Java的疑难解答指南
PermGen通常由字符串文本池和加载的类组成。为了回答您的部分问题,即字符串文本池,我编写了一个实用程序来打印正在运行的JVM的字符串文本池。可从以下网址获得:


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

这并没有解决实际问题。。。如何转储永久发电机堆。@Stephen:你说得对,但我希望在这种情况下就足够了:)接受,因为这对我帮助最大,即使它不能完全解决我的问题。在编写了一个脚本解析我的日志输出并计算所有加载类的大小之后,我发现160MB的pern gen实际上并不足够。(在阅读我的评论时,我看到至少2个WTF)对不起,我的永久发电机已经快满了。我不知道是什么。这应该会打印出加载时填充PermGen空间的类。您能重新启动应用程序并打开此日志记录吗?这不有用,事实上与从第一条注释中提供-XX:+TraceClassLoading-XX:+TraceClassLoading相同。否。我已经知道了这一点,但我真的需要一种方法来看看里面已经有什么。尝试使用
-permstat
,但刚得到:
错误附加到进程:sun.jvm.hotspot.debugger.DebuggerException:无法附加到进程
很棒的东西!这正是我需要的!您能否澄清,在运行此程序时,我们如何修复Windows上的“附加到进程ID XXXX,请稍候…附加到进程时出错:尝试连接到调试服务器时超时(请启动SwDbgSrv.exe)。”?