在我的应用程序中,我有一个PermGen内存不足错误,我想知道导致它的原因.
我通过VisualVM连接到我的应用程序.
我想知道在我的应用程序中究竟消耗了如此多的PermGen内存,但我无法在VisualVM中使用特殊的“PermGen Heap”.我只能采用标准的HeapDump.
是否有可能使用VIsualVM或其他工具找出究竟消耗我所有PermGen内存的内容?
UPDATE
这个问题被标记为“重复”,但实际上我在上述主题中没有看到我的问题的答案.问题是我没有看到一种方法来准确列出我的permgen空间中消耗内存的内容.
目前从该主题我知道以下提示:
>运行jmap -permstat,看看实习生字符串使用了多少PermGen.好主意,它的工作原理:现在我知道字符串池在我的情况下不是问题.
>运行jmap -permstat,看看类加载器如何使用内存.它有效,但AppClassLoader中有数百个类,这对我没什么帮助.
>运行PrintStringTable.java util以查看哪些字符串占用内存.我不能在我的Windows 7 PC上运行它,因为我得到了
Attaching to process ID XXXX, please wait… Error attaching to
process: Timed out while attempting to connect to debug server (please
start SwDbgSrv.exe).
无论如何,这不是我的情况.
>通过指定JVM属性来跟踪运行时中的类加载.它有效,但不能帮助我理解什么需要记忆,有数千个类加载.
所以我在这里看不到我的问题的答案.
我知道PermGen不仅被类自己消耗,而且被静态成员消耗.如何跟踪哪些类消耗内存的静态成员?
如果我错过了这个答案,请告诉我.
最佳答案 VisualVM的堆转储应该足以调查你的permgen问题 – 我必须解决太多的PermGen内存泄漏,而VisualVM始终是我的起点.
如果你执行堆转储,它将包括有关permgen的信息 – 类,类加载器等 – 我个人然后使用Eclipse Memory Analyser tool – 只需加载整个转储,它可以提供泄漏可疑报告,重复类报告等.一般来说,我只是转到重复的类列表,右键单击并选择“查找GC根”,然后您可以从中缩小某些问题.
顺便说一句,你是否正在做任何特殊的类加载等?使用类加载器显式重新加载或加载?它只是直接的Java吗?是在容器等吗?