首页 存档 技术 查看内容

Java中的substring真的会引起内存泄露么?

2018-3-30 13:00 |来自: 互联网 318 0

摘要: 官方微博:动力节点 来源:分享空间 在Java中开发,String是我们开发程序可以说必须要使用的类型,String有一个substring方法用来截取字符串,我们想必也常常使用。 但是你知道么,关于Java 6中的substring是否会 ...

官方微博:动力节点

来源:分享空间


在Java中开发,String是我们开发程序可以说必须要使用的类型,String有一个substring方法用来截取字符串,我们想必也常常使用。


但是你知道么,关于Java 6中的substring是否会引起内存泄露,在国外的论坛和社区有着一些讨论,以至于Java官方已经将其标记成bug,并且为此Java 7 还重新进行了实现。读到这里可能你的问题就来了,substring怎么会引起内存泄露呢?那么我们就带着问题,走进小黑屋,看看substring有没有内存泄露,又是怎么导致所谓的内存泄露。


基本介绍


substring方法提供两种重载,第一种为只接受开始截取位置一个参数的方法。


public String substring(int beginIndex)



比如我们使用上面的方法,"unhappy".substring(2) 返回结果 "happy"

另一种重载就是接受一个开始截取位置和一个结束截取位置的参数的方法。


public String substring(int beginIndex, int endIndex)



使用这个方法,"smiles".substring(1, 5) 返回结果 "mile"

通过这个介绍我们基本了解了substring的作用,这样便于我们理解下面的内容。


准备工作


因为这个问题出现的情况在Java 6,如果你的Java版本号不是Java 6 需要调整一下。

终端调整(适用于Mac系统)


查看java版本号

13:03 $ java -versionjava version "1.8.0_25"Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)


切换到1.6

export JAVA_HOME=$(/usr/libexec/java_home -v 1.6)


Ubuntu使用alternatives --config java,Fedora上面使用alternatives --config java。

如果你使用Eclipse,可以选择工程,右击,选择Properties(属性) Java Compiler(Java编译器)进行特殊指定。


问题重现


这里贴一下java官方bug里用到的重现问题的代码。


public class TestGC {  private String largeString = new String(new byte[100000]);  String getString() {    return this.largeString.substring(0,2);
  }  public static void main(String[] args) {
    java.util.ArrayList list = new java.util.ArrayList();    for (int i = 0; i
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部