2013-10-11 44 views
-1

我的代碼是:System.gc()的垃圾收集

class Test{ 
    Test c=new Text(); 
    System.out.println(c.size()); 
    System.gc(); 
} 

程序員可以在Java垃圾收集使用System.gc()?它是可取的嗎? JVM自動執行,那麼爲什麼程序員要調用System.gc()

+3

請參閱http://stackoverflow.com/questions/2414105/why-is-it-a-bad-practice-to-call-system-gc – Mureinik

+0

基本上唯一的原因就是爲了簡化一點調試模糊的內存泄漏,它*仍然*不能保證完整的GC時間,所以它不能被依賴。 – kiheru

回答

1

即使你使用System.gc()也不能保證內存將調用gc方法暗示被釋放

oracle網站 Java虛擬機了一些努力,以使內存回收未使用的對象他們目前佔用可用於快​​速重用。當控制從方法調用返回時,Java虛擬機已盡最大努力從所有被丟棄的對象中回收空間。

+0

那麼我們如何才能釋放內存呢? – Pinky

+0

@Pinky你可以像String一樣將它引用爲null x = null – SpringLearner

+1

@javaBeginner壞主意。你應該設計得更好,所以你不必將引用設置爲null。 –

2

你可以稱之爲它。這不會有什麼壞處。但是沒有人會記住你所期望的對象的記憶立即獲得或沒有。

JVM通過異步運行GC,我們不需要驅動它。 JVM智能足以釋放記憶。

只是爲了知道目的,它是好的,如果你真的想清除內存,由於XYZ原因,肯定是在你的程序結構的設計缺陷。

2

System.gc()向GC發送請求以執行收集週期。這個請求可能會被服務,或者可能被忽略,因此這兩個結果都不應該被依賴。

垃圾回收週期將發生自動(無需您進行任何操作)的時候,通常負責新對象的分配產生已滿或分配請求不能被滿足的。

在大多數情況下,您根本不需要在代碼中調用System.gc()System.gc()應該在幾種情況下使用,其中的條件類似於以下情況:

  • 您知道大量內存已變得無法訪問。
  • 重要的是快速釋放這些內存量。
    • 您的程序即將進入時間關鍵狀態,GC循環應儘可能晚(或根本不會),因此它有助於在進入該狀態之前執行GC循環。
  • 對於目標環境的GC如何工作,至少有一個大概的想法。
  • 您已經驗證該GC的策略對於您的場景而言並非最佳策略。
+1

感謝您的理由。它的有用 – Pinky

+1

@Pinky我希望你也能從中得到,幾乎所有情況下你都不應該這樣稱呼它,除非你真的知道你在做什麼。 –