我们一直在将应用程序中的permgen内存空间推得越来越高,我试图找出是否有某种形式的泄漏吞噬了permgen区域。我们不执行热的取消部署/重新部署操作,但是我们有很多代理,包括动态代理和CGLIB生成的代理。我们还做一些复杂的类加载器位来支持各种用例,我怀疑它们也可能是造成permgen浪费的原因。

因此,我在正在运行的应用程序上运行了jmap -permstat,希望对可能填充我们的permgen空间的内容有所了解。 (我还使用 Activity 对象和无效对象运行普通的堆转储,因此我可以跟踪可能来自permstat输出的线索)。

但是,在jmap permstat列出的2400个类装入器中,除引导类装入器之外的所有类均被列为“死”。这毫无意义,因为该应用程序确实可以正常运行。

我的理解是,如果jmap有资格进行垃圾回收,它将将类加载器报告为“已死”,但我在这里一定是错误的...

我想念什么? “死”在这里是什么意思?除了我可能在这里产生的误解外,在谷歌搜索中并没有提供很多答案。答案是正确的。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。的根的的。

最佳答案

这里有一些想法:

  • 升级到最新的VM。
  • 如果出于某种原因您正在使用-XX:+UseConcMarkSweepGC运行,请确保您还使用了-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled
  • 在jhat中执行“来自Rootset的引用链”,以查看谁持有该实例。
    切记排除弱引用!
  • This long post有点复杂,我自己也没有尝试过,但也许会对您有所帮助。
  • 尝试其他VM,例如JRockit
  • 关于java - 为什么我只能从jmap -permstat中看到 "dead"类加载器( bootstrap 除外)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6656781/

    10-09 15:47