在我的应用程序中,我有一个PermGen内存不足错误,我想知道导致它的原因。
我已通过VisualVM连接到我的应用程序。
我想知道在我的应用程序中究竟消耗了如此多的PermGen内存,但是我不能采用特殊的" PermGen Heap"在VisualVM中。我只能采用标准的HeapDump。
是否可以使用VIsualVM或其他工具找出究竟消耗我所有PermGen内存的内容?
更新 这个问题被标记为"重复"但实际上我在上述主题中没有看到我的问题的答案。问题是我没有找到一种方法来准确列出我的permgen空间中消耗内存的内容。
目前,根据该主题,我知道以下提示:
运行jmap -permstat并查看实习生字符串使用了多少PermGen 。好主意,它有效:现在我知道字符串池在我的情况下不是问题。
运行jmap -permstat并查看类加载器如何使用内存。它有效,但AppClassLoader中有数百个类,这对我没什么帮助。
运行PrintStringTable.java util以查看哪些字符串占用内存。我无法在Windows 7 PC中运行它,因为我得到了
附加到处理ID XXXX,请稍候...附加到的错误 进程:尝试连接到调试服务器时超时(请 启动SwDbgSrv.exe)。
无论如何,这不是我的情况。
所以我在这里看不到我的问题的答案。 我知道PermGen不仅被类自己消耗,而且被静态成员消耗。如何跟踪哪些类占用内存的静态成员?
如果我错过了这个答案,请告诉我。
答案 0 :(得分:2)
VisualVM的堆转储应该足以调查你的permgen问题 - 我必须解决太多的PermGen内存泄漏,而VisualVM始终是我的起点。
如果执行堆转储,它还将包含有关permgen的信息 - 类,类加载器等 - 我个人然后使用Eclipse Memory Analyser tool - 只需加载整个转储并且它可以提供泄漏可疑报告,重复类通常,我只是转到重复的类列表,右键单击并选择"查找GC根源"从那里你通常可以缩小一些问题。
这可能会有所帮助(虽然没有详细阅读): http://java.jiderhamn.se/2011/12/11/classloader-leaks-i-how-to-find-classloader-leaks-with-eclipse-memory-analyser-mat/
这似乎是同一个问题/答案:How to analyze PermGen space?
顺便说一句,你是否正在做任何特别的类加载等?使用类加载器显式重新加载或加载?它只是直接的Java吗?是在容器等吗?