Мне трудно понять, что происходит со строками и управлением памятью в 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
выделит более 5 МБ в памяти. Даже с инструкцией System.gc()
память не будет освобождена после цикла.
Теперь, если мы заменим s = foo.replace("foo", lorem);
на s = lorem;
, выделенная память увеличится только на 0,5 МБ.
Мне нужно понять, что происходит, чтобы улучшить производительность моего приложения.
Кто-нибудь может объяснить, как я должен заменить строки в таком случае, как это? И почему System.gc()
не освобождает память?
Спасибо.
ОБНОВЛЕНИЕ :
Спасибо за ответы, теперь я понимаю, что System.gc()
это только подсказка.
Для уточнения другого вопроса (важного):
Как я могу динамически генерировать 20000 строк ("foo1", "foo2" ... "foo20000"), добавлять их в ArrayList и не исчерпывать память? Если бы эти 20000 строк были статическими, они бы не выделяли более 0,5 МБ в памяти. Кроме того, если s = foo.replace("foo", lorem)
создает новую строку, почему моя функция выделяет 5 МБ, что в 10 раз больше памяти? Не должно быть около 1 МБ?
(я уже обдумываю обходной путь, но хочу быть уверен, что нет способа динамически генерировать строки без использования этого огромного объема памяти)