據我所知,我們不能強制垃圾收集在JAVA中。我們可以做的最好的方式是通過致電System.gc()
或Runtime.gc()
發送請求。這樣做會將垃圾收集請求發送給JVM,但不保證垃圾收集會發生。所以我的問題是:是否有任何特殊原因,爲什麼 JVM的設計方式不支持Force Garbage Collection?爲什麼JVM的設計方式不允許強制垃圾收集?
回答
強制垃圾收集效率低下,在大多數情況下不需要,如果您已經正確編寫了程序,則不必要。
參考:
事實證明,如果你控制將運行應用程序(或applet或servlet或其他)的JVM啓動,那麼你可以確保通話System.gc()
將運行GC。或者至少,Sun/Oracle JVM的情況就是這樣......在java
命令中通過-XX
選項控制行爲。
javadoc正在做的一點是,這是平臺依賴的,並且便攜式應用程序不能依賴它。
至於你的問題:
爲什麼JVM設計的方式,它不支持強制垃圾回收?
這樣可以保護JVM免受嚴重寫入代碼的性能影響;例如在小應用程序,插件,第三方庫等
(我想,部分原因是原來的Sun工程師有點厭倦了抱怨「Java很慢」,當真正的問題是不必要的人打電話給System.gc()
...)
1 - 但並不總是這樣。例如,在方便的時候撥打System.gc()
可以避免在不方便的時間進行GC相關的暫停。但是,如果您的代碼只在某些點運行GC時才起作用,那麼您的執行有問題。
Java的設計使得(與C++不同)您不必關心回收廢棄的內存。如果運行時內存配置正確,則不需要關心垃圾回收。話雖如此,做一個gc()通常會觸發年輕一代空間的掃蕩。
天哪,我在這裏認爲已經爲C++實現的垃圾收集器實際上工作了!除此之外,垃圾收集不**意味着你可以忽略內存管理。很容易創建[Java中的內存泄漏](http://stackoverflow.com/questions/6470651/creating-a-memory-leak-with-java)。 –
@PeteBecker - 你是指保守的C++收藏家,比如Boehm GC,智能指針或其他什麼? –
@StephenC - 智能指針是自動內存管理的一種形式,但它們不是垃圾收集。 –
- 1. OpenJDK的1.6 JVM垃圾收集設置
- 2. JVM垃圾收集算法
- 3. 爲什麼JVM做這麼多的垃圾收集
- 4. Java垃圾收集允許死鎖?
- 5. 爲什麼這是垃圾收集
- 6. 爲什麼FastBitmap無法收集垃圾?
- 7. 默認的垃圾收集的JVM
- 8. 有沒有垃圾收集器的JVM?
- 9. 強制垃圾回收
- 10. 梅克不允許我的進程垃圾收集
- 11. 熱點JVM垃圾收集器
- 12. 如何分析JVM垃圾收集?
- 13. 垃圾收集
- 14. 方法和垃圾收集
- 15. 如果允許JVM在垃圾收集期間移動堆內存,那麼由於移動指針,垃圾收集不會導致JNI爆炸?
- 16. 什麼是垃圾收集器?
- 17. 什麼觸發垃圾收集
- 18. 什麼觸發java垃圾收集器
- 19. 計時器不會收集垃圾
- 20. 垃圾收集YGCT和垃圾收集時間不斷上升
- 21. 垃圾收集設置對象爲null
- 22. 爲什麼帶有綁定的WPF UserControl不會收集垃圾?
- 23. 爲什麼不收集TInterfacedObject垃圾的後代?
- 24. 爲什麼運行ScheduleExecutorService的UserThread不會被垃圾收集
- 25. jstat爲G1垃圾收集
- 26. 可以將JVM的方法區域垃圾收集?
- 27. 不同的垃圾收集行爲
- 28. 不良垃圾收集
- 29. 允許Android應用程序更快地被垃圾收集?
- 30. 爲什麼垃圾收集不列入銷燬spring容器
爲什麼要這樣呢?如何強制垃圾收集? – Henry
*特殊的* JVM實現*可能*選擇保證這樣做會執行GC。 Oracle/Open JDK不。那麼這裏的問題是:「爲什麼*實現原因* gc'不會立即強制在標準JVM中停止GC?」 – user2864740
假設你想在不適當的時候避免GC暫停,你可以通過使用一個低暫停的垃圾回收器(如CMS或者G1)並且擁有用於連續需要類型的對象的對象池來抵消它們。這應該將_stop-the-world_事件減少到最低程度,因爲對象池應該能夠抵消堆碎片,這是CMS和G1的致命弱點。 – mucaho