Java需要比合理的更大的堆空间

Ale*_*nde 6 java

我有一个程序,我将使用一个非常大的short[]数组:

import java.lang.Math;

public class HPTest {

    public static void main(String[] args) {
        int n = 30;
        short[] a = new short[(int)Math.pow(2,n)];
    }
}
Run Code Online (Sandbox Code Playgroud)

据我所知,short[]数组应该每个元素使用2个字节,因此具有2 ^ 30个元素的数组应该需要大约2 GiB的RAM.

为了运行该程序,我因此尝试了

java -Xms2000m HPTest
Run Code Online (Sandbox Code Playgroud)

但仍然有堆空间错误.即使在3000m我得到相同的错误,但在4000m它工作.

有什么想法,为什么我必须远远高于估计的限制2000m

编辑:正如许多用户所指出的那样,我在声明短路需要1个字节而不是2个字节时犯了一个非常尴尬的错误.那么问题应该是为什么它不足以满足要求2000m.

Wil*_*ung 5

这么大的东西会在堆外更快乐.你最好还是寻找NIO并使用直接字节缓冲来支持你的大型Short数组.这个内存可以保持在堆外,远离垃圾收集器的手套(有时可能会想要将缓冲区从一个区域复制到另一个区域).

请参阅java.nio.ShortBuffer并从那里开始挖掘.