Java String.split内存泄漏?

时间:2011-05-19 09:18:15

标签: java memory-leaks

我发现使用String.substring已知与String.split相关的内存问题。

使用String.split时是否存在内存泄漏?

如果是,它的解决方法是什么?


以下链接显示了Java中子字符串的正确用法。

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4513622


还有一个博客讨论子串中可能的MLK。

http://nflath.com/2009/07/the-dangers-of-stringsubstring/

1 个答案:

答案 0 :(得分:12)

更新:1.7.0_06中的行为已更改:请参阅此文章:{ - 3}},访问java-performance.info。


正如Changes to String internal representation made in Java 1.7.0_06指出的那样,使用String.substring时确实存在一种内存泄漏。原因是String.substring仅返回给定字符串的一部分视图,即基础字符串仍保留在内存中

要强制创建与源无关的新字符串,您必须使用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语言规范的一部分。)