为什么webappclassloader不是垃圾收集?

时间:2014-06-18 09:36:54

标签: java hibernate tomcat memory-leaks garbage-collection

我有一个由spring / hibernate开发的Web服务,当我多次在Tomcat 7上进行部署和取消部署时,我得到一个outOfMemoryError PermGen内存泄漏。

通过使用java VisualVM,我注意到之前的webappClassLoader仍保留在JVM中,因此它们不会被垃圾回收。

这个问题可能是什么原因?

如何检测哪些对象仍然引用了应用程序类加载器或由它加载的任何对象?

谢谢,

1 个答案:

答案 0 :(得分:4)

简短的回答是你有内存泄漏。根据经验,这很可能是在您的Web应用程序或它正在使用的库中。在Tomcat中发现内存泄漏也是可能的,但不太可能。

用于跟踪内存泄漏的简短版本是:

  • 启动Tomcat
  • 取消部署并重新部署有问题的应用程序
  • 使用分析器检查堆
  • 查找WebappClassLoader的实例
  • 找到一个强烈持有但属性为started = false
  • 的人
  • 跟踪WebappClassLoader
  • 实例的GC根
  • 这将指向您的内存泄漏

找出内存泄漏的根本原因可能会有点困难。

有关如何追踪此类内存泄漏的更详细说明以及可能导致他们看到此演示文稿的内容:http://people.apache.org/~markt/presentations/2010-08-05-Memory-Leaks-JavaOne-60mins.pdf