5

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

所以我在我们正在运行的应用程序上运行 jmap -permstat,希望能够深入了解可能会填满我们的 permgen 空间的内容。(我还运行了一个包含活动对象和死对象的普通堆转储,以便我可以追踪可能来自 permstat 输出的线索)。

但是,在 jmap permstat 列出的 2400 个类加载器中,除了引导类加载器之外的所有类加载器都被列为“死”。这没有任何意义,因为该应用程序绝对是实时的,并且正在运行。

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

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

4

1 回答 1

1

这里有一些想法:

  1. 升级到最新的虚拟机。
  2. 如果由于某种原因您正在使用-XX:+UseConcMarkSweepGC,请确保您也在使用-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled
  3. 在 jhat 中执行“来自 Rootset 的引用链”以查看谁持有该实例。记得排除弱参考!
  4. 这篇长文有点复杂,我自己也没试过,但也许对你有帮助。
  5. 尝试另一个 VM,例如 JRockit
于 2011-07-12T03:01:30.603 回答