gpt4 book ai didi

java - 在 Tomcat 中重新部署应用程序时发生内存泄漏

转载 作者:可可西里 更新时间:2023-11-01 14:56:39 25 4
gpt4 key购买 nike

当我在 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 管理器中使用了“查找内存泄漏”选项,它显示“未发现内存泄漏”

最佳答案

当您重新部署您的应用程序时,Tomcat 会创建一个新的类加载器。必须对旧的类加载器进行垃圾回收,否则会导致 permgen 内存泄漏。

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

Tomcat 进行了大量此类检测,请参阅 here for more information .清理线程局部变量很困难,您必须在访问的每个线程中的 ThreadLocal 上调用 remove()。实际上,这仅在开发期间多次重新部署 Web 应用程序时才重要。在生产中,您可能不会重新部署,因此可以忽略这一点。

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

enter image description here

关于java - 在 Tomcat 中重新部署应用程序时发生内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39491508/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com