java 一个String对象占用多少内存
- 对象头 12 字节或16字节
- markWord 8字节
- class对象指针 4字节
- 如果是数组,数组长度 4字节
- 内容
- byte和boolean是1个字节,short和char是2个字节,int和float是4个字节,long和double是8个字节,引用类型是4个字节
- 对齐 如果对象不是8的倍数就填充到8的倍数
string类的变量
private final char value[];
private int hash; // Default to 0
private static final long serialVersionUID = -6849794470754667710L;
静态变量存储在class对象里面,所以所有实例共享,不算在这个对象内存里
所以一个string对象
对象头 12 字节 + char[]数组的引用 4字节 +int 4字节 +填充4字节 = 24字节
如果计算sting对象加上char [] 对象则内存大小为 40 + 字符数 * 2 + 填充
String 24字节
char[] 对象头 16 + 字符数*2 + 填充
[C 表示数组大小
((new String("")).toPrintable());
((new String("d")).toPrintable());
((new String("dshh")).toPrintable());
((new String("dshhh")).toPrintable());
@5ef04b5d object externals:
ADDRESS SIZE TYPE PATH VALUE
76b80aac8 16 [C .value []
76b80aad8 5024864 (something else) (somewhere else) (something else)
76bcd5738 24 (object)
@d70c109d object externals:
ADDRESS SIZE TYPE PATH VALUE
76ca26fa0 24 (object)
76ca26fb8 24 (something else) (somewhere else) (something else)
76ca26fd0 24 [C .value [d]
@50675690d object externals:
ADDRESS SIZE TYPE PATH VALUE
76ca2d190 24 (object)
76ca2d1a8 24 (something else) (somewhere else) (something else)
76ca2d1c0 24 [C .value [d, s, h, h]
@3ac42916d object externals:
ADDRESS SIZE TYPE PATH VALUE
76ca33418 32 [C .value [d, s, h, h, h]
76ca333e8 24 (object)
76ca33400 24 (something else) (somewhere else) (something else)