String中substring方法内存泄漏问题
来源:互联网 发布:spss数据输入 编辑:程序博客网 时间:2024/06/09 14:30
众所周知,JDK中以前String类中的substring方法存在内存泄漏问题,JDK1.7及以后的版本已经修复了。之所以存在内存泄漏的问题,是因为原先的版本中,substring是这样实现的:
public String substring(int beginIndex, int endIndex) { if (beginIndex < 0) { throw new StringIndexOutOfBoundsException(beginIndex); } if (endIndex > count) { throw new StringIndexOutOfBoundsException(endIndex); } if (beginIndex > endIndex) { throw new StringIndexOutOfBoundsException(endIndex - beginIndex); } return ((beginIndex == 0) && (endIndex == count)) ? this : new String(offset + beginIndex, endIndex - beginIndex, value); }
而其中用到的String构造方法是这样的:
String(int offset, int count, char value[]) { this.value = value; this.offset = offset; this.count = count; }
this.value=value这种实现就出现问题了,因为String类中有几个私有的成员变量:
/** The value is used for character storage. */ private final char value[]; /** The offset is the first index of the storage that is used. */ private final int offset; /** The count is the number of characters in the String. */ private final int count; /** Cache the hash code for the string */ private int hash; // Default to 0
这种实现还在引用着原先字符串变量的value[],通过offset和count返回一个长得像的“截取”后的字符串给人一种错觉,导致JVM认为这个最初字符串还在被引用着不对其gc,造成了效率问题,如注释所说:
Package private constructor which shares value array for speed.
这样导致的后果就是如果有一个很大很长的字符串我只需要其中的一小部分字符串用substring实现的话,如果让你看似得到的“新”的短小字符串一直没被JVM 回收的话,那么相当这个最初的大字符串也没被回收,尤其是你把这个短小“新”的字符串直接以引用的形式付给一个静态的全局变量,在加上如果访问数量很大,那应该“代价”还是蛮可观的,不过可以简单的这样new(s.substring())就避免了这个问题。
新的JDK中substring之所以不存在这个问题了,是因为这个构造方法改成这样了
public String(char value[], int offset, int count) { if (offset < 0) { throw new StringIndexOutOfBoundsException(offset); } if (count < 0) { throw new StringIndexOutOfBoundsException(count); } // Note: offset or count might be near -1>>>1. if (offset > value.length - count) { throw new StringIndexOutOfBoundsException(offset + count); } this.offset = 0; this.count = count; this.value = Arrays.copyOfRange(value, offset, offset+count); }
阅读全文
0 0
- String中substring方法内存泄漏问题
- String中substring方法内存泄漏问题
- String中substring方法内存泄漏问题
- String中substring方法内存泄漏问题
- String中substring方法内存泄漏问题
- String类substring方法导致的Java内存泄漏问题
- String类substring方法导致的Java内存泄漏问题
- String类substring方法导致的Java内存泄漏问题
- Java中由substring方法引发的内存泄漏
- Java中由substring方法引发的内存泄漏
- Java中由substring方法引发的内存泄漏
- Java中由substring方法引发的内存泄漏
- Java中由substring方法引发的内存泄漏
- Java中由substring方法引发的内存泄漏
- Java中由substring方法引发的内存泄漏
- set方法中内存泄漏问题
- Java中,String的subString方法易导致内存溢出
- java6 substring() 内存泄漏
- mysql slave创建:mysqldump参数--master-data
- python科学计算库numpy的使用
- 关于C语言宏定义define的用法探究
- 队列的基础操作
- 初创的云平台公司是否需要设立运维岗
- String中substring方法内存泄漏问题
- Java JUC之Atomic系列12大类实例讲解和原理分解
- 树形数据结构小结
- 微信公众平台网页开发实战--2.从手机相册中选照片然后分享
- 移动web端页面如何调用手机QQ?
- 方法(其他语言中称函数)
- java原子更新器AtomicReferenceFieldUpdater的使用
- 基于数据结构的图书管理系统
- poj 1287 Networking