Sca*_*rtz 31 java memory string
我最近读了很多关于Strings内存分配的内容,如果与Java 8的内容相同,则无法找到任何细节.
"Alexandru Tanasescu"
在Java 8中使用String会占用多少内存空间?我使用64位版本.
Jor*_*lla 34
最小字符串内存使用量
(bytes) = 8 * (int) ((((no chars) * 2) + 45) / 8)
Run Code Online (Sandbox Code Playgroud)
所以
80 = 8 * (int) ((((19) * 2) + 45) / 8)
Run Code Online (Sandbox Code Playgroud)
了解字符串内存使用情况(SOURCE)
要理解上面的计算,我们需要从查看String对象上的字段开始.String包含以下内容:
- 一个char数组 - 因此是一个单独的对象 - 包含实际的字符;
- 字符串开始的数组中的整数偏移量;
- 字符串的长度;
- 另一个用于缓存计算哈希码的int.
这意味着即使字符串不包含字符,它也需要4个字节用于char数组引用,加上3*4 = 12个字节用于三个int字段,加上8个字节的对象头.这给出了24个字节(这是8的倍数,因此到目前为止还不需要"填充"字节).
然后,(空)char数组将需要另外12个字节(数组有额外的4个字节来存储它们的长度),在这种情况下还有4个字节的填充,以使char数组对象使用的内存达到倍数16.总的来说,空字符串使用40个字节.
如果String
包含19个字符,那么String对象本身仍然需要24个字节.但是现在char数组需要12个字节的标头加上19*2 = 38个字节用于17个字符.由于12 + 38 = 50不是8的倍数,我们还需要向上舍入到8(56)的下一个倍数.总的来说,我们的19个字符String
将耗尽56 + 24 = 80个字节.
Java的8不具备
offset
和length
了.只有hash
和CharArray
.
@Thomas Jungblut
因此,在Java8中,为字符串计算内存的方法保持不变,但由于缺少offset
和减少,因此必须减去8个字节length
.
如果查看Oracle Java 8源代码,您可以:
A char value[]
和int hash
.A char
是2个字节,a int
是4个字节.
所以答案不是yourstring.length
*2 + 4?
不,每个物体都有开销.例如,数组存储其尺寸.数组(对象)和字符串都会从垃圾收集器中产生额外的内存,存储有关它们的信息.
没有可靠的方法来计算这个,因为AFAIK每个JRE和JDK都没有义务对象开销的大小.
“ Alexandru Tanasescu”使用104个字节。这是如何获得尺寸
long m0 = Runtime.getRuntime().freeMemory();
String s = new String("Alexandru Tanasescu");
long m1 = Runtime.getRuntime().freeMemory();
System.out.println(m0 - m1);
Run Code Online (Sandbox Code Playgroud)
注意:使用-XX:-UseTLAB选项运行它