读书人

String 罗致的内存溢出

发布时间: 2012-12-27 10:17:10 作者: rapoo

String 导致的内存溢出

String是java中经常使用的类,如果使用不当,也有可能出现内存泄露。例如执行以下代码就可能出现内存不够:

??? at java.util.Arrays.copyOf(Unknown Source)
??? at java.lang.String.<init>(Unknown Source)
??? at com.bond.test.Test.<init>(Test.java:6)
??? at com.bond.test.Test.main(Test.java:17)

?

这是为什么呢? subStrings 不是保存了1000000个长度为2的字符串吗,一个字符2个字节,总共不过40M 怎么会内存不够呢。其实不是这样的。

?

我们来看String中的subString方法:

?

public String getSubString() {    return new String(this.large.substring(0,2));  }

?这样创建的String的实际大小就只有2了。

1 楼 Coder211 2011-02-22 不错,文章写的很深入!
只是希望把问题解释的更清楚明白一些! 2 楼 miroku 2011-02-22 传递的数组是引用啊,怎么会产生多份相同大小的数组。而且,根据楼主的异常,可知是构造方法抛出的,所以,楼主的解释说不通

public class Test {
private String large = new String(new char[100000]);

public String getSubString() {
return this.large.substring(0, 2);
}

public static void main(String[] args) {
ArrayList<String> subStrings = new ArrayList<String>();
Test test = new Test();
for (int i = 0; i < 1000000; i++) {

subStrings.add(test.getSubString());
}
}
}
这样写的话,就没事,说明和subString没关系,而是,你在循环里创建Test对象,每次都会创建一个large = new String(new char[100000]); 所以才会内存溢出

读书人网 >编程

热点推荐