2015-06-07 27 views
13

據我所知,我們不能強制垃圾收集在JAVA中。我們可以做的最好的方式是通過致電System.gc()Runtime.gc()發送請求。這樣做會將垃圾收集請求發送給JVM,但不保證垃圾收集會發生。所以我的問題是:是否有任何特殊原因,爲什麼 JVM的設計方式不支持Force Garbage Collection?爲什麼JVM的設計方式不允許強制垃圾收集?

+1

爲什麼要這樣呢?如何強制垃圾收集? – Henry

+6

*特殊的* JVM實現*可能*選擇保證這樣做會執行GC。 Oracle/Open JDK不。那麼這裏的問題是:「爲什麼*實現原因* gc'不會立即強制在標準JVM中停止GC?」 – user2864740

+0

假設你想在不適當的時候避免GC暫停,你可以通過使用一個低暫停的垃圾回收器(如CMS或者G1)並且擁有用於連續需要類型的對象的對象池來抵消它們。這應該將_stop-the-world_事件減少到最低程度,因爲對象池應該能夠抵消堆碎片,這是CMS和G1的致命弱點。 – mucaho

回答

16

強制垃圾收集效率低下,在大多數情況下不需要,如果您已經正確編寫了程序,則不必要。

參考:

事實證明,如果你控制將運行應用程序(或applet或servlet或其他)的JVM啓動,那麼你可以確保通話System.gc()將運行GC。或者至少,Sun/Oracle JVM的情況就是這樣......在java命令中通過-XX選項控制行爲。

javadoc正在做的一點是,這是平臺依賴的,並且便攜式應用程序不能依賴它。


至於你的問題:

爲什麼JVM設計的方式,它不支持強制垃圾回收?

這樣可以保護JVM免受嚴重寫入代碼的性能影響;例如在小應用程序,插件,第三方庫等

(我想,部分原因是原來的Sun工程師有點厭倦了抱怨「Java很慢」,當真正的問題是不必要的人打電話給System.gc() ...)


1 - 但並不總是這樣。例如,在方便的時候撥打System.gc()可以避免在不方便的時間進行GC相關的暫停。但是,如果您的代碼只在某些點運行GC時才起作用,那麼您的執行有問題。

3

Java的設計使得(與C++不同)您不必關心回收廢棄的內存。如果運行時內存配置正確,則不需要關心垃圾回收。話雖如此,做一個gc()通常會觸發年輕一代空間的掃蕩。

+1

天哪,我在這裏認爲已經爲C++實現的垃圾收集器實際上工作了!除此之外,垃圾收集不**意味着你可以忽略內存管理。很容易創建[Java中的內存泄漏](http://stackoverflow.com/questions/6470651/creating-a-memory-leak-with-java)。 –

+0

@PeteBecker - 你是指保守的C++收藏家,比如Boehm GC,智能指針或其他什麼? –

+0

@StephenC - 智能指針是自動內存管理的一種形式,但它們不是垃圾收集。 –