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

2022-09-04 20:02:27

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

在阅读,使用jhat和其他高级工具后,我意识到我可能在其父类装入器中的某个地方引用了来自类的。WebAppClassLoader

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

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

我尝试了JProfiler,jvisualvm,jhat和很多Google。

致所有LMGTFY朋友 - 我花了大约一天半的时间阅读论坛,并逐步说明,没有运气。我正在寻找输出以下内容的实用程序或代码:

类 Y 的对象 X 是防止类被删除的唯一 GC 根。


答案 1

有一个不令人满意但很容易的解决方案:不要在生产环境中进行热部署。您可以设置一个由两个 Servlet 容器组成的集群,它们一次更新一个,然后重新启动。


答案 2

频繁重新部署的现实...你能做的最好的事情就是使用-XX:MaxPermSize=256m来增加烫发的大小。这可能会在每次 jvm 重新启动时为您节省更多的重新部署。或继续阅读 http://my.opera.com/karmazilla/blog/2007/03/15/permgen-strikes-back

请注意,如果类装入器根本无法进行gc-ed,那么摆弄jvm根本无济于事。你最好忘记频繁的部署,特别是在生产中,对于开发来说,这很方便。