【问题标题】:How can I see what exactly is stored in PermGen?如何查看 PermGen 中究竟存储了什么?
【发布时间】:2015-06-19 03:16:42
【问题描述】:

在我的应用程序中出现 PermGen 内存不足错误,我想看看是什么导致了它。

我已通过 VisualVM 连接到我的应用程序。

我想看看在我的应用程序中究竟是什么消耗了这么多 PermGen 内存,但我无法在 VisualVM 中使用特殊的“PermGen 堆”。我只能使用标准的 HeapDump。

是否可以使用 VIsualVM 或其他工具找出究竟是什么消耗了我所有的 PermGen 内存?

更新 这个问题被标记为“重复”,但实际上我在提到的主题中没有看到我的问题的答案。问题是我没有找到一种方法来准确列出我的 permgen 空间中消耗内存的内容。

目前从该主题中我知道以下提示:

  1. 运行 jmap -permstat 并查看实习生字符串使用了多少 PermGen。好主意,它有效:现在我知道字符串池对我来说不是问题。

  2. 运行 jmap -permstat 并查看类加载器如何消耗内存。它可以工作,但是 AppClassLoader 中有数百个类,这对我没有多大帮助。

  3. 运行 PrintStringTable.java 工具查看哪些字符串占用了内存。我无法在我的 Windows 7 PC 上运行它,因为我得到了

正在附加到进程 ID XXXX,请稍候...附加到错误 进程:尝试连接调试服务器时超时(请 启动 SwDbgSrv.exe)。

无论如何,这不是我的情况。

  1. 通过指定 JVM 属性来跟踪运行时中的类加载。它有效,但不能帮助我理解是什么带走了内存,加载了数千个类。

所以我在这里看不到我的问题的答案。 我知道 PermGen 不仅被类本身使用,还被它们的静态成员使用。如何跟踪哪些类的哪些静态成员占用了内存?

如果我错过了这个答案,请告诉我。

【问题讨论】:

  • 类和堆栈帧进入 PermGen。您是否有过多的类或线程(每个线程都有自己的堆栈)?
  • 这里有一个解决方案:stackoverflow.com/questions/2842982/…
  • 静态方法/变量也包含在 permgen 中,以及任何 string.intern() 用法(JDK7 之前)等等。
  • spudone,“静态方法转到 permgen”是什么意思?

标签: java visualvm permgen


【解决方案1】:

VisualVM 的堆转储应该足以调查您的 permgen 问题 - 我必须解决太多 PermGen 内存泄漏问题,VisualVM 始终是我的起点。

如果您执行堆转储,它还将包含有关 permgen 的信息 - 类、类加载器等 - 就我个人而言,然后我使用 Eclipse Memory Analyser tool - 只需加载整个转储,它就可以提供泄漏可疑报告、重复类报告等. 一般情况下,我只是去重复类列表,右键单击并选择“查找 GC Roots”,然后您通常可以从那里缩小一些问题。

这可能会有所帮助(尽管没有详细阅读): 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吗?它在容器等中吗?

【讨论】:

    猜你喜欢
    • 2012-12-15
    • 2012-07-23
    • 2016-09-10
    • 2023-03-15
    • 2012-10-17
    • 2021-06-04
    • 1970-01-01
    • 2018-07-30
    • 2019-10-06
    相关资源
    最近更新 更多