2014-03-04 38 views
0

几次重新部署应用程序与PermGen错误崩溃后。我知道随着permgen大小的增加变通办法。但我试图揭示泄漏的原因。在重新部署之后,我使用jvisualvm创建堆转储并搜索WebAppClassLoader的实例。正如预期的那样,还有一个没有GC-ed。向platformMBeanServer(MangementFactory类型)显示最近的GC根点。所以问题是我能用它做什么?网络应用程序,tomcat + hibernate + Guice中的内存泄露

enter image description here

和一些额外的信息。我的jdbc驱动程序jar位于bin目录中的tomcat和.dll文件的lib目录中。当我评论hibernate的sessionFactory创建 - 问题消失。会话工厂在servlet过滤器的init方法中创建,并在destroy方法中关闭。 Hibernate使用c3p0连接池。

+0

您需要关注GC根源。他们是否将你指向特定的对象,或者你只是在猜测?尝试阅读http://people.apache.org/~markt/presentations/2010-11-04-Memory-Leaks-60mins.pdf找出如何找到这些内存泄漏。 –

回答

0

我找到了解决方案。它变成连接池c3p0 0.9.2.1有内存泄漏。休眠4.3.1-Final使用该版本的c3p0。切换到休眠4.1.12和c3p0 0.9.1解决了我的问题。

0

您可以尝试添加这些Java选项:

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled 

这使得垃圾收集PermGen的空间(默认关闭),并允许GC卸载类。

+0

感谢您的建议,但没有任何改变。 GC无法清除它,因为存在旧WebAppClassLoader的存在 – Kolchuga

+0

PermGen清理始终处于启用状态,否则无法卸载类。他们卸载很好,没有添加任何选项。 –