2013-03-27 71 views
7

JVM如何確定它應該垃圾收集器?有什麼辦法可以限制JVM不調用GC嗎?限制JVM不調用GC

+8

不直接,沒有。你試圖解決的實際問題是什麼? – NPE 2013-03-27 07:20:46

+1

也許你可以買一臺具有無限內存的機器,但是這些很難找到:-)和無限昂貴:-) – 2013-03-27 07:22:56

+1

@VishalK鏈接不工作 – 2013-03-27 07:24:46

回答

4

你不能告訴JVM不要調用GC,但你可以告訴JVM忽略通過-XX:+DisableExplicitGC調用System.gc()

3

通常,JVM決定在其中一個堆區域接近滿時運行垃圾回收循環。請注意,最終決定取決於JVM。關於指示JVM暫時不執行GC,沒有可靠和便攜的方式來執行此操作(除了完全避免堆分配)。

如果您嘗試儘量減少GC暫停,Java Performance書有一些很好的材料。

5

JVM如何確定它應該垃圾收集器?

這取決於。

  • 如果使用吞吐量收集,然後JVM運行時無法分配的空間的新對象(或空間中的一個),它需要被分配的GC。

  • 如果您使用低暫停收集器,則當可用空間比下降到可配置級別時,JVM觸發GC。

有什麼辦法來限制JVM不會調用GC?

否。如果JVM決定需要運行GC,它將運行它。您唯一能做的就是告訴JVM忽略System.gc()的應用程序代碼調用。

1

這真的取決於虛擬機的實施。

在另一隻手:

垃圾收集明確要求是指示可能的性能問題的領頭羊。不建議

Code Correctness: Call to System.gc()

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

PMD Rule DoNotCallGarbageCollectionExplicitly

0

一般來說GC只有當它需要運行。例外情況,併發標記掃描將過早啓動以避免不必停止應用程序。

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

減少垃圾的一個好處是你減少了垃圾清理你的CPU緩存。你的L3緩存只有幾MB,你創建了幾MB的垃圾,你將有效地推出有用的信息,減慢你的應用程序。