读书人

[Java]String内存储器陷阱简介

发布时间: 2012-12-21 12:03:49 作者: rapoo

[Java]String内存陷阱简介

String 方法用于文本分析及大量字符串处理时会对内存性能造成一些影响。可能导致内存占用太大甚至OOM。

一、先介绍一下String对象的内存占用

一般而言,Java 对象在虚拟机的结构如下:
?对象头(object header):8 个字节(保存对象的 class 信息、ID、在虚拟机中的状态)
?Java 原始类型数据:如 int, float, char 等类型的数据
?引用(reference):4 个字节
?填充符(padding)[Java]String内存储器陷阱简介

}

对应的字节码:

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被缓存长期使用的情况

读书人网 >编程

热点推荐