java - JDK6中String的subString方法内存泄露及溢出问题

查看:103
本文介绍了java - JDK6中String的subString方法内存泄露及溢出问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

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的方式也不会存在你所说的内存泄露问题。
导致你内存不足的原因是因为你本身就没有足够的内存申请1000000new String(new byte[100000])对象。


还有,按照你的逻辑来实现的话,JDK1.6的实现方式绝对是占用更少内存的,因为array是引用类型。即便你循环1000000substring,在String对象中的char[] value也是同一个对象,而JDK1.7使用Arrays.copy的方式实现,那你每一次substring就将会生成一个新的char[] value实例。

这篇关于java - JDK6中String的subString方法内存泄露及溢出问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆