根据我的计算,下面的Java程序需要约8GB(2147483645 * 4字节)的内存:
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](https://istack.dev59.com/quTmG.webp)
但是,除非您将最大堆设置为约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
我能理解需要一些灵活性,但为什么我们需要这么多呢?
int[] arr = new int[Integer.MAX_VALUE-2];
这一行。如果不告诉我们具体情况,很难确定问题所在。 - bradimus