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

通过使用Java VisualVM,我注意到以前的webappClassLoader仍保留在JVM中,因此不会进行垃圾回收。

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

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

谢谢,

最佳答案

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

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

  • 启动Tomcat
  • 取消部署并重新部署有问题的应用程序
  • 使用探查器检查堆
  • 寻找WebappClassLoader的实例
  • 找到一个被牢固保留但属性为started = false的
  • 跟踪WebappClassLoader实例的GC根
  • 这将指向您的内存泄漏

  • 寻找造成内存泄漏的根本原因可能会有些困难。

    有关如何跟踪此类内存泄漏以及可能导致它们的原因的更完整说明,请参见以下演示文稿:http://people.apache.org/~markt/presentations/2010-08-05-Memory-Leaks-JavaOne-60mins.pdf

    07-24 13:51