Java类(PermGen)内存泄漏(Web应用程序) - 通用解决方案?

Era*_*dan 14 java garbage-collection permgen

我知道,我有一个perm gen内存泄漏.使用jvisualvm进行性能分析表明,在进行热部署时(例如,在不杀死JVM的情况下停止和启动应用程序,在tomcat,WebSphere,WebLogic等中) - PermGen空间不断增加.

在阅读之后,使用jhat和其他高级工具,我意识到我可能WebAppClassLoader在其父类加载器中的某个类中引用了它.

即使我在jhat上做了一些基于JavaScript的大量查询,我也无法将其固定下来

是不是有一个简单的实用程序可以找出谁负责你的类加载器不被垃圾收集(从而允许垃圾收集由它加载的类)?

我试过JProfiler,jvisualvm,jhat和很多Google

所有LMGTFY的朋友 - 我花了大约一天半的阅读论坛一步一步的说明,没有运气.我正在寻找输出的实用程序或代码:

Y类的对象X是唯一的GC根,它可以防止您的类被删除.

小智 10

有一个不令人满意但很容易的解决方案:不要在生产环境中进行热部署.您可以设置一个包含两个servlet容器的集群,并在重新启动时一次更新一个.

  • 这不应该是公认的答案.我在本地测试环境中遇到同样的问题,如果可以的话,我真的想避免重启Tomcat. (2认同)

jul*_*ius 5

频繁重新部署的现实......你能做的最好是使用-XX:MaxPermSize = 256m来增加perm gen的大小.这可能会为每个jvm重启更多地重新部署.或者阅读http://my.opera.com/karmazilla/blog/2007/03/15/permgen-strikes-back

请注意,如果类加载器根本不能被gc-ed,摆弄jvm将无济于事.你最好忘记频繁的部署,特别是在生产中,尽管它很方便.