我发现使用String.substring已知与内存相关的问题String.split.
使用中是否存在内存泄漏String.split?
如果是的话,它的解决方法是什么?
以下链接显示了Java中子字符串的正确用法.
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4513622
还有一篇博客讨论子串中可能的MLK.
aio*_*obe 12
更新:行为在1.7.0_06中已更改:请参阅此文章:在java-performance.info 中对Java 1.7.0_06中的字符串内部表示的更改.
正如@finnw所指出的那样,使用时确实存在潜伏的内存泄漏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.
Run Code Online (Sandbox Code Playgroud)
或者,也许更直接
String mySubstring = new String(orig.split(";")[i]);
Run Code Online (Sandbox Code Playgroud)
我必须说这种行为对我来说似乎"没必要".它应该可以使用弱引用或其他技术来解决.(特别是考虑到这String已经是一个特殊的类,是Java语言规范的一部分.)
| 归档时间: |
|
| 查看次数: |
4777 次 |
| 最近记录: |