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

前端之家收集整理的这篇文章主要介绍了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,因为它不像堆碎片那么敏感.

猜你在找的Java相关文章