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