爲什麼方法調用System.gc()
不能保證垃圾回收算法會在那一刻運行?爲什麼它無法回收所有未使用的對象的內存,只要它被調用?java - 垃圾回收
回答
- 強制對象銷燬是錯誤編碼的標誌,因此Java可能希望避免開發人員沉迷於其中。
- 如果Java允許您自由強制破壞對象,則不當使用它可能會對應用程序性能產生不利影響。
- 這個限制允許你(強迫你)把更多的精力到業務邏輯比內存managemnt
- JVM是當需要的內存管理,以及如何做決定的最佳人選。
- 您可以(應該)信任JVM,讓它以比我們更好的方式處理事情。
- 你還真的想強迫物體破壞嗎?如果是,爲什麼?
想象一下,能夠將動態分配的內存參數傳遞給該方法。等一下。 – 2013-03-23 16:48:04
爲了確保方案在JVM中運行平穩,JVM本身管理垃圾收集。 垃圾收集已變得相當複雜。當您詢問系統進行GC運行時,您期望使用哪種算法?一個「完整的GC」?還有很多堆,哪一個是你關心的垃圾?你不知道,這種方法不表示。
假設調用System.gc()
總是觸發完整的GC。一個錯誤的程序可能會輕易將JVM性能癱瘓。在防禦方面,JVM希望限制它響應這種調用的頻率。
如果您正在非嵌入式系統(例如服務器或臺式計算機)上的JVM中運行,除了監視它和代碼之外,沒有理由關心內存管理的任何方面有效率的。
不能肯定回收所有未使用對象的內存時,它被調用
你的這種假設是錯誤的。在大多數情況下,垃圾收集器可能會在任何時間點收回所有未使用的對象。但是,如果標準Java庫提供了一種保證的方法,那麼它將給GC子系統帶來完全不合理的負擔,以提供大部分時間無用甚至可能造成破壞的服務。
但是也有一些用來評估垃圾收集器性能的幾個指標,其中一些是:
- 吞吐量的垃圾收集沒有花總時間的百分比-The,認爲在很長一段時間。
- 垃圾收集開銷 - 吞吐量的倒數,即在垃圾回收中花費的總時間的百分比。
- 暫停時間 - 發生垃圾回收時應用程序執行停止的時間長度。
- 收集頻率 - 相對於應用程序執行而言,經常發生收集。
- 佔地面積 -a尺寸的度量,例如堆大小。
- 提示 - 當一個對象變成垃圾和當內存變爲 可用時之間的時間。
現在如果JVM聽System.gc()
想好寵物,並保證在每個System.gc()
調用執行動作,想象一下會是應用程序的性能,如果它被稱爲程序中的許多倍。!! ??
- 吞吐量將減少
- 垃圾收集開銷將增加。
- 由於應用程序忙於重新收集內存,所以會暫停多次。
- 如果佔用空間很大,垃圾收集器將不得不掃描所有內存區域以恢復內存,而不管是否存在符合垃圾收集條件的對象。
因此,通過這些點看後,我猜它提供了足夠的理由JVM上的應用程序選擇System.gc
不響應,但對自己的算法。 Garbage Collection肯定會回收所有未使用的對象的內存,但其調用完全依賴於JVM自己的算法,而不是用戶的選擇。
來源:內存管理在Java的HotSpot™虛擬機 - Sun Microsystems公司
- 1. Java:垃圾回收
- 2. Java:垃圾回收
- 3. java垃圾回收
- 4. Java垃圾回收5
- 5. 垃圾回收Java類
- 6. Java垃圾回收器
- 7. 垃圾收集java
- 8. Java垃圾收集
- 9. Java垃圾收集
- 10. JDBC垃圾回收
- 11. C#垃圾回收
- 12. Erlang垃圾回收
- 13. Python垃圾回收
- 14. JS垃圾回收
- 15. Javascript垃圾回收
- 16. PhoneGap垃圾回收
- 17. 因垃圾對象引用而導致的java垃圾回收
- 18. .Net 4垃圾回收
- 19. 垃圾回收操作
- 20. Perl中的垃圾回收
- 21. Java中String類的垃圾回收
- 22. Java EE:servlet容器中的垃圾回收
- 23. Java垃圾回收日誌消息
- 24. java中垃圾回收器的邏輯
- 25. Java 8字符串垃圾回收
- 26. Java列表和垃圾回收器
- 27. Java - 可用的垃圾回收算法
- 28. Java:使用jlibs保證垃圾回收
- 29. 垃圾回收 - 根節點
- 30. Perl XS垃圾回收
http://stackoverflow.com/q/66540/139010和http://stackoverflow.com/q/2414105/139010 – 2013-03-23 16:45:27