gpt4 book ai didi

java - 内存中 java byte[] 的大小

转载 作者:行者123 更新时间:2023-11-29 07:39:08 27 4
gpt4 key购买 nike

所以我创建了一个非常大的 byte[] 数组,比如 byte[50,000,000][16].. 所以根据我的数学计算,这是 800,000,000 字节,即 0.8GB 加上一些开销。令我惊讶的是什么时候做

memoryBefore = runtime.totalMemory() - runtime.freeMemory()

它使用 1.8GB 内存。当我将分析器指向它时,我得到了这个

https://www.dropbox.com/s/el9vlav5ylg781z/Screen%20Shot%202015-08-30%20at%202.55.00%20pm.png?dl=0

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

感谢阅读

最佳答案

所有对象都有维护对象的开销,例如“类型”又名 Class 的信息。参见 What is the memory consumption of an object in Java? .

数组也有一个长度,在 64 位 Java 中开销可能更大。

因为您分配了 50,000,000 个 16 字节的数组,所以您得到 50_000_000 * (16 + overhead) + (overhead + 50_000_000 * pointerSize)。第二部分是数组的外部数组。

根据您的要求,您可以通过以下两种方式之一改进它:

  1. 将二维数组的索引翻转为 byte[16][50_000_000]。这将开销从 50,000,001 减少到 17,并减少了外部数组大小。

  2. 使用单个数组 byte[16 * 50_000_000] 并自己执行偏移逻辑。这将使您的 16 个字节保持连续并消除所有开销。

关于java - 内存中 java byte[] 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32292755/

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