我听说一个同事说,我会支付“24个字节”如果我在一个Java类下降串部件,即使该字符串是空的。 是准确的? 它是同为整数,浮点数,双? (相对于整数,浮点,双,这将是每个唯一的4,4和8字节)。
Answer 1:
你要付4首或8个字节的参考 。 无论你将支付每您的“容器”对象的实例额外的对象取决于你如何让你的空字符串。 例如,如果你使用的文字""
那么所有的实例都会指向同一个对象,所以你只需要支付引用本身。
如果您正在为每个实例单独空字符串,那么很明显,这将需要更多的内存。
Answer 2:
从借用此答案 :程序打印为空字符串(和0“”这是在串池)32个字节。
public static void main(String... args) {
long free1 = free();
String s = "";
long free2 = free();
String s2 = new String("");
long free3 = free();
if (free3 == free1) System.err.println("You need to use -XX:-UseTLAB");
System.out.println("\"\" took " + (free1 - free2) + " bytes and new String(\"\") took " + (free2
- free3) + " bytes.");
}
private static long free() {
return Runtime.getRuntime().freeMemory();
}
Answer 3:
这是真的,你会付出更多的比为int的整数。 我记得我检查了几个版本的Java背部和整数花了大约24字节。 只要你有在一个空对象(又名不惜一切代价),你只保留在内存中的指针,我不认为JVM将保留一个位置,在这种情况下你不初始化它指向字符串浪费了24个字节,只是8.如果你虽然创建的字符串(即使是空字符串“”),那么你已经在内存中的对象,因为所有对象继承对象,他们想出一些行李和占用更多的内存比你直观地预期。 根据您的使用字符串的常见解决方法是先从一个空对象和懒惰初始化它,当你需要它。
Answer 4:
字符串由出目标首标(在热点2也就是说,3 J9),INT字段和字符数组参考。 字符数组本身是由输出接头,INT场和阵列的其余部分。 一切都填充到8个字节。 通常,字符进行编码,每个字符2个字节。 有些JVM可以使用替代编码为字符。 在一个点上J9可以在编码字符串UTF8。 现代热点将使用每字符1个字节,如果字符串由字符简单的(UTF-8的本质上1个字节的编码字形,象英语字母,数字和等)。 否则,使用每字符2个字节用于整个阵列。
空字符串大小的那么深尺寸是这样的:
- 在32位的HotSpot 32个字节(字符串16个字节,对于char 16个字节[])
- 在64位的HotSpot 56个字节(字符串32个字节,对于char 24个字节[])
- 在64位的HotSpot用压缩的引用40个字节(字符串24个字节,对于char [] 16个字节)
通常情况下,空字符数组不会因为它的价值会被推断分配。 所有的所有空字符数组后是相等的。 所以实际的处罚空字符串将是一个浅字符串大小; 这是最常见的情况今日(64位的HotSpot与压缩REF)24个字节 。
IBM J9 JVM有较大的对象头,它会分配一定程度以上。