Android-далвиквм-куча: зажать целевую кучу - PullRequest
22 голосов
/ 11 ноября 2010

Я пишу процедуру для синхронизации большого количества контактов с базой данных контактов Android.Загрузка работает нормально примерно для 700 контактов, после чего я постоянно получаю ошибку кучи памяти, которая вызывает бесконечное количество операторов GC и в итоге перезагружает телефон.Я сталкиваюсь с проблемой желания HTC.

Я проверил размер кучи приложения с помощью инструмента выделения кучи из DDMS, а также извлек файл hprof с помощью Debug.dumpHprofData.В обоих журналах указано, что размер кучи составляет около 2,4 МБ.

Однако я получаю следующие журналы, которые указывают, что размер кучи превышает 32. МБ

dalvikvm-heap(92): Clamp target GC heap from 33.999MB to 32.000MB
dalvikvm(92): GC_FOR_MALLOC freed 2 objects / 48 bytes in 313ms

Я вставил следующеерегистрировать операторы в цикле, в котором была записана моя логика загрузки соединений.

Log.e("Memory", "free mem =" +runtime.freeMemory());
Log.e("Memory", "total memory =" +runtime.totalMemory());

Это начальные и конечные значения напечатанного оператора

---------------------------------------------------------------
11-11 12:56:04.168: ERROR/Memory(25132): free mem =871248
11-11 12:56:04.168: ERROR/Memory(25132): total memory =4202464

---------------------------------------------------------------

11-11 13:01:55.408: ERROR/Memory(25132): free mem =891640
11-11 13:01:55.408: ERROR/Memory(25132): total memory =4726752

---------------------------------------------------------------

Это указывает на то, что в настоящее время нет утечек памятиприсутствует в логике контактов синхронизации.

Может кто-нибудь сообщить мне, почему размер кучи увеличен (до 32,00 Мб) до такой степени, что устройство перезагружается само?Я новичок в Android и Java, поэтому, пожалуйста, будьте осторожны со мной:) .....

Ответы [ 3 ]

8 голосов
/ 17 октября 2011

Хотя это не лучший ответ, я настоятельно рекомендую вам посмотреть видео Управление памятью для Android-приложений доклад на Google IO 2011. Он отлично объясняет, как управлять памятью ичто на самом деле означают сообщения, которые вы видите.

2 голосов
/ 17 ноября 2011

Вам нужно опубликовать свой код, чтобы кто-нибудь помог вам. В противном случае я предполагаю две вещи:

Поскольку ваш телефон выходит из строя, вы, должно быть, делаете что-то удивительное, что позволяет вашей программе работать за пределами выделенного пространства памяти ВМ. Храните ли вы все контакты в списке или массиве? Если так, то есть ваша проблема. Это то, что Streams хорош в исправлении.
1 голос
/ 19 ноября 2011

Под загрузкой вы подразумеваете получение данных из удаленного места?Кажется, вы храните много ссылок на свои данные в памяти.Тебе обязательно?В зависимости от того, чего вы пытаетесь достичь, обычно есть несколько вещей, которые вы можете попытаться свести к минимуму объем памяти.Для начала я бы позаботился о том, чтобы не использовать ссылки String, но передавал данные напрямую потребителю.Кроме того, попробуйте обработать все ваши данные кусками.Вам также нужно сохранить данные в файловой системе?Если это так, поток непосредственно в файловую систему и избежать хранения памяти все вместе.Если вы разместите код, это может помочь.

...