我们一直在将应用程序中的permgen内存空间推得越来越高,我试图找出是否有某种形式的泄漏吞噬了permgen区域。我们不执行热的取消部署/重新部署操作,但是我们有很多代理,包括动态代理和CGLIB生成的代理。我们还做一些复杂的类加载器位来支持各种用例,我怀疑它们也可能是造成permgen浪费的原因。
因此,我在正在运行的应用程序上运行了jmap -permstat,希望对可能填充我们的permgen空间的内容有所了解。 (我还使用 Activity 对象和无效对象运行普通的堆转储,因此我可以跟踪可能来自permstat输出的线索)。
但是,在jmap permstat列出的2400个类装入器中,除引导类装入器之外的所有类均被列为“死”。这毫无意义,因为该应用程序确实可以正常运行。
我的理解是,如果jmap有资格进行垃圾回收,它将将类加载器报告为“已死”,但我在这里一定是错误的...
我想念什么? “死”在这里是什么意思?除了我可能在这里产生的误解外,在谷歌搜索中并没有提供很多答案。答案是正确的。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。的根的的。
最佳答案
这里有一些想法:
-XX:+UseConcMarkSweepGC
运行,请确保您还使用了-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled
切记排除弱引用!
关于java - 为什么我只能从jmap -permstat中看到 "dead"类加载器( bootstrap 除外)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6656781/