为什么我只能看到jmap -permstat中的“死”类加载器(引导程序除外)?

时间:2011-07-11 21:24:53

标签: java memory profiling permgen jmap

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

所以我在运行的应用程序上运行jmap -permstat,希望能够深入了解可能填补我们permgen空间的内容。 (我还运行一个包含实时和死对象的正常堆转储,这样我就可以追溯可能来自permstat输出的线索。)

但是,在jmap permstat列出的2400个类加载器中,除引导类加载器之外的所有类都被列为“死”。这没有任何意义,因为应用程序绝对是直播和工作。

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

我错过了什么? “死”在这里意味着什么?除了我在这里可能存在的误解之外,谷歌搜索并没有提供很多答案。

1 个答案:

答案 0 :(得分:1)

以下是一些想法:

  1. 升级到最新的VM。
  2. 如果由于某种原因您正在使用-XX:+UseConcMarkSweepGC,请确保您还使用-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled
  3. 在jhat中执行“来自Rootset的引用链”以查看谁持有该实例。 记得排除弱参考!
  4. This long post有点复杂,我自己没试过,但也许它会对你有所帮助。
  5. 尝试其他VM,例如JRockit的