这个问题已经在这里有一个答案:
- Java的String.substring方法潜在的内存泄漏? 3个回答
据说, substring
在String类方法将导致内存泄漏。 是真的吗? 怎么样? 什么是它的方法吗?
特别是在寻找答案,
什么是所有其他的东西在java中其可以内存泄漏的原因是什么? 这将帮助我在编码照顾。
这个问题已经在这里有一个答案:
据说, substring
在String类方法将导致内存泄漏。 是真的吗? 怎么样? 什么是它的方法吗?
特别是在寻找答案,
什么是所有其他的东西在java中其可以内存泄漏的原因是什么? 这将帮助我在编码照顾。
在JDK过去的版本中,执行substring
方法将建立一个新的String
对象保持整个字符数组的引用,以避免复制它。 你可以这样的引用在不经意间保持一个非常大的字符数组只用一个字符串。 这里有一个例子 ,这可能导致一个错误。
这种方法现在已经改变,这种“泄漏”已经不存在了。
如果你想使用旧的JDK(比OpenJDK 7的年纪大了,更新6),并要在其后有最小的串substring
,使用构造采取另一个字符串:
String s2 = new String(s1.substring(0,1));
至于你的第二个问题,关于“其他东西可以在Java内存泄漏的原因”,这是不可能以一种建设性的方式来回答。 有没有在Java标准库的情况下,你可以如此轻易地保持隐藏的对象的引用的许多实例。 在一般情况下,要注意你建立,最常见的问题可能是在未清洁的集合或外部资源(文件,数据库事务,本机小部件等)所产生的所有引用。
的substring()
方法不分配一个新的字符阵列为一String
,而是简单地产生一个String
与窗口到现有 char数组。 这是一个轻量级的模式的impementation,被视为最优化。
所以,如果我有一个巨大的String
(char数组),然后创建一个字符串,即使我的垃圾收集原始的字符串,原来的字符数组遗体(尽管你认为你有,比如说,2个字符的子串)。 这个问题经常遇到时(比方说)解析输入数据的巨大流(可能是一个XML文件),并通过提取文本少量substring()
使用看似多余的String(String str)
构造函数(一个String
构造函数取String
!)解决了这个,因为它分配一个新的(可能更小)字符数组,可让原本进行垃圾回收。
请注意,此行为已更改为Java的7u6的。
字符串的子串会导致保留比你想象的更多的内存。 因此它并不像该内存可以正常恢复的内存泄漏。
最简单的办法是使用最新版本的Java 7的,不这样做。 由于这是甲骨文唯一的自由支持的版本,你应该考虑这样做呢。
因此,它是在Java 7的更新5.“固定”恕我直言,这与其说是一个修复作为实现的简化。 以每串的副本,都会花费更多的工作,很可能会占用更多的内存,但它确实意味着有一个担心少一点。
什么是所有其他的东西在java中其可以内存泄漏的原因是什么?
任何对象都可以被清理因此它不可能在C创建内存泄漏的术语的/ C ++感。 你可以做的是守住对象不正确。 这方面的一个常见的例子是忘记关闭资源,如JDBC资源。 这可能会导致你在你不期望的方式留住记忆。
在String对象,当你调用substring
,该value
属性是两个字符串之间共享。
所以,如果你从一个大的字符串得到一个子,并保持很长一段时间,大串不会被垃圾收集。 这可能会导致内存泄漏,其实。