字符串类中的子字符串方法导致内存泄漏
据说 String 类中的方法会导致内存泄漏。是真的吗?如何?它的替代方法是什么?
特别是寻找答案,
在java中可能导致内存泄漏的所有其他事情是什么?这将有助于我在编码时小心。substring
据说 String 类中的方法会导致内存泄漏。是真的吗?如何?它的替代方法是什么?
特别是寻找答案,
在java中可能导致内存泄漏的所有其他事情是什么?这将有助于我在编码时小心。substring
在以前版本的JDK中,该方法的实现将构建一个新对象,保留对整个char数组的引用,以避免复制它。因此,您可能会无意中保留对只有一个字符串的非常大的字符数组的引用。下面是一个可能引发的错误示例。substring
String
此方法现已更改,并且此“泄漏”不再存在。
如果要使用旧的 JDK(早于 OpenJDK 7,更新 6),并且希望在 之后有最少的字符串,请使用构造函数获取另一个字符串:substring
String s2 = new String(s1.substring(0,1));
至于你的第二个问题,关于“其他可能导致java内存泄漏的事情”,不可能以建设性的方式回答。在java标准库中没有很多例子,你可以如此轻松地保留对对象的隐藏引用。在一般情况下,请注意您构建的所有引用,最常见的问题可能是在不干净的集合或外部资源(文件,数据库事务,本机小部件等)中出现的。
该方法不会为 a 分配新的字符数组,而是简单地在现有的 char 数组上生成一个带有窗口的字符数组。这是对蝇量级模式的冲击,被视为一种优化。substring()
String
String
因此,如果我有一个巨大的(char数组),然后创建一个子字符串,即使我垃圾收集原始字符串,原始char数组仍然存在(尽管你认为你有一个子字符串,比如说,2个字符)。当(比如)解析大量的输入数据流(可能是XML文件)并通过以下方式提取少量文本时,经常会遇到这个问题。String
substring()
使用看似冗余的构造函数(采用!) 的构造函数可以解决此问题,因为它分配了一个新的(可能更小的)char 数组,从而允许对原始数组进行垃圾回收。String(String str)
String
String
请注意,从 Java 7u6 开始,此行为已更改。