我最近读了很多关于字符串内存分配的文章,但找不到任何与 Java 8 相同的细节。
一个String需要多少内存空间"Alexandru Tanasescu"
在Java 8中使用?
我用的是64位版本。
Java7 或更低版本
最小字符串内存使用量:
(bytes) = 8 * (int) ((((no chars) * 2) + 45) / 8)
So
80 = 8 * (int) ((((19) * 2) + 45) / 8)
了解字符串内存使用情况 (SOURCE)
要理解上述计算,我们需要首先查看 String 对象上的字段。一个字符串包含以下内容:
- 一个 char 数组——因此是一个单独的对象——包含实际的字符;
- 字符串开始处的数组的整数偏移量;
- 字符串的长度;
- 另一个 int 用于缓存计算的哈希码。
这意味着即使字符串不包含任何字符,它也需要 4 个字节用于 char 数组引用,加上 3*4=12 个字节用于三个 int 字段,再加上 8 个字节的对象头。这给出了 24 个字节(这是 8 的倍数,因此到目前为止不需要“填充”字节)。
然后,(空)char 数组将需要另外 12 个字节(数组有额外的 4 个字节来存储其长度),在本例中加上 4 个字节的填充,以使 char 数组对象使用的内存达到16. 因此,一个空字符串总共使用 40 个字节。
If the String
假设包含 19 个字符,那么 String 对象本身仍然需要 24 个字节。但现在 char 数组需要 12 个字节的标头加上 19*2=38 个字节用于 17 个字符。由于 12+38=50 不是 8 的倍数,因此我们还需要向上舍入到下一个 8 的倍数 (56)。总的来说,我们的 19 个字符String
将使用 56+24 = 80 字节。
Java8.
Java 8 没有offset
and length
不再了。仅有的hash
和CharArray
.
@托马斯·荣格布鲁特
- 一个 char 数组——因此是一个单独的对象——包含实际的字符;
字符串开始处的数组中的整数偏移量;
字符串的长度;
- 另一个 int 用于缓存计算的哈希码。
因此,在 Java8 中计算字符串内存的方法保持不变,但由于缺少,您必须减去 8 个字节offset
and length
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)