(转)Java中字符串与内存泄漏的问题
来源:互联网 发布:人工智能的利弊英文ppt 编辑:程序博客网 时间:2024/05/01 17:32
http://clarkht.iteye.com/blog/482644
String oldStr = "hello,clark";
String newStr = oldStr.subString(0,4);
对于这个写法,实际上对于oldStr是一个char[]数组[h,e,l,l,0,,,c,l,a,r,k],对于subString操作,newStr并不是自己copy oldStr的char[]数组hello自己去创建一个新的char[]数组,而是java在背后进行了String Reusing Optimization,它不会自己创建一个新的char数组,而是reuse原来的char数组。所以了,这样就不会有很多的原来的char[]数组的碎片。引用http://www.javablogging.com/string-and-memory-leaks/ 上的列子:
Java代码
public static void sendEmail(String emailUrl) {
String email = emailUrl.substring(7); // 'mailto:' prefix has 7 letters
String userName = email.substring(0, email.indexOf("@"));
String domainName = email.substring(email.indexOf("@"));
}
public static void main(String[] args) {
sendEmail("mailto:user_name@domain_name.com");
}
但是这个虽然在一般情况是好,不过也是有代价的。根据http://nflath.com/2009/07/the-dangers-of-stringsubstring/上,因为字符串不是自己新建一个char[]数组,而是引用了原来的char[]数组,这样oldStr就无法garbage collected ,因为newStr还是拥有oldStr的char[]数组的引用。这样容易引起Outof Memory 异常。解决办法是了,便是让newStr拥有自己的char[]数组,也就是自己在subString时强迫创建自己的char[]数组,这样就不会有garbage collected 的问题(reachable but unused!) 怎么办:
Java代码
String sub = new String( oldString.substring(0, 4) );
---------------------------------------------------------------
为了避免内存拷贝、加快速度,Sun JDK直接复用了原String对象的char[],偏移量和长度来标识不同的字符串内容。也就是说,subString出的来String小对象仍然会指向原String大对象的char[],split也是同样的情况 。这就解释了,为什么HashMap中String对象的char[]都那么大。
-------------------------------------------------------
可以参考:
http://jarfield.iteye.com/blog/583946
String oldStr = "hello,clark";
String newStr = oldStr.subString(0,4);
对于这个写法,实际上对于oldStr是一个char[]数组[h,e,l,l,0,,,c,l,a,r,k],对于subString操作,newStr并不是自己copy oldStr的char[]数组hello自己去创建一个新的char[]数组,而是java在背后进行了String Reusing Optimization,它不会自己创建一个新的char数组,而是reuse原来的char数组。所以了,这样就不会有很多的原来的char[]数组的碎片。引用http://www.javablogging.com/string-and-memory-leaks/ 上的列子:
Java代码
public static void sendEmail(String emailUrl) {
String email = emailUrl.substring(7); // 'mailto:' prefix has 7 letters
String userName = email.substring(0, email.indexOf("@"));
String domainName = email.substring(email.indexOf("@"));
}
public static void main(String[] args) {
sendEmail("mailto:user_name@domain_name.com");
}
但是这个虽然在一般情况是好,不过也是有代价的。根据http://nflath.com/2009/07/the-dangers-of-stringsubstring/上,因为字符串不是自己新建一个char[]数组,而是引用了原来的char[]数组,这样oldStr就无法garbage collected ,因为newStr还是拥有oldStr的char[]数组的引用。这样容易引起Outof Memory 异常。解决办法是了,便是让newStr拥有自己的char[]数组,也就是自己在subString时强迫创建自己的char[]数组,这样就不会有garbage collected 的问题(reachable but unused!) 怎么办:
Java代码
String sub = new String( oldString.substring(0, 4) );
---------------------------------------------------------------
为了避免内存拷贝、加快速度,Sun JDK直接复用了原String对象的char[],偏移量和长度来标识不同的字符串内容。也就是说,subString出的来String小对象仍然会指向原String大对象的char[],split也是同样的情况 。这就解释了,为什么HashMap中String对象的char[]都那么大。
-------------------------------------------------------
可以参考:
http://jarfield.iteye.com/blog/583946
- (转)Java中字符串与内存泄漏的问题
- Java语言中是否存在内存泄漏的问题
- java集合中HashSet引起的内存泄漏问题
- Java 中内存泄漏与C++的区别
- java内存泄漏问题检测与定位
- Java内存泄漏问题
- JAVA内存泄漏问题
- JAVA内存泄漏问题
- JAVA内存泄漏问题
- java内存泄漏问题
- java内存泄漏问题
- Java内存泄漏问题
- java内存泄漏问题
- [转]Java的内存泄漏
- Java的内存泄漏【转】
- extjs 中iframe内存泄漏的问题
- MVP中存在的内存泄漏问题
- java的OutOfMemory&内存泄漏问题- -
- ibaits2中要注意remapResults
- uccenter中找回创始人密码
- apusic 中的类加载顺序的修改
- android完全退出程序
- (转)表单显式label和隐式label对屏幕阅读器用户的影响–更新
- (转)Java中字符串与内存泄漏的问题
- java序列化,持久化
- hh
- CentOS yum详细使用
- 成都传智播客 不用“包就业”赚生源
- 操作本地数据库
- 黑马程序员_集合框架
- 合成类型
- linux驱动群 325429653 欢迎一起学习