2011-10-09 123 views
3

我收到有關正在啓動的線程的異常,而不是正在結束或正在停止。 WebappClassLoader抱怨這些線程會導致內存泄漏。Tomcat抱怨線程沒有停止

發生了什麼事嗎?

  1. 是否有可能這樣的線程會導致內存泄漏?或者可能嗎?
  2. Catalina是否過於敏感?
  3. 這是一個有效的編程技術嗎?

(管理一個Tomcat應用程序的這一方面是新的給我,但我要學習它的web應用程序運行了高負荷下的數據庫連接,這需要解決。搜索內存泄漏是一個。

回答

2

的數量,我們正在調查事情)您可以瞭解在http://wiki.apache.org/tomcat/MemoryLeakProtection在Tomcat中棘手的內存泄漏問題(這個警告尤其是) - 尤其是你的提醒你看:

如果一個webapp創建一個線程,默認情況下它的上下文classloader被設置爲父線程中的一個(創建新線程的線程)。在webapp中,這個父線程是tomcat工作線程之一,當它執行webapp代碼時,其上下文classloader被設置爲webapp類加載器。

此外,派生線程可能正在執行(或阻塞)涉及webapp加載的類的一些代碼,從而阻止收集webapp類加載器。

因此,如果生成的線程在應用程序停止時未正確終止,則由於生成的線程保留強引用,webapp類加載器將會泄漏。

這個(以我的經驗)的影響是有限的,當你啓動你的web應用程序一次,然後簡單地把它撕下來。但是,在某些情況下(例如在持續集成方案中(CI服務器將應用程序的構建重複部署到未重新啓動的Tomcat容器中)),可能會在JVM中快速耗盡內存。這最終將在您的PermGen地區中顯示爲OutOfMemoryException(假設您使用的是Sun/Oracle JVM)。有關PermGen的更多詳細信息,請參閱http://blogs.oracle.com/fkieviet/entry/classloader_leaks_the_dreaded_java

+0

我對影響應與之相似的理解與您的相似。無論如何,我們總是重新啓動Tomcat。 – staticsan