阵列占用多少空间?

时间:2012-07-13 08:10:11

标签: java arrays

如果我创建10个整数并且整数数组为10,那么占用的总空间是否会有任何差异?

我必须创建一个包含数百万条记录的布尔数组,所以我想了解数组本身将占用多少空间。

9 个答案:

答案 0 :(得分:5)

整数数组表示为保存整数的内存块和对象标题。对于32位JVM,对象头通常需要3个32位字,但这取决于平台。 (标头包含一些标志位,对类描述符的引用,基本锁定信息的空间以及实际数组的长度。加上填充。)

因此,10个整数的数组可能占用13 * 4个字节的区域。

Integer[]的情况下,每个Integer对象都有一个2个字的标题和一个包含实际值的1个字的字段。您还需要添加填充和1个字(或64位JVM上的1到2个字)作为参考。这通常是每个元素的5个字或20个字节...除非某些Integer对象出现在数组的多个位置。


注意:

  1. 64位JVM上实际用于引用的字数取决于是否使用“压缩oops”。
  2. 在某些JVM上,堆节点以16字节的倍数分配...这会增加空间使用量(例如上面提到的填充)。
  3. 如果你获取一个对象的身份哈希码并且它在下一个垃圾收集中幸存下来,它的大小会被至少4个字节膨胀以缓存哈希码值。
  4. 除了上面列举的可变性来源之外,这些数字都是版本和供应商特定的。

答案 1 :(得分:3)

一些粗略的下界计算:

每个int占用四个字节。 = 10个40字节

一个int数组占用每个组件四个字节加上四个字节来存储长度加上另外四个字节来存储对它的引用。 = 48个字节(+可能是一些填充以对齐8个字节边界的所有对象)

Integer占用至少8个字节,再加上另外4个字节来存储对它的引用。 =至少120为十

整数数组占用十个整数的至少120个字节加上长度的四个字节,然后可能有一些填充用于对齐。加上四个字节来存储对它的引用。 (@Marko报告他甚至测量了每个插槽大约28个字节,因此对于10个数组,这将是280个字节。)

答案 2 :(得分:2)

在java中,你有Integer和int。假设你指的是int,一个int数组被认为是一个对象,而对象有元数据,所以10个int的数组将占用10个以上的int变量

答案 3 :(得分:2)

根据你的评论,如果使用数组,它将没有多大区别。 Array将为其功能本身使用可忽略的内存量。存储的对象将使用所有其他内存。

编辑:您需要了解的是布尔包装器和布尔基元类型之间的区别。包装类型通常占用比基元更多的空间。因此,对于记录任务,请尝试使用原语。

在处理记录任务时要记住的另一件事就是Java Autoboxing。如果您无意中在遍历整个数组的函数中使用它,那么性能损失可能很大。

答案 4 :(得分:1)

您可以做的是衡量

public static void main(String[] args) {
  final long startMem = measure();
  final boolean[] bs = new boolean[1000000];
  System.out.println(measure() - startMem);
  bs.hashCode();
}
private static long measure() {
  final Runtime rt = Runtime.getRuntime();
  rt.gc();
  try { Thread.sleep(20); } catch (InterruptedException e) {}
  rt.gc();
  return rt.totalMemory() - rt.freeMemory();
}

当然,这与标准免责声明有关:gc()没有特别保证,所以重复几次以确定您是否获得了一致的结果。在我的机器上,答案是每boolean个字节。

答案 5 :(得分:1)

不需要对教师/面试官反映不好。

您关心内存中变量的大小和对齐程度取决于您需要代码的性能。如果您的软件处理交易(例如电子转帐/股票市场),这很重要。

内存中变量的大小,对齐和打包可能会影响CPU缓存命中/未命中,这会影响代码的性能,最高可达100倍。

只要你负责任地使用绩效提升技巧,了解低水平发生的事情并不是一件坏事。

例如,我来到这个帖子是因为我需要知道这个问题的答案,所以我可以调整我的基元数组来填充CPU缓存行的整数倍,因为我需要执行计算的代码因为我有一个有限的窗口,我需要我的计算为结果的消费者做好准备,因此我可以快速执行这些基元数组。

答案 6 :(得分:0)

就RAM空间而言,没有真正的区别

答案 7 :(得分:0)

如果你使用一个数组,你有11个对象,10个整数和数组,加上数组里面有其他元数据。因此,使用数组会占用更多内存空间。

现在真实。这种问题实际上出现在求职面试和考试中,这表明你有什么样的面试官或老师......在虚拟机和操作系统本身中有如此多的抽象层工作,有什么意义呢?关于这个东西的思考?微优化内存......!

答案 8 :(得分:0)

  

我的意思是如果我创建10个整数和10个整数数组,那么会有   占用总空间的任何差异。

(integer array of 10) = (10 integers) + 1 integer

最后一个“+1整数”用于数组的索引(数组可以容纳2,147,483,647个数据量,这是一个整数)。这意味着当你声明一个数组时,请说:

int[] nums = new int[10];

实际上你从内存中保留了11个int空间。数组元素为10,数组本身为+1。