Java String.split 内存泄漏?

标签 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.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/

相关文章:

java - 同时使用TableCellEditor和TableCellRenderer?

javascript - 使用监听器删除 dom 元素会导致内存泄漏吗?

java - 我的 json 响应中的全屏 Activity 中未显示图像..?滑动的同时也

java - Mockito 修改方法行为

c# - Process.Start 导致我的 WPF 程序崩溃

delphi - Delphi XE 中 Web 服务中的 TXSDateTime/TXSDecimal 内存泄漏

c++ - 如何检查我的 C++ 程序在内存中的增长状态?

c++ - QProcess导致内存泄漏

类字段的 java 模板

Java - instanceof 在应该为真时返回 false