14

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

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

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

是否有一个简单的实用程序可以找出谁负责您的类加载器不被垃圾收集(从而允许对其加载的类进行垃圾收集)?

我尝试了 JProfiler、jvisualvm、jhat 和很多 Google

致所有 LMGTFY 的朋友——我已经花了大约一天半的时间阅读论坛的分步说明,但运气不佳。我正在寻找输出的实用程序或代码:

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

4

4 回答 4

10

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

于 2010-01-03T20:21:06.240 回答
5

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

请注意,如果类加载器根本无法被 gc-ed,那么摆弄 jvm 将毫无帮助。你最好忘记频繁的部署,尤其是在生产中,尽管如此,对于开发来说它很方便。

于 2010-01-03T20:09:11.960 回答
2

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

于 2010-10-18T15:21:52.437 回答
1

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

另请查看 javalangoutofmemoryerror-permgen-space 文章。

于 2010-01-07T05:23:02.067 回答