我使用了一个包含大量数据的变量,比如String data. 我想通过以下方式使用这个字符串的一小部分:
String data
this.smallpart = data.substring(12,18);
经过几个小时的调试(使用内存可视化工具),我发现 objects 字段smallpart记住了来自 的所有数据data,尽管它只包含子字符串。
smallpart
data
当我将代码更改为:
this.smallpart = data.substring(12,18)+"";
..问题解决了!现在我的应用程序现在使用的内存很少!
这怎么可能?谁能解释一下?我认为 this.smallpart 一直在引用数据,但为什么呢?
更新: 那我该如何清除大字符串?data = new String(data.substring(0,100)) 会做这件事吗?
执行以下操作:
data.substring(x, y) + ""
创建一个新的(较小的)String 对象,并丢弃对由 substring() 创建的 String 的引用,从而启用对此的垃圾收集。
要意识到的重要一点是,它为 现有substring()字符串提供了一个窗口- 或者更确切地说,是原始字符串下面的字符数组。因此它将消耗与原始字符串相同的内存。这在某些情况下可能是有利的,但如果您想获取子字符串并处理原始字符串(如您所见),则会出现问题。 __
substring()
查看JDK String 源代码中的substring() 方法以获取更多信息。
编辑:要回答您的补充问题,从子字符串构造一个新字符串将减少您的内存消耗, 前提是 您将任何对原始字符串的引用合并。
注意(2013 年 1 月)。上述行为在 Java 7u6中发生了变化。享元模式不再使用,substring()将按照您的预期工作。