在VisualVM中研究我的應用程序的行爲時,我遇到了這個問題並感到困惑,我認爲執行垃圾收集的JMX調用與調用System.gc()
具有相同的功能,但是在我嘗試過的所有環境中, JMX調用總是導致堆使用率較小,然後調用System.gc()
,功能上有什麼區別?JMX垃圾回收和System.gc()之間的區別?
您可以在最後一滴看到 - 我手動點擊執行GC按鈕,我的使用率降到低一點,然後它已經與正規系統集合。想一想爲什麼會這樣?
我已經在多個環境中嘗試了這一點,將集合留給系統並手動調用System.gc()
,每次JMX調用都會清除更多。
正如你所張貼的圖片中看到,系統垃圾收集運行時,JMX調用只是清除更,問題是這兩個調用之間的區別?
這取決於你的應用程序的使用和對象分配。如果您的應用程序中生成的很多短期對象沒有收集到,儘管頻繁的GC不會發生,因爲GC本身是開銷/停止世界。所以如果您手動執行GC,則可以清除這些對象。 –
用於'System.gc()'的JavaDoc:「調用gc方法**建議** Java虛擬機花費大量的工作來回收未使用的對象,以便使其當前佔用的內存可供快速重用。在這個方法調用中,Java虛擬機已經盡了最大努力**從所有被丟棄的對象中回收空間。「在實踐中,如果Java認爲結果不值得這項工作,它甚至可能決定什麼也不做。 「強制」的jmx調用可能會強制GC盡其所能。取決於實際的代碼。 –
@tb,如果我的問題不清楚,我很抱歉,爲了更好地解釋我自己,我稍微編輯了一下。您可以在發佈的圖像中看到正在定期調用'System.gc()'調用,JMX調用結束時我的堆使用率降至接近0;問題是系統垃圾收集和JMX垃圾收集有什麼區別?似乎有不同的功能。 –