[Java]String内存陷阱简介
String 方法用于文本分析及大量字符串处理时会对内存性能造成一些影响。可能导致内存占用太大甚至OOM。
一、先介绍一下String对象的内存占用
一般而言,Java 对象在虚拟机的结构如下:
?对象头(object header):8 个字节(保存对象的 class 信息、ID、在虚拟机中的状态)
?Java 原始类型数据:如 int, float, char 等类型的数据
?引用(reference):4 个字节
?填充符(padding)![更多... [Java]String内存储器陷阱简介](http://img.reader8.net/uploadfile/jiaocheng/20140140/2742/2014012719423120235.gif)
}
对应的字节码:
Code:
0:?? ldc???? #24; //String str1str2str3???????? --将字符串常量压入栈顶
2:?? areturn
3、在拼接动态字符串时,尽量用 StringBuffer 或 StringBuilder的 append,这样可以减少构造过多的临时 String 对象(javac编译器会对String连接做自动优化):
public String constractStr(String str1, String str2, String str3)
??? {
??????? return str1 + str2 + str3;
}
对应字节码(JDK1.5之后转换为调用StringBuilder.append方法):
Code:
0:?? new???? #24; //class java/lang/StringBuilder
3:?? dup
4:?? aload_1
5:?? invokestatic??? #26; //Method java/lang/String.valueOf:(Ljava/lang/Objec
t;)Ljava/lang/String;
8:?? invokespecial?? #32; //Method java/lang/StringBuilder."<init>":(Ljava/la
ng/String;)V
11:? aload_2
12:? invokevirtual?? #35; //Method java/lang/StringBuilder.append:(Ljava/lang
/String;)Ljava/lang/StringBuilder;
15:? aload_3
16:? invokevirtual?? #35; //Method java/lang/StringBuilder.append:(Ljava/lang
/String;)Ljava/lang/StringBuilder;? ――调用StringBuilder的append方法
19:? invokevirtual?? #39; //Method java/lang/StringBuilder.toString:()Ljava/l
ang/String;
22:? areturn???? ――返回引用
6 楼 lucky16 2012-09-23 同楼下啊,,