为什么 webappclassloader 没有被垃圾回收?

问题描述 投票:0回答:1

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

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

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

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

谢谢,

java hibernate tomcat memory-leaks garbage-collection
1个回答
4
投票

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

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

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

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

有关如何追踪此类内存泄漏以及可能导致其发生的原因的更完整说明,请参阅此演示文稿:https://tomcat.apache.org/presentations/2010-08-05-javaone-Memory-Leaks-60mins .pdf

© www.soinside.com 2019 - 2024. All rights reserved.