【发布时间】:2011-10-22 11:47:02
【问题描述】:
我很难理解 Android (Java) 中的字符串和内存管理发生了什么。
为了简化,看一下这段简单的代码:
public void createArray(){
String s = "";
String foo = "foo";
String lorem = "Lorem ipsum ad his scripta blandit partiendo, eum
fastidii accumsan euripidis in, eum liber hendrerit an.";
ArrayList<Item> array = new ArrayList<Item>();
for( int i=0; i<20000; i++ ){
s = foo.replace("foo", lorem);
array.add( new Item(s) );
}
System.gc();
}
private class Item{
String name;
public Item(String name){
this.name = name;
}
}
如果执行,createArray 将分配超过 5Mb 的内存。即使使用System.gc() 指令,循环后内存也不会被释放。
现在,如果我们将s = foo.replace("foo", lorem); 替换为s = lorem;,分配的内存只会增加0.5Mb。
我需要了解如何提高我的应用程序的性能。
谁能解释在这种情况下我应该如何替换字符串?为什么System.gc() 不释放内存?
谢谢。
更新:
感谢您的回答,现在我明白System.gc() 只是一个提示。
澄清另一个问题(重要的):
如何动态生成 20000 个字符串(“foo1”、“foo2”...“foo20000”)将它们添加到 ArrayList 并且不会耗尽内存?如果这 20000 个字符串是静态的,它们分配的内存不会超过 0.5Mb。此外,如果s = foo.replace("foo", lorem) 创建了一个全新的字符串,为什么我的函数分配了 10 倍的 5Mb 内存?不应该在 1Mb 左右?
(我已经在考虑一种解决方法,但我想确定没有办法在不使用大量内存的情况下动态生成字符串)
【问题讨论】:
-
在你的 for 循环末尾放
array = null。这应该可以为 GC 释放引用。
标签: java android string memory-management memory-leaks