【发布时间】:2015-06-19 03:16:42
【问题描述】:
在我的应用程序中出现 PermGen 内存不足错误,我想看看是什么导致了它。
我已通过 VisualVM 连接到我的应用程序。
我想看看在我的应用程序中究竟是什么消耗了这么多 PermGen 内存,但我无法在 VisualVM 中使用特殊的“PermGen 堆”。我只能使用标准的 HeapDump。
是否可以使用 VIsualVM 或其他工具找出究竟是什么消耗了我所有的 PermGen 内存?
更新 这个问题被标记为“重复”,但实际上我在提到的主题中没有看到我的问题的答案。问题是我没有找到一种方法来准确列出我的 permgen 空间中消耗内存的内容。
目前从该主题中我知道以下提示:
运行 jmap -permstat 并查看实习生字符串使用了多少 PermGen。好主意,它有效:现在我知道字符串池对我来说不是问题。
运行 jmap -permstat 并查看类加载器如何消耗内存。它可以工作,但是 AppClassLoader 中有数百个类,这对我没有多大帮助。
运行 PrintStringTable.java 工具查看哪些字符串占用了内存。我无法在我的 Windows 7 PC 上运行它,因为我得到了
正在附加到进程 ID XXXX,请稍候...附加到错误 进程:尝试连接调试服务器时超时(请 启动 SwDbgSrv.exe)。
无论如何,这不是我的情况。
- 通过指定 JVM 属性来跟踪运行时中的类加载。它有效,但不能帮助我理解是什么带走了内存,加载了数千个类。
所以我在这里看不到我的问题的答案。 我知道 PermGen 不仅被类本身使用,还被它们的静态成员使用。如何跟踪哪些类的哪些静态成员占用了内存?
如果我错过了这个答案,请告诉我。
【问题讨论】:
-
类和堆栈帧进入 PermGen。您是否有过多的类或线程(每个线程都有自己的堆栈)?
-
这里有一个解决方案:stackoverflow.com/questions/2842982/…
-
静态方法/变量也包含在 permgen 中,以及任何 string.intern() 用法(JDK7 之前)等等。
-
spudone,“静态方法转到 permgen”是什么意思?