2010-03-03 67 views
6

當對象被引用時,垃圾收集會自動調用,不再可用於任何變量。但是我喜歡知道爲什麼當垃圾收集被自動調用時,我們明確地調用System.gc()。當我們調用System.gc();關於垃圾收集。爲什麼我們需要調用System.gc();?

+0

你不應該調用System.gc()。你爲什麼認爲你需要給它打電話? – 2010-03-03 21:19:14

回答

6

我們沒有。

我們不這樣做。

也許我的經驗是有限的,但我有不是一次發現有必要調用System.gc()。

我將引用Brian Goetz在性能方面(如果你還沒有聽說過他,看他 - 和閱讀這篇文章的其餘部分,太):

第三類,開發人員經常錯誤地認爲他們正在幫助垃圾收集器使用System.gc(),這會觸發垃圾收集(實際上,它僅僅表明這可能是垃圾收集的好時機)。不幸的是,System.gc()觸發了一個完整的集合,其中包括跟蹤堆中的所有活動對象並清理和壓縮老一代。這可能是很多工作。

一般來說,最好讓系統決定何時需要收集堆以及是否進行完整收集。

10

你不知道。正如你所說,垃圾收集是自動的。 System.gc()甚至不強制垃圾收集;這只是提示JVM「現在可能是清理一下的好時機」

一般來說,試圖強制垃圾回收器使用System.gc()來做你想做的事情是一種破解認爲自己比實際做得更好的人,或者作爲破解代碼的(企圖)解決方法。

我已經多年編寫Java,我還沒有看到的情況下調用System.gc真的做正確的事(在什麼我已經寫了)

+0

我見過有缺陷的代碼,實際上System.gc()運行速度較慢,開發人員認爲他們知道的更好。 – 2010-03-03 18:18:36

+0

JVM的某些實現(主要用於嵌入式/低端硬件)承諾在System.gc()被調用時進行垃圾收集。你仍然不應該需要這個。 – Thirler 2010-03-03 18:25:24

+0

許多垃圾收集算法會中斷你的程序,阻止所有線程的執行,直到收割完成。過多地調用System.gc()會嚴重傷害性能,並且(幾乎)總是不必要的。 – Matthew 2010-03-03 18:25:57

1

你不需要它。把它看作是一個診斷工具,就像能夠寫入調試控制檯一樣。

例如,想象一下,如果您正在進行基準測試,您會希望告訴GC在每次基準測試運行後收集垃圾。

1

需要它。無論這些人說些什麼,這都非常有用。

用法示例: 假設您剛剛完成了使用大量內存的長時間後臺任務。這些對象都不會再被使用。由於任務花了很長時間,用戶不會在意5-10秒。這個垃圾收集的好時機。

如果你不是 GC在那一點,它將在稍後發生。可能在交互式使用該程序的過程中,用戶體驗變得不穩定。