Java catalina.out中的这些警告是什么?

Java catalina.out中的这些警告是什么?,java,multithreading,jakarta-ee,tomcat,jaxb,Java,Multithreading,Jakarta Ee,Tomcat,Jaxb,我在Tomcat 7中有一个web应用程序。 当我关闭Tomcat时,我看到了这些警告(但并不总是) 这些警告在catalina.out关机时意味着什么? 我看到我提到的一些JAXB类,但不知道这里有什么问题 有什么帮助吗?您的应用程序中有一个或多个内存泄漏。有关发生这些问题的原因、哪些是您的错误以及您可以采取哪些措施来解决这些问题的完整解释,请参见本演示: 简言之,有些没有正确清洁。大多数(如果不是全部的话)J2EE服务器/应用程序容器使用线程池来处理传入的请求和其他任务,以防止始终启动新线程

我在Tomcat 7中有一个web应用程序。
当我关闭Tomcat时,我看到了这些警告(但并不总是)

这些警告在catalina.out关机时意味着什么?
我看到我提到的一些JAXB类,但不知道这里有什么问题


有什么帮助吗?

您的应用程序中有一个或多个内存泄漏。有关发生这些问题的原因、哪些是您的错误以及您可以采取哪些措施来解决这些问题的完整解释,请参见本演示:

简言之,有些没有正确清洁。大多数(如果不是全部的话)J2EE服务器/应用程序容器使用线程池来处理传入的请求和其他任务,以防止始终启动新线程的开销。问题是,一些库(如果您不太了解的话,还有您自己)在任务/请求执行结束后没有清理它们的threadlocal

通常,由于线程在执行结束时死亡,存储在ThreadLocals中的对象不再被引用,垃圾收集器负责删除这些对象:

每个线程都包含对其本地线程副本的隐式引用 变量,只要线程处于活动状态且ThreadLocal实例 交通便利;当一个线程消失后,它的所有副本 线程本地实例接受垃圾收集(除非其他 存在对这些副本的引用)


但是,当从线程池中提取线程时,它不会死亡,而是返回到线程池中。由于线程仍处于活动状态,因此引用的线程局部变量也处于活动状态。当使用相同的ThreadLocal并且处理请求/任务的线程以前使用过时,这表现为内存泄漏和从一个请求到另一个请求的值“泄漏”。

至少一条JAXB消息似乎与已知错误有关:

org.apache.catalina.loader.WebappClassLoader checkThreadLocalMapForLeaks严重:web应用程序 [/MyApplication]使用类型为的键创建了ThreadLocal [com.sun.xml.bind.v2.ClassFactory$1](值 [com.sun.xml.bind.v2.ClassFactory]$1@25442544])和类型的值 [java.util.WeakHashMap]

请参阅和(注意:这些都在java.net上,需要登录才能查看)。第一个bug被认为已经修复,但正如其他人所评论的,这还没有完全修复。第二个bug有一个建议的解决方法,即在让上下文关闭之前强制执行gc(),这确实缓解了问题(尽管不能完全消除问题)——您可以使用自定义的
ServletContextListener
,只需在
contextDestroyed()
方法中调用
System.gc()


至于其他错误,您需要遵循其他答案的建议,并进行一些认真的调试

+1用于链接,读起来很有趣。+1.我的代码中不使用线程局部变量。我如何进一步了解这一点?@Jim请参见此处以进行监视:,启用JMX remote后,您可以使用例如JConsole(随JDK提供)来访问它。ThreadLocals可能来自您正在使用的某个库。作为一种猜测,由于这些警告并不总是出现,所以当您关闭应用程序时,可能有某个库正在执行某些操作,因此Tomcat可能会给出误报。如果应用程序的内存使用在长时间使用时没有随着时间的推移而不断增长,并且你没有经常重新部署,我就不会那么担心了。伙计,这似乎是我的问题,但我不能在Tomcat中启动应用程序,因为它一直给我这个错误。我已经用新的ServletContextListener更改了web.xml。有什么建议吗?我在Tomcat上运行Jersey时遇到了这个问题,当时有Datasax Cassandra司机。尽管我关闭了contextDestroyed()中的Cassandra群集连接,但每次重新部署应用程序时都会出现线程/内存泄漏错误。在cluster.close()之后添加System.gc()解决了这个问题。
SEVERE: The web application [/MyApplication] created a ThreadLocal
with key of type
[org.apache.xml.security.algorithms.MessageDigestAlgorithm$1] (value
[org.apache.xml.security.algorithms.MessageDigestAlgorithm$1@2e2c2e2c])
and a value of type [java.util.HashMap] (value
[{http://www.w3.org/2000/09/xmldsig#sha1=MESSAGE DIGEST SHA-1}]) but
failed to remove it when the web application was stopped. Threads are
going to be renewed over time to try and avoid a probable memory leak.
Apr 3, 2012 1:56:19 PM org.apache.catalina.loader.WebappClassLoader
checkThreadLocalMapForLeaks   SEVERE: The web application
[/MyApplication] created a ThreadLocal with key of type
[com.sun.xml.bind.v2.ClassFactory$1] (value
[com.sun.xml.bind.v2.ClassFactory$1@25442544]) and a value of type
[java.util.WeakHashMap] (value [{class
com.classes.internal.ContactType=java.lang.ref.WeakReference@17eb17eb,
class
javax.xml.bind.annotation.adapters.HexBinaryAdapter=java.lang.ref.WeakReference@178a178a,
class
com.classes.internal.xjc.ListType=java.lang.ref.WeakReference@181c181c,
class
com.classes.internal.xjc.MessageType=java.lang.ref.WeakReference@17711771,
class
com.classes.internal.xjc.MessageType=java.lang.ref.WeakReference@17011701}])
but failed to remove it when the web application was stopped. Threads
are going to be renewed over time to try and avoid a probable memory
leak.   Apr 3, 2012 1:56:19 PM
org.apache.catalina.loader.WebappClassLoader
checkThreadLocalMapForLeaks   SEVERE: The web application
[/MyApplication] created a ThreadLocal with key of type
[org.apache.xml.security.utils.UnsyncBufferedOutputStream$1] (value
[org.apache.xml.security.utils.UnsyncBufferedOutputStream$1@4a904a90])
and a value of type [byte[]] (value [[B@67486748]) but failed to
remove it when the web application was stopped. Threads are going to
be renewed over time to try and avoid a probable memory leak.