我发现使用 String.substring
会导致与 String.split
相关的内存问题。
使用String.split
有内存泄漏吗?
如果是,解决方法是什么?
以下链接显示了 Java 中子字符串的正确用法。
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4513622
还有一篇博客讨论了子串中可能的 MLK。
最佳答案
更新:行为在 1.7.0_06 中发生了变化:请参阅这篇文章:Changes to String internal representation made in Java 1.7.0_06在 java-performance.info。
正如 @finnw 指出的那样使用 String.substring
时确实存在某种内存泄漏问题。原因是 String.substring
仅返回给定字符串的一部分的 View ,即,底层字符串仍保留在内存中。
要强制创建与源无关的新字符串,您必须使用 new
关键字。即,例如,您必须做
String[] parts = orig.split(";");
//String mySubstring = parts[i]; // keeps orig from being GC'd
String mySubstring = new String(parts[i]); // creates a new string.
或者,也许更直接
String mySubstring = new String(orig.split(";")[i]);
我必须说,这种行为对我来说似乎是“不必要的”。它应该可以使用弱引用或其他一些技术来解决。 (特别是考虑到 String
已经是一个特殊的类,是 Java 语言规范的一部分。)
关于Java String.split 内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6056389/