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

Java 如何查看PermGen中存储的确切内容?,java,visualvm,permgen,Java,Visualvm,Permgen,在我的应用程序中,我有一个PermGen内存不足错误,我想看看是什么导致了它 我已通过VisualVM连接到我的应用程序 我想知道到底是什么在我的应用程序中消耗了这么多PermGen内存,但我不能在VisualVM中使用特殊的“PermGen堆”。我只能喝标准的啤酒 使用VIsualVM或其他工具是否有可能找出到底是什么消耗了我所有的PermGen内存 更新 这个问题被标记为“重复”,但事实上,我在提到的主题中没有看到我的问题的答案。问题是,我没有找到一种方法来准确列出在我的permgen空间中

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

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

我想知道到底是什么在我的应用程序中消耗了这么多PermGen内存,但我不能在VisualVM中使用特殊的“PermGen堆”。我只能喝标准的啤酒

使用VIsualVM或其他工具是否有可能找出到底是什么消耗了我所有的PermGen内存

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

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

  • 运行jmap-permstat,查看intern字符串使用了多少PermGen。好主意,它可以工作:现在我知道字符串池在我的情况下不是问题

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

  • 运行PrintStringTable.java util查看哪些字符串占用内存。我无法在Windows 7 PC上运行它,因为我

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

    不管怎样,这不是我的情况

  • 通过指定JVM属性来跟踪运行时中的类加载。它可以工作,但不能帮助我理解是什么带走了内存,加载了数千个类 所以我在这里看不到我问题的答案。 我知道PermGen不仅被类本身消耗,也被它们的静态成员消耗。如何跟踪哪些类的哪些静态成员占用内存


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

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

    如果您执行堆转储,它还将包括关于permgen的信息-类、类加载器等-我个人使用-只需加载整个转储,它可以提供泄漏可疑报告、重复类报告等。通常,我只需转到重复类列表,右键单击并选择“查找GC根”从那里你通常可以缩小一些问题的范围

    这可能会有帮助(尽管没有详细阅读):

    这似乎是相同的问题/答案:


    顺便问一下,您在类加载等方面做了什么特别的工作吗?显式重新加载或使用类加载器加载?它只是纯Java吗?它是否在容器等中?

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