2011-07-27 137 views
8

我正在使用MAT來比較兩個堆轉儲。我每天都在堆轉儲,每天增長大約200兆。我認爲泄漏與java.util.zip有關,因爲表格顯示的是什麼,也因爲我們最近添加了一個新的過程,它可以對許多文件進行壓縮和解壓縮。 (見圖片)我需要幫助找到我的內存泄漏使用MAT

Heap dump histogram compare

在這一點上,我打開支配並過濾。 Inflater。這產生了一個大的java.util.zip.Inflater列表。現在我想看看這些開放的東西是什麼,所以我選擇了一個並運行GC根目錄(不包括弱和軟引用)(參見圖片)。

GC Root

它看起來像這樣具有與罐子通貨膨脹和無關,與我的過程中做。在這一點上我卡住了,需要一些建議。

編輯1

肖恩被問及ThreadLocals。如果你看看沒有過濾器的dominator_tree,你會發現java.lang.ApplicationShutdownHooks是堆的58%。如果我展開其中的一些條目,您可以看到它們似乎位於ThreadLocalMap中。我將如何找到將它們放在那裏的東西?

enter image description here

EDIT 2

肖恩的評論把我正確的軌道上。我使用的是Glassfish v 2.0,它有一個memory leak。它不斷創建新的LogManagers並將它們添加到ApplicationShutdownHooks集合中。

我通過破解ApplicationShutdownHooks並手動刪除集合中的對象來解決這個問題。

+0

所有到GC根的實例路徑是這樣的嗎?這可能是這不是一個有代表性的樣本。 –

+0

有16k個實例,所以有可能有些不同。我看過幾個,他們也是一樣的。有誰知道爲什麼我的圖像沒有顯示? – Preston

+0

他們對我來說很好。 –

回答

0

肖恩的評論讓我走上了正確的軌道。我使用的是Glassfish v 2.0,它有內存泄漏。它不斷創建新的LogManagers並將它們添加到ApplicationShutdownHooks集合中。

我通過破解ApplicationShutdownHooks並手動刪除集合中的對象來解決這個問題。