Java的String.substring方法潜在的内存泄漏?(Java String.substr

2019-07-17 20:13发布

我正在经历String类API和看起来像有引起,因为它共享相同的字符数组作为原始字符串的子串的方法潜在的内存泄漏。

如果原始字符串是子串可以防止原始字符串返回巨额再小弦从垃圾收集在Java中(由大阵列备份)。

任何想法还是我读错了API。

Answer 1:

一个内存泄漏潜在的,如果你把一个相当大的字符串的一个子并不能复印(通常是通过String(String)构造函数)。

需要注意的是,因为这已经改变了的Java 7u6 。 见http://bugs.sun.com/view_bug.do?bug_id=4513622 。

周围的原假设String实施对象轻量级的模式已不再被视为有效。

见这个答案获取更多信息。



Answer 2:

  1. 这是直到Java的7u6的情况下 - 你一般会处理这样做的问题:

     String sub = new String(s.substring(...)); // create a new string 

    这有效地消除了依赖和原始字符串现在可用于GC。 这是通过的方式,其中使用字符串构造唯一有意义的场景之一。

  2. 由于Java的7u6 ,创建一个新的String,并没有记忆问题的任何更长的时间。



Answer 3:

在Java 7中,字符串的子字符串修改为:

/**
     * Returns a new string that is a substring of this string. The
     * substring begins with the character at the specified index and
     * extends to the end of this string. <p>
     * Examples:
     * <blockquote><pre>
     * "unhappy".substring(2) returns "happy"
     * "Harbison".substring(3) returns "bison"
     * "emptiness".substring(9) returns "" (an empty string)
     * </pre></blockquote>
     *
     * @param      beginIndex   the beginning index, inclusive.
     * @return     the specified substring.
     * @exception  IndexOutOfBoundsException  if
     *             <code>beginIndex</code> is negative or larger than the
     *             length of this <code>String</code> object.
     */
    public String substring(int beginIndex) {
        if (beginIndex < 0) {
            throw new StringIndexOutOfBoundsException(beginIndex);
        }
        int subLen = value.length - beginIndex;
        if (subLen < 0) {
            throw new StringIndexOutOfBoundsException(subLen);
        }
        return (beginIndex == 0) ? this : new String(value, beginIndex, subLen);
    }

因此,每次你用的beginIndex不等于0的子,我们有了新的String对象。



文章来源: Java String.substring method potential memory leak?