Java堆 - 大于它需要的

时间:2017-05-10 17:14:48

标签: java memory

我的数学表明以下Java程序需要大约8GB(2147483645 * 4字节)的RAM:

package foo;

public class Foo {
    public static void main(String[] args) throws Exception {
        int[] arr = new int[Integer.MAX_VALUE-2];
        Thread.sleep(500000L);
    }
}

通过在运行时观察程序来备份: jvisualvm memory pic

但除非您将最大堆设置为大约12.5GB,否则程序无法启动:

$ java -Xmx12000m -cp ./ foo.Foo
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at foo.Foo.main(Foo.java:5)
$ java -Xmx12500m -cp ./ foo.Foo
//this works

可以理解需要一些摆动但我们为什么需要这么多?

1 个答案:

答案 0 :(得分:5)

因为MinHeapFreeRatio默认值(40%)。如果你想“少”需要,那么你必须指定它:例如5% -XX:MinHeapFreeRatio=5

此外,您需要更改分配给年轻代的内存,因为它在内存分配中起着重要作用:

  

在总可用内存之后,影响垃圾收集性能的第二大影响因素是专用于年轻一代的堆的比例。

试试这个:

java -Xmx9g -XX:MinHeapFreeRatio=1 -XX:MaxNewSize=256m -cp ./ foo.Foo

https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/sizing.html