簡體   English   中英

限制JVM不要調用GC

[英]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()

不建議調用System.gc()Runtime.getRuntime().gc()System.runFinalization() 無論是否使用-Xdisableexplicitgc選項禁用垃圾收集,代碼都應具有相同的行為。 此外,“現代”jvms在處理垃圾收集方面做得非常好。 如果在應用程序中開發與內存泄漏無關的內存使用問題,則應該使用JVM選項而不是代碼本身。

PMD規則DoNotCallGarbageCollection明顯地

一般來說GC只在需要時才運行。 例外,並發標記掃描將提前啟動,以避免必須停止應用程序。

恕我直言,最簡單/最好的解決方案是不要創造如此多的垃圾。 您可以使用內存分析器來減少生成的垃圾量。 這將減少您的集合的大小以及它們發生的頻率。 在極端情況下,您可以避免在白天甚至整整一周內收集。

減少垃圾的好處是減少使用垃圾刷新CPU緩存。 您的L3緩存只有幾MB而且您創建了幾MB垃圾,您將有效地推出有用信息,從而減慢您的應用程序速度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM