2014-02-23 34 views
12

我正在調查Tomcat/Spring/Hibernate應用程序中的一些內存泄漏,這些應用程序在幾次重新部署之後導致可怕的「超出permgen」錯誤。我已經下載了免費版本的plumbr,這證實我有一個類加載器泄漏,但不幸的是我無法承擔499美元的詳細報告。有免費的工具可以執行等效分析並告訴我在哪裏尋找它?或者我可以調查的這種泄漏的其他常見原因?如何使用免費工具查找類加載器泄漏?

步驟我已經採取了迄今:

  • 確保我的JDBC驅動程序未註冊的情況下關機
  • 手動關閉MySQL驅動的AbandonedConnectionCleanupThread(每Tomcat Guice/JDBC Memory Leak

還有什麼可能是造成泄漏?

+3

作爲部分答案我自己的問題,還有的類加載器泄漏的常見原因的完整列表在這裏:HTTP:// java的.jiderhamn.se/2012/02/26/classloader-leaks-v-common-errors-and-known-offenders/ – Jules

+0

哪個版本的Tomcat可以使用? Tomcat 7. +確實支持memleak檢測 – fge

+0

我在tomcat 7上,並且已經修復了它可以檢測到的所有泄漏,但是其他地方仍然有泄漏。 – Jules

回答

5

您可以使用evaluation version of JProfiler來調查類加載器泄漏。轉到類加載器探針,選擇一個泄漏類加載器,並將它們顯示在堆棧中,您可以在其中調查對類加載器加載的類的強引用。有一個screen cast,告訴你如何做到這一點。

免責聲明:我公司開發JProfiler。

+0

謝謝。它看起來像一個有用的工具,但在我看到這個迴應之前,我找到了另一種方式。 – Jules

4

我發現Eclipse的內存分析工具工作得很好。我將服務器設置爲生成堆轉儲並使用MAT(大致按照指南here)查找所有類加載器。看來相關的是org.apache.catalina.loader.WebappClassLoader,通過列出他們的GC根,我很容易地發現我的問題是由間接引用的java.util.logging.Level造成的。

現在我只需要弄清楚如何防止JBoss的日誌這樣做......

+0

答案是確保它支持的日誌目標之一存在於類路徑中。我選擇了log4j,它只需要放入我的WEB-INF/lib目錄。 – Jules