在 Tomcat 中重新部署应用程序时出现内存泄漏

2022-09-01 00:10:02

当我在tomcat中重新部署我的应用程序时,我遇到了以下问题:

 The web application [] created a ThreadLocal with key of type
 [java.lang.ThreadLocal] (value [java.lang.ThreadLocal@10d16b])
 and a value of type [com.sun.xml.bind.v2.runtime.property.SingleElementLeafProperty]
(value [com.sun.xml.bind.v2.runtime.property.SingleElementLeafProperty@1a183d2]) but 
 failed to remove it when the web application was stopped. 
 This is very likely to create a memory leak.

另外,我在我的应用程序中使用ehcache。这似乎也会导致以下异常。

     SEVERE: The web application [] created a ThreadLocal with key of type [null] 
     (value [com.sun.xml.bind.v2.ClassFactory$1@24cdc7]) and a value of type [java
     .util.WeakHashMap... 

ehcache似乎创建了一个弱哈希映射,我得到的消息是这很可能会造成内存泄漏。

我在网上搜索并找到了这个,http://jira.pentaho.com/browse/PRD-3616 但我无法访问服务器。

如果这些警告对功能有任何影响,请告诉我是否可以忽略它们?我在tomcat管理器中使用了“查找内存泄漏”选项,它说“未发现内存泄漏”


答案 1

重新部署应用程序时,Tomcat 会创建一个新的类装入器。旧的类装入器必须被垃圾回收,否则会出现 permgen 内存泄漏。

Tomcat无法检查垃圾回收是否有效,但它知道几个常见的故障点。如果 webapp 类装入器使用其类由 webapp 类装入器本身装入的实例设置 a,则 servlet 线程将保存对该实例的引用。这意味着类装入器不会被垃圾回收。ThreadLocal

Tomcat执行许多此类检测,请参阅此处以获取更多信息。清理线程局部变量很困难,您必须在从中访问的每个线程中调用 。实际上,这仅在开发过程中多次重新部署 Web 应用时才重要。在生产环境中,您可能没有重新部署,因此可以忽略这一点。remove()ThreadLocal

要真正找出哪些实例定义了线程局部变量,您必须使用探查器。例如,JProfiler中的堆步行者(免责声明:我的公司开发了JProfiler)将帮助您找到这些线程局部变量。选择报告的值类 (com.sun.xml.bind.v2.runtime.property.SingleElementLeafProperty 或 com.sun.xml.bind.v2.ClassFactory)并显示累积的传入引用。其中之一将是.为该传入引用类型选择引用对象,然后切换到分配视图。您将看到实例的分配位置。有了这些信息,你可以决定你是否可以对此做些什么。java.lang.ThreadLocal$ThreadLocalMap$Entry

enter image description here


答案 2

Mattias Jiderhamn有一篇优秀的6部分文章,非常清楚地解释了关于classloader泄漏的理论和实践。更好的是,他还发布了一个jar文件,我们可以将其包含在战争文件中。我在我的Web应用程序上尝试了它,jar文件就像一个魅力!jar 文件称为类加载器泄漏预防.jar。要使用它就像将其添加到我们的网络一样简单.xml

<listener>
  <listener-class>se.jiderhamn.classloader.leak.prevention.ClassLoaderLeakPreventor</listener-class>
</listener>

然后将其添加到我们的pom中.xml

<dependency>
  <groupId>se.jiderhamn</groupId>
  <artifactId>classloader-leak-prevention</artifactId>
  <version>1.15.2</version>
</dependency>

有关更多信息,请参阅 GitHub 上托管的项目主页或其文章的第 6 部分


推荐