内存中java字节[]的大小
所以我创建了一个非常大的byte[]数组,类似于byte[50000000][16]。。根据我的数学计算,这是80000000字节,即0.8GB加上一些开销。 让我吃惊的是,什么时候该做内存中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或更大。。有人知道这
memoryBefore = runtime.totalMemory() - runtime.freeMemory()
它使用1.8GB的内存。当我用剖析器指着它时,我得到了这个
我可以看到大多数字节[]都是24字节,而不是预期的16字节,我还看到了相当多的大得多的字节[],大小为472或更大。。有人知道这里发生了什么吗
谢谢你的阅读
我可以看到大多数字节[]是24字节,而不是16字节
Java中的对象除了包含对象字段的空间外,还有几个字的标题信息。对于数组,还有一个额外的字来保存数组的长度
字段。length
实际上需要4个字节(“coslength
是一个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如果这个答案对您有好处,请单击复选标记接受它,以便其他人可以看到它。