Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java String.split内存泄漏?_Java_Memory Leaks - Fatal编程技术网

Java String.split内存泄漏?

Java String.split内存泄漏?,java,memory-leaks,Java,Memory Leaks,我发现使用String.substring会导致与String.split相关的内存问题 使用String.split时是否存在内存泄漏 如果是的话,它的工作环境是什么 下面的链接显示了子字符串在Java中的正确用法 还有一个博客讨论了子字符串中可能的MLK 更新:行为在1.7.0\u 06中发生了变化:请参阅本文:位于java-performance.info 正如所指出的,当使用String.substring时,确实存在一种内存泄漏。原因是String.substring仅返回给定

我发现使用
String.substring
会导致与
String.split
相关的内存问题

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

如果是的话,它的工作环境是什么


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


还有一个博客讨论了子字符串中可能的MLK


更新:行为在1.7.0\u 06中发生了变化:请参阅本文:位于java-performance.info


正如所指出的,当使用
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语言规范的一部分。)

我意识到英语可能不是你的第一语言,但这个问题毫无意义。请给我们一些上下文,我不认为这种常用的方法有内存泄漏,这种情况在Java的早期版本就存在了。但是如果你发现内存泄漏,请提供一些信息。你能给我们一些关于你提到的已知工作的链接吗?下面是我从一些用户那里看到的评论,我也会在JavaDocs中提到这个问题。我也遇到过类似的问题,但使用String.split而不是String.substang,其工作方式相同(分割块引用原始字符串的存储),我花了一些时间才发现问题Java优化了子字符串/分割以快速创建字符串,如果原始字符串需要大量内存,则必须使用新字符串(…)获得的副本。Java无法为您做到这一点,因为正确的行为取决于您如何使用字符串。谢谢,但是使用拆分是否有任何问题?否。如果您分离字符串,则希望继续使用
新字符串(…)
你应该很好。我想不使用弱引用的原因是因为垃圾收集器处理弱引用的成本很高。这是一个不幸的情况,通常是一个重要的优化,有时是相反的。对。尽管如此,我还是感到惊讶的是,他们还没有通过其他方式解决这个问题,例如,如果需要的话,使用JVM内部黑客。(字符串已经是JLS的一部分了)。@aioobe-1)这个内部黑客会使用什么技术?2) 虽然字符串在JLS中有着特殊的地位,但我相信在最近的热点JVM中,它们几乎完全是用Java实现的。(
String.intern
是唯一的例外,我想。)