Java String.substring 方法潜在的内存泄漏?
2022-09-03 05:47:12
我正在浏览String类API,看起来子字符串方法可能导致潜在的内存泄漏,因为它与原始String共享相同的字符数组。
如果原始字符串很大,则子字符串返回的小字符串可以防止原始字符串(由大数组备份)在Java中进行垃圾回收。
任何想法或我是否读错了API。
我正在浏览String类API,看起来子字符串方法可能导致潜在的内存泄漏,因为它与原始String共享相同的字符数组。
如果原始字符串很大,则子字符串返回的小字符串可以防止原始字符串(由大数组备份)在Java中进行垃圾回收。
任何想法或我是否读错了API。
如果您获取一个相当大的字符串的子字符串而不进行复制(通常通过构造函数),则可能会发生内存泄漏。String(String)
请注意,自 Java 7u6 以来,这种情况已更改。请参阅 https://bugs.openjdk.java.net/browse/JDK-7197183。
围绕实现蝇量级模式的对象的原始假设不再被视为有效。String
有关详细信息,请参阅此答案。
在Java 7u6之前一直如此 - 您通常可以通过执行以下操作来处理这个问题:
String sub = new String(s.substring(...)); // create a new string
这有效地消除了依赖关系,并且原始字符串现在可用于GC。顺便说一句,这是使用字符串构造函数有意义的唯一方案之一。
从Java 7u6开始,将创建一个新的字符串,并且不再存在内存问题。