我有一个程序,我将使用一个非常大的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
。
答案 0 :(得分:5)
这么大的东西,会在堆外更快乐。你最好还是选择NIO并使用直接字节缓冲来支持你的大型Short数组。这个内存可以保持在堆外,远离垃圾收集器的手套(有时可能会想要将缓冲区从一个区域复制到另一个区域)。
请参阅java.nio.ShortBuffer并从那里开始挖掘。