有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何计算java阵列内存使用率

如果我有:

int c[] = new int[10];

int a[][] = new int[2][3];

大体上

一个n*m*..*j数组

考虑到引用变量,如何计算实际内存使用率


共 (6) 个答案

  1. # 1 楼答案

    我知道我去派对有点晚了,但计算内存占用真的不是很难

    让我们以你的第一个例子:int c[] = new int[N];

    根据64位内存模型,int是4字节,所以所有元素的大小都是4*N字节。除此之外,Java还有24字节的数组开销,还有8字节用于实际的数组对象。总共是32+4*N字节

    对于二维数组:int a[][] = new int[N][M];

    基本上是一样的,第一个数组中的每个元素是另一个大小为M的数组,所以我们用32+4*M代替了4,所以总大小是32+(32+4*M)*N

    的确,D维的泛化非常复杂,但你明白了

  2. # 2 楼答案

    int[]int[][]不是原始数据类型。它是Java中的一个对象。对于一个物体,它的大小不能直接计算出来

  3. # 3 楼答案

    如果你想要一个准确的答案,你不能。至少不能以任何简单的方式This thread解释了更多

    Bragaadeesh和Bakkal的答案的问题在于他们忽略了开销。每个数组还存储诸如其维数、长度以及垃圾收集器使用的一些内容

    对于一个简单的估计,使用其他答案的计算结果并添加100-200字节就可以了

  4. # 4 楼答案

    对于原始类型:基类型和字节大小

    • 布尔1
    • 字节1
    • 字符1
    • int 4
    • 浮动4
    • 长8
    • 双8
    • 整数24(16表示类实例+4表示int+4表示内存对齐)

    INTA[M]:24+4M

    (16类+4用于存储数组大小+4用于内存对齐)+(对于双精度的M大小,我们需要4*M)

    inta[M][N]:(24+4M)+M*(24+4N)=24+28M+4MN~~~4MN

    将a[M][N]视为双数组a[N]的M大小加上一个额外数组,以保存所有M大小数组起点的引用

  5. # 6 楼答案

    我知道这是一个老问题,但我也有同样的问题,这篇文章中给出的信息对我没有帮助。提供我所需信息的消息来源:https://www.javamex.com/tutorials/memory/array_memory_usage.shtml

    我的情况是:我有一个大数组

    int a[][] = new int[m][n];
    

    其中“大”实际上是误导性的:m是大的(3^18=387420489),但n是小的(4)。我一直遇到我不理解的内存问题,因为m*n*4=6198727824(~6GB),而我有16GB的RAM(允许使用-Xmx12G的JVM使用12个)。我刚才的链接给了我答案:

    each of the 10 rows has its own 12-byte object header, 4*10=40 bytes for the actual row of ints, and again, 4 bytes of padding to bring the total for that row to a multiple of 8

    这就是我的二维数组的内存基本上偏离了4*m*n的地方:这里,因为n很小(4),所以每一行的大小实际上与4*n不同;如果应用链接中给出的公式(即使它是近似值),每行得到:12(标题)+4*4(四个整数)+4(填充到8字节的倍数)=32。这是我预期成本的两倍,并说明我遇到了内存溢出