微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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,因为它不像堆碎片那么敏感.

原文地址:https://www.jb51.cc/java/123554.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐