2012-03-13 37 views
0

我想在我沒有設計的程序中找到內存泄漏(我是新來的項目)。由於這是一個相當大的計劃,我遇到了一些麻煩。我嘗試了一些分析器,當嘗試跟蹤分配堆棧跟蹤以查看哪些對象佔用了所有內存時,大多數分析器都掛起或崩潰。找出什麼對象垃圾收集器正在發佈:

我在線程中運行System.gc();並試圖找出它究竟是釋放/釋放的。從配置文件中,我可以看到它發佈,但我需要知道它正在發佈什麼。

有沒有什麼方法從垃圾回收器獲取運行時的信息,以瞭解它釋放/釋放哪些對象?

如果不是,或者如果這是一個糟糕的方法來考慮嘗試解決這個問題,那麼其他建議將不勝感激。

+0

一個分析器是你所需要的。找到一個有效的。或者弄清楚爲什麼你嘗試失敗的人。 – 2012-03-13 06:55:39

回答

1

我會用一個內存分析器找到內存泄漏。你可以從VisualVM開始。這可能會發現你的問題,但如果它不嘗試一個像YourKit這樣的商業分析器的評估版本。

這些工具不僅可以告訴你什麼正在被丟棄,而且它首先在哪裏創建。它有一個圖形界面,所以你可以看到最大或最多的。

+0

這些看起來好多了比我所用的配置文件。謝謝! – 2012-03-22 06:46:41

2

我的首選查找內存泄漏的方法是通過使用-XX:+HeapDumpOnOutOfMemoryError作爲JVM啓動參數或使用jsconsole/jmap「按需」等待它發生(遵循OOM)來觸發堆轉儲。

然後運行(平時大)通過優良的MAT轉儲文件 http://www.eclipse.org/mat/

+0

內存分析也可以通過另一個Eclipse插件'TPTP'來完成。 http://www.eclipse.org/articles/Article-TPTP-Profiling-Tool/tptpProfilingArticle.html – Jayy 2012-03-13 07:10:41

+0

是的,但不幸的是,TPTP似乎不喜歡我正在使用的OSX ... – 2012-03-13 07:22:42

0

我沒有確切的解決方案,哪個對象將通過System.gc()實現;

但Java提供了內置的GUI工具設施Java監視和管理控制檯

您發現JConsole的在Java/bin文件夾中運行它:使用命令

cd $JAVA_HOME/bin 
./jconsole