[英]Restricting JVM not to invoke GC
JVM究竟如何確定它應該是垃圾收集器?有沒有辦法限制JVM不要調用GC?
JVM究竟如何確定它應該是垃圾收集器?
這取決於。
如果您正在使用吞吐量收集器,那么當JVM無法在需要分配空間的空間(或其中一個空間)中分配新對象時,它將運行GC。
如果您使用的是低暫停收集器,那么當可用空間比率低於可配置級別時,JVM會觸發GC。
有沒有辦法限制JVM不要調用GC?
不。如果JVM決定它需要運行GC,它將運行它。 您唯一能做的就是告訴JVM忽略對System.gc()
應用程序代碼調用。
您無法告訴JVM不要調用GC,但您可以通過-XX:+DisableExplicitGC
告訴JVM忽略對System.gc()
調用。
通常,當其中一個堆區域接近滿時,JVM決定運行垃圾收集周期。 請注意,最終,決策取決於JVM。
至於指示JVM暫時不執行GC,沒有可靠和可移植的方法來執行此操作(除了完全避免堆分配)。
如果您正在嘗試最小化GC暫停,那么Java性能書籍有一些很好的材料。
這實際上取決於虛擬機的實現。
另一方面:
明確的垃圾收集請求是指示可能的性能問題的領頭羊。
不建議調用
System.gc()
,Runtime.getRuntime().gc()
和System.runFinalization()
。 無論是否使用-Xdisableexplicitgc
選項禁用垃圾收集,代碼都應具有相同的行為。 此外,“現代”jvms在處理垃圾收集方面做得非常好。 如果在應用程序中開發與內存泄漏無關的內存使用問題,則應該使用JVM選項而不是代碼本身。
一般來說GC只在需要時才運行。 例外,並發標記掃描將提前啟動,以避免必須停止應用程序。
恕我直言,最簡單/最好的解決方案是不要創造如此多的垃圾。 您可以使用內存分析器來減少生成的垃圾量。 這將減少您的集合的大小以及它們發生的頻率。 在極端情況下,您可以避免在白天甚至整整一周內收集。
減少垃圾的好處是減少使用垃圾刷新CPU緩存。 您的L3緩存只有幾MB而且您創建了幾MB垃圾,您將有效地推出有用信息,從而減慢您的應用程序速度。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.