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

时间:2016-02-25 18:28:46

标签: 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)];
    }
}

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

为了运行程序,我尝试了

java -Xms2000m HPTest

但仍然出现堆空间错误。即使在3000m,我也遇到了相同的错误,但在4000m它有效。

为什么我必须远远高于2000m的估计限额?

的任何想法

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

1 个答案:

答案 0 :(得分:5)

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

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