Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
内存中java字节[]的大小_Java_Memory Leaks_Byte - Fatal编程技术网

内存中java字节[]的大小

内存中java字节[]的大小,java,memory-leaks,byte,Java,Memory Leaks,Byte,所以我创建了一个非常大的byte[]数组,类似于byte[50000000][16]。。根据我的数学计算,这是80000000字节,即0.8GB加上一些开销。 让我吃惊的是,什么时候该做 memoryBefore = runtime.totalMemory() - runtime.freeMemory() 它使用1.8GB的内存。当我用剖析器指着它时,我得到了这个 我可以看到大多数字节[]都是24字节,而不是预期的16字节,我还看到了相当多的大得多的字节[],大小为472或更大。。有人知道这

所以我创建了一个非常大的byte[]数组,类似于byte[50000000][16]。。根据我的数学计算,这是80000000字节,即0.8GB加上一些开销。 让我吃惊的是,什么时候该做

memoryBefore = runtime.totalMemory() - runtime.freeMemory()
它使用1.8GB的内存。当我用剖析器指着它时,我得到了这个

我可以看到大多数字节[]都是24字节,而不是预期的16字节,我还看到了相当多的大得多的字节[],大小为472或更大。。有人知道这里发生了什么吗

谢谢你的阅读

我可以看到大多数字节[]是24字节,而不是16字节

Java中的对象除了包含对象字段的空间外,还有几个字的标题信息。对于数组,还有一个额外的字来保存数组的
长度
字段。
length
实际上需要4个字节(“cos
length
是一个
int
),但JVM很可能与平台上的8字节边界对齐

如果您看到16字节数组占用24字节,那么空间占用很可能包括(仅)
长度

(请注意,对象/数组头占用的实际空间是JVM和特定于平台的。)


。。。我看到相当多的大得多的字节[],大小为472或更大


这些都是无关的。如果代码的其他部分没有显式创建它们,则它们很可能是由Java运行时库创建的。

所有对象都有维护对象的开销,例如“type”aka
Class
。看

数组也有
长度
,64位Java中的开销可能更大

由于您要分配50000000个16字节的数组,因此得到
50_000_000*(16+开销)+(开销+50_000_000*指针化)
。第二部分是数组的外部数组

根据您的需求,您可以通过以下两种方式之一来改进此功能:

  • 将二维数组的索引翻转到
    字节[16][50\u 000\u 000]
    。这将开销从50000001减少到17,并减少了外部阵列大小

  • 使用单个数组
    字节[16*50\u 000\u 000]
    并自行执行偏移逻辑。这将保持16字节的连续性,并消除所有开销


  • 这里有一个数组
    length
    字段。@darthShana如果这个答案对您有好处,请单击复选标记接受它,以便其他人可以看到它。