2014-04-30 35 views
5

我們在運行Java應用程序的虛擬機上存在一些內存泄漏問題,舊Gen堆的使用量每天都在快速增長,所以我想創建堆轉儲來分析它。可以創建堆轉儲分析內存泄漏沒有垃圾收集?

但是,我注意到VisualVM將在堆轉儲之前執行完整的GC,這將清理舊的代碼,在這種情況下,堆轉儲將毫無用處。

我也試着用下面的命令:

JMAP轉儲:現場,格式= B,文件= heap.bin

它也將觸發一個完整的GC。

我可以問,如果沒有完整的GC(或沒有GC)可以創建堆轉儲的方法嗎?或者有沒有更好的方法來分析內存泄漏?

JDK版本:1.7.0_45

謝謝。

回答

3

要創建堆轉儲,將會有一個完整的GC。從堆中創建類直方圖時也是如此。

如果您想分析完整GC之間的內存泄漏,那麼使用Java分析器(Mission Control,jProfiler等)可能是內存分析是您唯一的選擇。

看到這個Q/A爲Java Mission Control Heap Profile

+0

我嘗試使用Mission Control並在VM上爲Flight Recorder添加-XX:+ UnlockCommercialFeatures -XX:+ FlightRecorder,但是我無法啓動應用程序。我收到錯誤消息說:「初始化JFR時出錯,JFR將被停用。java.lang.Exception:無法通過儀器Throwable! at oracle.jrockit.jfr.VMJFR.instrument(VMJFR.java:408) at oracle.jrockit .jfr.JFR.init(JFR.java:108)「 – zhengyu

+0

請參閱http://stackoverflow.com/q/19056826/772000 –

1

只是生活從選項中刪除,你應該是不錯的。當你向jmap提供「live」選項時。你迫使JVM運行一個完整的GC並捕獲那些應該是「活的」。 使用jmap -dump:format = b,file = hd.hprof。

+0

此方法工作得很好。 – alexandrul

相關問題