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

Sco*_*ott 5 java memory profiling permgen jmap

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

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

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

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

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

jto*_*ron 1

以下是一些想法:

\n\n
    \n
  1. 升级到最新的虚拟机。
  2. \n
  3. 如果由于某种原因您正在使用 运行-XX:+UseConcMarkSweepGC,那么请确保您也在使用-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled
  4. \n
  5. 在 jhat 中执行“来自根集的引用链”,以便查看谁\xe2\x80\x99 持有该实例。\n记住排除弱引用!
  6. \n
  7. 这篇长文有点复杂,我自己还没有尝试过,但也许它会对你有所帮助。
  8. \n
  9. 尝试另一个虚拟机,例如 JRockit
  10. \n
\n