Java中的字节数组的内存使用

参见英文答案 > Java process memory check test2
对于启发式预计算表,我需要一个具有1504935936个条目的字节数组.这应该占用大约1.5 GB的内存.
public class Main{
    public static void main(String[] args){
        byte[] arr = new byte[1504935936];
    }
}

为什么我有一个“OutOfMemoryError:Java堆空间” – 异常,如果我给程序2 GB的RAM与

java -Xmx2048M Main

java -Xmx2153M Main

有用.为什么需要这么多RAM?

解决方法

可能是因为Java堆被程序中的其他数据使用和分段.

该字节数组需要在Java堆空间中分配为一个连续的1.5 GB内存块. (这不是Java语言规范所要求的,但是AFAIK是当前所有JVM实现的实际工作方式.)您的某些堆空间正在被消耗,并且可能更重要的是被程序中发生的其他内存分配分段分配大字节数组.那个java -Xmx2153M Main可能会让你的整个堆有一个连续的1.5 GB的空间留给你的时间到你分配的时间有多大.

如果你将这个大阵列砍成100个小的数组,它的大小就是1/100,因为它不像堆碎片那么敏感.

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...