`

(转)Java中字符串与内存泄漏的问题

 
阅读更多
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
分享到:
评论

相关推荐

    模糊字符串匹配:ruby的模糊字符串匹配库

    内存泄漏。 我感到很难维持。 因此,我决定通过移植lucene-3.0.x来创建另一个gem。 正在安装 gem install fuzzy-string-match 特征 计算两个字符串的Jaro-Winkler距离。 纯Ruby版本可以处理ASCII和UTF8字符串。 ...

    java面试宝典

    31、java 中会存在内存泄漏吗,请简单描述。 11 32、abstract 的method 是否可同时是static,是否可同时是native,是否可同时是synchronized? 11 33、静态变量和实例变量的区别? 11 34、是否可以从一个static 方法...

    Java优化编程(第2版)

    15.1 用weakhashmap屏蔽内存泄漏 15.2 优化java应用大小 15.3 通过randomaccess接口优化迭代列表 15.4 合并java中的多进程与系统优化 小结 附录a together工具的使用简介 附录b j2se 5.0的新特性与性能的提升 附录c ...

    Java面试宝典-经典

    81、java中会存在内存泄漏吗,请简单描述。 53 82、能不能自己写个类,也叫java.lang.String? 57 83. Java代码查错 57 二. 算法与编程 61 1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt...

    [java]读书笔记整理:一切都是对象

    一.用引用操纵对象 每种编程语言都有自己的数据操纵方式。有时候,程序员必须注意将要处理的数据是什么类型。...这样做就消除了这类编程问题(即“内存泄漏”),这是由于程序员忘记是放内存而产生的问题。

    Java面试宝典2010版

    81、java中会存在内存泄漏吗,请简单描述。 53 82、能不能自己写个类,也叫java.lang.String? 57 83. Java代码查错 57 二. 算法与编程 61 1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt...

    JavaScript中的垃圾回收与内存泄漏示例详解

    前言 程序的运行需要内存。只要程序提出要求,操作系统或者运行时就必须供给内存。所谓的内存泄漏简单来说是不再用到的内存,没有及时释放。为了更好避免内存泄漏,我们先...  由于字符串、对象和数组没有固定大小,

    java面试题大全(2012版)

    81、java中会存在内存泄漏吗,请简单描述。 53 82、能不能自己写个类,也叫java.lang.String? 57 83. Java代码查错 57 二. 算法与编程 61 1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt...

    java 面试题 总结

    JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变...

    MAT工具(基于Eclipse的内存分析工具)+MAT工具使用说明.docx

    MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速、功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗。使用内存分析工具从众多的对象中进行分析,快速的计算出在内存...

    最新Java面试宝典pdf版

    81、java中会存在内存泄漏吗,请简单描述。 53 82、能不能自己写个类,也叫java.lang.String? 57 83. Java代码查错 57 二. 算法与编程 61 1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt...

    Java面试笔试资料大全

    81、java中会存在内存泄漏吗,请简单描述。 53 82、能不能自己写个类,也叫java.lang.String? 57 83. Java代码查错 57 二. 算法与编程 61 1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt...

    GDA3.98不依赖java且支持反编译apk、dex、odex、oat、jar、aar、class, 支持python

    此外反编译器还提供了很多实用功能,如路径求解、 漏洞检测、隐私泄露检测、查壳、odex转dex、oat转dex、加解密算法工具、android设备内存dump等等。在交互式分析上,提供了字符串、方法、类和域交叉引用查询、调用...

    Java面试宝典2020修订版V1.0.1.doc

    35、MySQL、SqlServer、oracle写出字符存储、字符串转时间 52 36、update语句可以修改结果集中的数据吗? 53 37、oracle如何设置主键自动增长? 53 38、表连接、子查询的区别是什么?它们可以相互转化吗?你倾向于用...

    java面试宝典2012

    81、java中会存在内存泄漏吗,请简单描述。 59 82、能不能自己写个类,也叫java.lang.String? 62 83. Java代码查错 63 二. 算法与编程 67 1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt...

    JAVA面试宝典2010

    81、java中会存在内存泄漏吗,请简单描述。 53 82、能不能自己写个类,也叫java.lang.String? 57 83. Java代码查错 57 二. 算法与编程 61 1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt...

    Java面试宝典2012新版

    81、java中会存在内存泄漏吗,请简单描述。 53 82、能不能自己写个类,也叫java.lang.String? 57 83. Java代码查错 57 二. 算法与编程 61 1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt...

    Java面试宝典2012版

    81、java中会存在内存泄漏吗,请简单描述。 53 82、能不能自己写个类,也叫java.lang.String? 57 83. Java代码查错 57 二. 算法与编程 61 1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c...

Global site tag (gtag.js) - Google Analytics