当我在 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 会创建一个新的类加载器。旧的类加载器必须进行垃圾收集,否则会出现永久内存泄漏。
Tomcat 无法检查垃圾收集是否有效,但它知道几个常见的故障点。如果 webapp 类加载器设置了ThreadLocal
对于其类由 webapp 类加载器本身加载的实例,servlet 线程保存对该实例的引用。这意味着类加载器不会被垃圾收集。
Tomcat 进行了许多此类检测,请参阅此处了解更多信息。清理线程局部变量很困难,你必须调用remove()
on the ThreadLocal
在从中访问的每个线程中。实际上,只有在开发过程中多次重新部署 Web 应用程序时,这一点才重要。在生产中,您可能不会重新部署,因此可以忽略这一点。
要真正找出哪些实例定义了线程局部变量,您必须使用分析器。例如堆遍历器JProfiler(免责声明:我的公司开发了 JProfiler)将帮助您找到那些线程局部变量。选择报告的值类(com.sun.xml.bind.v2.runtime.property.SingleElementLeafProperty 或 com.sun.xml.bind.v2.ClassFactory)并显示累积的传入引用。其中之一将是java.lang.ThreadLocal$ThreadLocalMap$Entry
。选择该传入引用类型的引用对象并切换到分配视图。您将看到实例已分配到的位置。有了这些信息,您就可以决定是否可以采取行动。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)