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

2022-09-03 05:47:12

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

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

任何想法或我是否读错了API。


答案 1

如果您获取一个相当大的字符串的子字符串而不进行复制(通常通过构造函数),则可能会发生内存泄漏。String(String)

请注意,自 Java 7u6 以来,这种情况已更改。请参阅 https://bugs.openjdk.java.net/browse/JDK-7197183

围绕实现蝇量级模式的对象的原始假设不再被视为有效。String

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


答案 2
  1. 在Java 7u6之前一直如此 - 您通常可以通过执行以下操作来处理这个问题:

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

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

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