[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 同楼下啊,,楼主用的什么tool查看的内存分析啊?
是eclipse的插件还是其他的独立工具啊?
看着好像很强大的样子。。 文章分析的也还是比较透彻。 7 楼 lin_yp 2012-09-23 内存分析用的是MemoryAnalyzer工具 8 楼 leaow567 2012-09-23 辛苦了,学习了 9 楼 lin_yp 2012-09-23 tlde_ti 写道http://stackoverflow.com/questions/2514349/lost-string-garbage-collection
------------------
看第一个回答,用new String(..)来使largestring回收只在 smallstring存在很长时间的情况下才应该使用.一般情况下smallstring存在的时间都比较短,smallstring生命周期结束以后largestring也就自动回收了,没有必要自己手动提前回收.
这篇文章针对的就是smallstring被缓存长期使用的情况