2012-04-03 104 views
13

我在Tomcat的7
Web應用程序時我關閉Tomcat我看到這些警告(但不總是)catalina.out中的這些警告是什麼?

SEVERE: The web application [/MyApplication] created a ThreadLocal 
with key of type 
[org.apache.xml.security.algorithms.MessageDigestAlgorithm$1] (value 
[[email protected]2e2c]) 
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 
[[email protected]]) and a value of type 
[java.util.WeakHashMap] (value [{class 
[email protected]b17eb, 
class 
javax.xml.bind.a[email protected]178a178a, 
class 
[email protected]1c181c, 
class 
c[email protected]17711771, 
class 
c[email protected]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 
[[email protected]a90]) 
and a value of type [byte[]] (value [[[email protected]]) 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. 

什麼這些警告在catalina.out的意思是在關機?
我看到我提到的一些JAXB類,但不能說出問題在這裏。

請幫忙嗎?

回答

23

簡而言之,一些ThreadLocals沒有得到妥善清理。大多數(如果不是全部的話)J2EE服務器/應用程序容器爲傳入請求和其他任務使用線程池,以防止始終開始新線程的開銷。問題是某些庫(如果你不知道更好的話,你自己)在執行任務/請求結束後不清理它們的ThreadLocals。

通常,如在線程上執行的端模具,存儲在ThreadLocals的對象不再引用和垃圾收集器需要除去這種對象的護理:

每個線程保持其拷貝的隱​​式引用只要線程處於活動狀態並且可以訪問ThreadLocal實例 ,就可以使用線程局部變量 ;線程消失後,線程本地實例的所有副本都將受到垃圾回收(除非存在對這些副本的其他 引用)。

但是,當線程從線程池中取出時,它不會死亡,而是返回到池中。由於線程仍然活着,所以引用的ThreadLocals也是如此。當使用相同的ThreadLocal並且之前使用處理請求/任務的線程時,這表現爲內存泄漏和從一個請求到另一個請求的「泄漏」值。

+0

+ 1.我的代碼中沒有使用線程本地代碼。我可以更多地瞭解它嗎? – Jim 2012-04-06 10:03:06

+1

@Jim請參閱這裏進行監控:http://tomcat.apache.org/tomcat-7.0-doc/monitoring.html,啓用JMX遠程後,您可以使用例如JConsole(隨JDK提供)來訪問它。 ThreadLocals可能來自您正在使用的某個庫。作爲一個瘋狂的猜測,因爲這些警告並不總是出現,所以當你關閉應用程序時,某些庫可能會做某些事情,所以Tomcat *可能會給出誤報。如果應用程序的內存使用量在長時間使用後不會持續增長,並且您不經常重新部署,我不會爲此擔心。 – esaj 2012-04-06 12:40:01

10

至少JAXB消息之一似乎涉及一種已知的錯誤:

org.apache.catalina.loader.WebappClassLoader checkThreadLocalMapForLeaks重度:Web應用程序 [/所有MyApplication]建立一個ThreadLocal與鍵入 [com.sun.xml.bind.v2.ClassFactory $ 1](值爲 [[email protected]])和值爲 [java.util.WeakHashMap ]

請參閱JAXB-563JAXB-831(注 - 這些在java.net上,需要登錄才能查看)。第一個bug被認爲是固定的,但是正如其他人所評論的那樣,這並沒有完全解決。第二個bug有一個建議的解決方法,在讓上下文關閉之前強制執行gc(),這可以緩解問題(儘管不會完全消除該問題) - 您可以使用自定義ServletContextListener,並簡單地在contextDestroyed()方法中調用System.gc()

至於其他錯誤,你需要遵循其他答案的建議,並做一些嚴重的調試。

+0

男人,這似乎是我的問題,但我不能在Tomcat中啓動應用程序,因爲它不斷給我這個錯誤。我已經使用新的ServletContextListener更改了web.xml。有什麼建議麼? – 2013-05-08 21:20:51

+2

當我在Tomcat上運行Jersey並使用Datastax Cassandra驅動程序時,我遇到了這個問題。儘管我在contextDestroyed()中關閉了Cassandra集羣連接,但我每次重新部署應用程序時仍然收到線程/內存泄漏錯誤。在cluster.close()處理完問題後,添加System.gc()。 – 2014-05-14 23:44:34