gpt4 book ai didi

java - 在内存中保留最大整数数组所需的空间

转载 作者:行者123 更新时间:2023-12-03 23:01:19 25 4
gpt4 key购买 nike

我正在审查一个算法,它保留一个整数数组,输入的大小是动态的。所以根据我的计算,它可能需要

  integer MAX_VALUE  * int size  = ?   
2^31 integers * 4 bytes = ?
2147483648 integers * 4 bytes = 8 Gigabytes
这个计算正确吗? JVM 会使用这么多连续的空间来存储 int 数组还是有其他需要考虑的事情?

最佳答案

数组的理论大小为:

  • numberOfElementsInTheArray * 4 字节
  • 12 字节的 header (int[] 是一个对象)。实际上标题的大小取决于您使用的标志和 on the JVM version you are running this
  • 4 个字节保留 length数组的
  • 填充。

  • 例如:(我将使用 JOL for this ):
        int [] x = new int[10];
    for(int i=0;i<10;++i){
    x[i] = 9999;
    }
    System.out.println(GraphLayout.parseInstance((Object)x).toPrintable());
    将输出:
     [I@7a81197dd object externals:
    ADDRESS SIZE TYPE PATH VALUE
    70fe45268 56 [I [9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999]
    所以它有 56 bytes :
  • 40 表示值本身(10 个整数 * 4 个字节)
  • 12 用于标题
  • 4 为长度
  • 0 用于填充

  • 如果将此数组更改为 Integer ,事情发生了戏剧性的变化。 Integer是一个对象,所以你将在数组中存储一个引用(可能是 48 字节,取决于 UseCompressedOops 标志),加上每个 Integer实例将需要 2 个 header (每个 Integer 是一个对象)。
        Integer[] y = new Integer[10];
    for(int i=0;i<10;++i){
    y[i] = 9999;
    }

    System.out.println(GraphLayout.parseInstance((Object)y).toFootprint());
    这将显示:
       [Ljava.lang.Integer;@369f73a2d footprint:
    COUNT AVG SUM DESCRIPTION
    1 56 56 [Ljava.lang.Integer;
    10 16 160 java.lang.Integer
    11 216 (total)
    216 bytes :
  • 每个引用 4 个字节(我打开了 UseCompressedOop),总共 40 个字节
  • 数组的 12 字节 header
  • 数组的 4 字节长度
  • 0 字节填充

  • 该数组中的每个引用都指向一个 Integer ,这些对象中的每一个都有 16 bytes :
  • 4 个字节用于内部 int他们持有
  • 12 字节标题
  • 0 字节填充
  • 关于java - 在内存中保留最大整数数组所需的空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65553061/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com