我说,我使用了一个包含大量数据的变量String data.我想以下列方式使用此字符串的一小部分:
this.smallpart = data.substring(12,18);
Run Code Online (Sandbox Code Playgroud)
经过几个小时的调试(使用内存可视化器)后,我发现对象字段smallpart记住了所有数据data,尽管它只包含子字符串.
当我将代码更改为:
this.smallpart = data.substring(12,18)+"";
Run Code Online (Sandbox Code Playgroud)
..问题解决了!现在我的应用程序现在使用很少的内存!
怎么可能?有谁能解释一下?我认为这个小部分一直在引用数据,但为什么呢?
更新: 如何清除大字符串呢?data = new String(data.substring(0,100))会做什么吗?
在查看在线代码示例时,我有时会通过使用new运算符将String常量赋值给String对象.
例如:
String s;
...
s = new String("Hello World");
Run Code Online (Sandbox Code Playgroud)
当然,这与之相比
s = "Hello World";
Run Code Online (Sandbox Code Playgroud)
我不熟悉这种语法,也不知道目的或效果是什么.由于String常量通常存储在常量池中,然后以JVM处理String常量的任何表示形式存在,甚至还会在堆上分配任何内容?
我正在浏览String类API,看起来像substring方法导致潜在的内存泄漏,因为它与原始String共享相同的字符数组.
如果原始字符串很大,则子字符串返回的小字符串可以防止原始字符串(由大数组备份)从Java中的垃圾收集.
任何想法或我读错了API.