2012-12-01 23 views
0

我期待到如何使用JConsole來檢測內存泄漏。
我看到Memory Pool在我的MBeans中,我可以爲我的Tenured Generation定義UsageThreashold
因此,如果我的應用程序超過此閾值,堆內存將在「內存」選項卡中變爲紅色。UsageMemory threashold在JConsole中

問:,這如何幫助?我的意思是我該如何使用這個設置來分析我的記憶?我該如何弄清楚這個值?

回答

0

在我看來,我認爲UsageThreashold參數對於檢測內存泄漏是最有幫助的(但如果有人知道一些技巧,請分享)。根據我的經驗,這個參數更有助於直觀地理解我的應用程序是否已經接近我的最大堆大小,並且有可能獲得OutOfMemoryException

使用JConsole搜索內存泄漏,我不認爲有一個銀色子彈的過程中仍然有關。但我通常做的是以下幾點:

如果存在內存泄漏,這意味着對象(被泄漏的)將不會被收集,因此,您Tenured Generation不會的任何金額後完全恢復地方選區。

在應用程序運行我連接JConsole,並嘗試通過後,我的應用程序的多個計算,也存在不同的選區(包括按Perform GC按鈕後,觀察內存選項卡,如果發現泄漏,這將導致全gc)內存永遠不會低於或至少達到內存值,它開始跟蹤,有很大可能性發生泄漏。當泄漏很大時,甚至可以在內存中看到「階梯圖」模式。

請記住,如果你的應用有很長的計算運行,這可能會消耗內存此分析必須小心。您必須瞭解這些流程何時完成。例如,只需運行其中一個計算,並在之前,之中和之後跟蹤內存的總體進化。

此外,我建議您嘗試visualVM來代替,因爲它也允許您創建堆轉儲,您可以使用它來了解哪些對象仍在內存中,並瀏覽參考圖來理解爲什麼它們不存在集。

+0

但是我們可以看到,如果應用程序是從附近的'Overview'或'Memory'標籤的最大堆大小反正。 – Cratylus

+0

@Cratylus:是的,這是很正確的,但如果JConsole的是你的重心不在你注意一些其他的監視器上運行,顏色變化,你可以很容易地從眼角的餘光發現是有幫助的。 – pabrantes

+0

雖然我不是100%肯定沒有其他用法,但我會接受這個答案,因爲沒有其他的東西出現了 – Cratylus

0

可以使用JMAP看到直方圖和/或創建堆轉儲和研究,如Eclipse MAT或YourKit工具的內存消耗。 JConsole的更多的是用於監控和運行MBean和更少的分析和我expirence JVisualvm是更好,因爲你可以用它來取樣你的代碼,看看有哪些方法佔用CPU。