2015-05-05 40 views
6

我對我的應用程序使用GC選項XX:+UseParNewGC-XX:+UseConcMarkSweepGC如何使JVM釋放內存回到操作系統

由於大多數人已經遇到JVM,因此可以將堆增加到最大堆大小,但是它不會將內存釋放回操作系統。我遇到了-XX:MaxHeapFreeRatio-XX:MinHeapFreeRatio,但這些在並行垃圾收集器中被忽略。

是否有特殊的選項來強制JVM釋放內存返回操作系統的-XX:MaxHeapFreeRatio and -XX:MinHeapFreeRatio組合。

+0

那麼..即使你找到這些東西的選擇,他們不保證跨體系結構工作。 – TheLostMind

+0

@TheLostMind - 是'-XX:MaxHeapFreeRatio'和'-XX:MinHeapFreeRatio'保證可以在Oracle的64位linux JVM上工作 我不太確定如果上面的參數是'-XX:MaxHeapFreeRatio'和'-XX:MinHeapFreeRatio'僅適用於串行垃圾收集器或不適用。爲此我發現了矛盾的引文。 – Pushkar

+0

XX:+ UseParNewGC與最大和最小堆空閒比率確實釋放內存回操作系統在java 1.8.0_73以上,至少我的Windows 64位安裝。但是,如果您沒有明確向GC提出問題,則可能只會在操作系統受到內存壓力時決定這麼做。最後,我不知道UseConcMarkSweepGC選項是否改變了這一點。 – nsandersen

回答

5

在我的Java 1.8.0_45 -XX上:+ UseG1GC使內存縮小。這是我的測試:

MemoryPoolMXBean m = ManagementFactory.getMemoryPoolMXBeans().get(5); 
    System.out.println(m.getName()); 
    byte[] a = new byte[512 * 1024 * 1024]; 
    System.out.println(m.getUsage().getCommitted()/1024/1024); 
    a = null; 
    System.gc(); 
    Thread.sleep(1000); 
    System.out.println(m.getUsage().getCommitted()/1024/1024); 
+0

我需要調整除垃圾收集器切換到G1GC以外的任何參數嗎? – Pushkar

+1

如果G1GC啓用Shrkinging,那麼-XX:MaxHeapFreeRatio和-XX:MinHeapFreeRatio也應該工作 –