2012-06-07 105 views
7

我遇到了tomcat 5.5和tomcat 6.0服務器的這個奇怪問題。我有兩個將安裝在tomcat上的web應用程序。當tomcat啓動時,這兩個web應用程序也同時啓動,但有時一個web應用程序由於初始化失敗而無法初始化,另一個應用程序在運行時出現classnotfoundexception錯誤。在tomcat 7.0中,即使其他應用程序初始化失敗,應用程序仍可正常運行。Tomcat 5.5和Tomcat 6.0中的ClassNotFoundException錯誤

經過一些調試後,我發現有一個jar名爲crystal.jar,它位於兩個應用程序的web-inf/lib文件夾中。我已經將jar移動到tomcat的common/lib文件夾,然後它開始工作正常。我想知道爲什麼它在tomcat 7.0中工作正常,而不是在tomcat 5.x和tomcat 6.x版本中。這些版本之間的類加載架構有沒有改變?

感謝

EDIT1:庫是在兩個應用程序的WEB-INF \ lib目錄中的位置和它們與外部DLL不存在依賴關係。剛纔我讀到了關於tomcat 5.5的類加載器體系結構,並且知道每個Web應用程序都有它自己的類加載器。 WEB-INF \ lib文件夾和classes文件夾中的庫將被加載到這個類加載器中。存儲在公共目錄下的庫將被放置到共享類加載器中。然後,這個庫應該單獨加載到Web應用程序的獨立類加載器中。即使一個Web應用程序無法啓動其他Web應用程序,也應該獨立工作。這就是爲什麼我感到奇怪,需要調查furthur。

回答

6

終於找到了這個問題

存在一個已知種類的PermGen內存泄漏的答案,當庫班 是由系統類引用,因此其生活時代超越。一個是 的例子是當Java發現一個JDBC驅動程序或其他服務 並「自動註冊」它。它在 系統中保持引用,但該類本身屬於Web應用程序,並且在應用程序停止時必須卸載 --但由於該引用而不能加載該文件。並非所有這些參考文獻都很容易清楚。

在這種情況下,一個典型的症狀是依賴於這個系統的功能第一web應用 會成功,但第二和 其他的將失敗(因爲這是在 系統中註冊的服務屬於第一web應用程序,並且不能從 第二個應用程序的類加載器中看到類,反之亦然)。

對於某些已知的PermGen內存泄漏,其默認 配置中,Tomcat 7和最新版本的Tomcat 6具有更好的保護 。

Tomcat 5.5根本沒有這種保護。

編輯一些參考

http://people.apache.org/~markt/presentations/2010-08-05-Memory-Leaks-JavaOne-60mins.pdf http://people.apache.org/~markt/presentations/2010-11-04-Memory-Leaks-60mins.pdf

http://eclipse.org/mat/

http://wiki.apache.org/tomcat/FAQ/Troubleshooting_and_Diagnostics http://wiki.apache.org/tomcat/MemoryLeakProtection

+0

所以你剛纔提高MaxPermSize參數,對不對? –