如何查看PermGen中存储的确切内容?

时间:2015-04-13 17:43:07

标签: java visualvm permgen

在我的应用程序中,我有一个PermGen内存不足错误,我想知道导致它的原因。

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

我想知道在我的应用程序中究竟消耗了如此多的PermGen内存,但是我不能采用特殊的" PermGen Heap"在VisualVM中。我只能采用标准的HeapDump。

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

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

目前,根据该主题,我知道以下提示:

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

  2. 运行jmap -permstat并查看类加载器如何使用内存。它有效,但AppClassLoader中有数百个类,这对我没什么帮助。

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

  4.   

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

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

    1. 通过指定JVM属性跟踪运行时中的类加载。它有效,但不能帮助我理解什么需要记忆,有数千个类加载。
    2. 所以我在这里看不到我的问题的答案。 我知道PermGen不仅被类自己消耗,而且被静态成员消耗。如何跟踪哪些类占用内存的静态成员?

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

1 个答案:

答案 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吗?是在容器等吗?