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

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

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

即使我在jhat上做了一些基于JavaScript的大量查询,我也无法确定它

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

我试过JProfiler,jvisualvm,jhat和很多谷歌

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

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

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

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

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

我使用了这个网站的方法,但它有所帮助。 http://www.mkyong.com/tomcat/tomcat-javalangoutofmemoryerror-permgen-space/

这里也很少指点, http://minmaxmim.blogspot.com/2010/01/javalangoutofmemoryerror-java-heap.html

还要查看javalangoutofmemoryerror-permgen-space文章。