JVM如何確定它應該垃圾收集器?有什麼辦法可以限制JVM不調用GC嗎?限制JVM不調用GC
回答
你不能告訴JVM不要調用GC,但你可以告訴JVM忽略通過-XX:+DisableExplicitGC
調用System.gc()
。
通常,JVM決定在其中一個堆區域接近滿時運行垃圾回收循環。請注意,最終決定取決於JVM。關於指示JVM暫時不執行GC,沒有可靠和便攜的方式來執行此操作(除了完全避免堆分配)。
如果您嘗試儘量減少GC暫停,Java Performance書有一些很好的材料。
JVM如何確定它應該垃圾收集器?
這取決於。
如果使用吞吐量收集,然後JVM運行時無法分配的空間的新對象(或空間中的一個),它需要被分配的GC。
如果您使用低暫停收集器,則當可用空間比下降到可配置級別時,JVM觸發GC。
有什麼辦法來限制JVM不會調用GC?
否。如果JVM決定需要運行GC,它將運行它。您唯一能做的就是告訴JVM忽略System.gc()
的應用程序代碼調用。
這真的取決於虛擬機的實施。
在另一隻手:
垃圾收集明確要求是指示可能的性能問題的領頭羊。不建議
Code Correctness: Call to System.gc()
呼叫至
System.gc()
,Runtime.getRuntime().gc()
和System.runFinalization()
。無論是否使用選項-Xdisableexplicitgc
禁用垃圾收集,代碼應該具有相同的行爲。此外,「現代」jvms在處理垃圾收集方面做得非常好。如果在應用程序中開發與內存泄漏無關的內存使用問題,則應該使用JVM選項而不是代碼本身處理。
一般來說GC只有當它需要運行。例外情況,併發標記掃描將過早啓動以避免不必停止應用程序。
恕我直言,最簡單/最好的解決方案是不創造這麼多的垃圾。您可以使用內存分析器來減少您正在生產的垃圾量。這將減少收藏的大小以及它們發生的頻率。在極端情況下,您可以避免在白天或甚至一整週內收集。
減少垃圾的一個好處是你減少了垃圾清理你的CPU緩存。你的L3緩存只有幾MB,你創建了幾MB的垃圾,你將有效地推出有用的信息,減慢你的應用程序。
- 1. JVM由於無限GC而掛起
- 2. JVM gc日誌不旋轉
- 3. 瞭解JVM GC
- 4. JVM和GC調優 - 理論沒有完整的GC
- 5. 超出GC開銷限制
- 6. 有沒有一種方法可以將GC限制在JVM中特定的CPU%?
- 7. 調整高響應服務器應用程序的JVM(GC)
- 8. 設置火花性能調整參數,outOfMemoryError超過Gc和GC限制
- 9. 將連續的JVM綁定調用限制到同一端口
- 10. icCube java.lang.OutOfMemoryError:超過GC開銷限制
- 11. java.lang.OutOfMemoryError:超出GC開銷限制
- 12. GC開銷超出限制 - 陣列
- 13. 超出GC開銷限制 - Android Studio
- 14. 阿卡 - GC開銷超過限制
- 15. Robolectric。 Maven OutOfMemoryError:超出GC開銷限制
- 16. Tomcat7 - GC開銷超過限制
- 17. smartgwt超過gc開銷限制
- 18. Jmeter java.lang.OutOfMemoryError:超出GC開銷限制
- 19. 使用JVM GC參數-XX:SurvivorRatio = 8不工作
- 20. JVM性能調整:年輕人副本VS老一代GC
- 21. 針對少量和長時間GC運行的JVM調優
- 22. 完整的GC - Sun JVM運行頻率
- 23. jvm conf正常gc在高負載下
- 24. 爲什麼我得到'java.lang.OutOfMemoryError:超出GC開銷限制',如果我有大量的可用內存給JVM?
- 25. 內存不足錯誤 - 超出GC開銷限制
- 26. JVM如何增加常量池限制
- 27. JVM/Aplication服務器線程限制
- 28. 在JVM崩潰轉儲中調用的標準並行GC是什麼?
- 29. 鼓勵JVM進行GC而不是增加堆?
- 30. 「java.lang.OutOfMemoryError:超出GC開銷限制」中的過長GC時間的持續時間
不直接,沒有。你試圖解決的實際問題是什麼? – NPE 2013-03-27 07:20:46
也許你可以買一臺具有無限內存的機器,但是這些很難找到:-)和無限昂貴:-) – 2013-03-27 07:22:56
@VishalK鏈接不工作 – 2013-03-27 07:24:46