转载

为什么JDK6中的substring()方法会导致内存泄露

为什么JDK6中的substring()方法会导致内存泄露

微信公众号: 爱问CTO

专业编程问答社区

www.askcto.com

JDK1.6中substring中的源码如下:

String(int offset, int count, char value[]) {
    this.value = value;
    this.offset = offset;
    this.count = count;
}

public String substring(int beginIndex, int endIndex) {
    return  new String(offset + beginIndex, endIndex - beginIndex, value);
}

从源码中看出,substring返回的字符串和之前的字符串是共用的一个字符数组。只是数组的起点和长度改变了。value 是真正存储字符的数组,offset 是数组中第一个元素的下标,count 是数组中字符的个数。调用 substring() 的时候虽然创建了新的字符串,但字符串的值仍然指向的是内存中的同一个数组。

如果有一个长度很长的字符串,当我们需要调用 substring() 截取其中很小一段字符串时,就有可能导致性能问题。由于这一小段字符串引用了整个很长很长的字符数组,就导致很长很长的这个字符数组无法被回收,内存一直被占用着,就有可能引发内存泄露。

原文  https://segmentfault.com/a/1190000021293536
正文到此结束
Loading...