【问题标题】:java integer array size confusionjava整数数组大小混淆
【发布时间】:2017-10-18 23:07:59
【问题描述】:

我有这个代码

int[] i = new int[127*1024];

工作中

int[] i = new int[128*1024];

正在投掷

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at memory.main(memory.java:123)

在 64 位 Windows 机器 jdk 1.8 中使用以下命令运行它 java -Xms1M -Xmx1M memory

据我了解,java int 是 4 个字节(32 位),而 int[] 数组是一个对象。 在上述情况下,如果大小为 131.072 字节(128 * 1024)且堆空间为 1mb,则失败 谁能帮忙解释一下它为什么会内存不足?

【问题讨论】:

  • 对不起,您是否认为堆中没有其他内容占用任何空间?比如说,Java VM 的所有其他基础架构?
  • 而且大小是128*1024*4字节(+几个字节的开销),所以是你说的4倍。
  • 这个数组至少使用了 128*1024*4=524288 字节,剩下的 Java 空间不到 1/2Mb。 20 年来从未见过它这么小。
  • 这算作 4 * 128 * 1024 ~512 字节...你的意思是额外的字节开销也占 512 字节来填充 1 mb?

标签: java arrays memory-management


【解决方案1】:

数组中每个元素的空间都是在创建数组时分配的。
所有元素都初始化为0

int 的值是 4 字节,所以这个数组导致分配 128 * 1024 * 4 字节,即 0.5 Mb。

您的数组不是该行代码中堆上的唯一对象,这就是您的 JVM 爆炸的原因,即使您给了它 1 Mb 的内存。

您需要为 JVM 提供更多内存以避免此错误。

【讨论】:

  • @VinodKrishnan 没有太多要解释的了。试试这个:数组所需的所有空间都是在创建时分配的。将值分配给数组元素使用零内存 - 保存值的位置已经分配。
猜你喜欢
  • 2017-07-22
  • 1970-01-01
  • 2012-12-29
  • 2023-03-28
  • 2011-07-03
  • 2019-07-09
  • 2015-01-26
  • 2014-12-30
  • 2011-02-27
相关资源
最近更新 更多