JDK6
中的subString
方法会存在内存泄露
问题,是由于源字符串中的value
数组不会被GC
回收。
看到一篇文章(http://www.cnblogs.com/hxy520...),里面有如下代码,说在JDK6
下会报内存溢出
的错误。请问下,为什么会产生?list
的每次add
不是只加一点点内存占用么?
public class SubMain {
private String strs = new String(new byte[100000]);
String getString() {
return this.strs.substring(0, 2);
}
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
SubMain sub = new SubMain();
for (int i = 0; i < 1000000; i++) {
list.add(sub.getString());
}
}
}
/*Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.lang.StringCoding$StringDecoder.decode(StringCoding.java:133)
at java.lang.StringCoding.decode(StringCoding.java:173)
at java.lang.StringCoding.decode(StringCoding.java:185)
at java.lang.String.<init>(String.java:570)
at java.lang.String.<init>(String.java:593)
at com.jd.o2o.substring.SubMain.<init>(SubMain.java:8)
at com.jd.o2o.substring.SubMain.main(SubMain.java:18)*/
其他参考文章:http://blog.csdn.net/longzuyu...,
http://www.wtoutiao.com/p/jfc...
前面的童鞋也讲的很明白了,即使是jdk1.6的方式也不会存在你所说的内存泄露问题。
导致你内存不足的原因是因为你本身就没有足够的内存申请
1000000
个new String(new byte[100000])
对象。还有,按照你的逻辑来实现的话,
JDK1.6
的实现方式绝对是占用更少内存的,因为array
是引用类型。即便你循环1000000
次substring
,在String
对象中的char[] value
也是同一个对象,而JDK1.7
使用Arrays.copy
的方式实现,那你每一次substring
就将会生成一个新的char[] value
实例。