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

Sru*_*lla 15 java string memory-leaks

我正在浏览String类API,看起来像substring方法导致潜在的内存泄漏,因为它与原始String共享相同的字符数组.

如果原始字符串很大,则子字符串返回的小字符串可以防止原始字符串(由大数组备份)从Java中的垃圾收集.

任何想法或我读错了API.

Bri*_*new 18

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

请注意,自Java 7u6以来,这已发生了变化.请参见http://bugs.sun.com/view_bug.do?bug_id=4513622.

围绕String实现flyweight模式的对象的原始假设不再被视为有效.

有关详细信息,请参阅此答案.

  • @assylias更像是一个警察.人们已经确定substring()/ trim()是O(1).默默地将它改为O(n)并不是很好.那么如何在不同的Java版本上编写代码表现一致? (2认同)

ass*_*ias 5

  1. 在 Java 7u6 之前都是这种情况 - 您通常会通过执行以下操作来处理该问题:

    String sub = new String(s.substring(...)); // create a new string
    
    Run Code Online (Sandbox Code Playgroud)

    这有效地消除了依赖性,原始字符串现在可用于 GC。顺便说一句,这是使用字符串构造函数有意义的唯一场景之一。

  2. Java 7u6开始,创建了一个新的String,并且不再存在内存问题。