Подтвердить что ты не робот

Android dalvikvm-heap: Clamp target GC heap

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

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

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

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

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

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, поэтому, пожалуйста, легко на меня:).....

4b9b3361

Ответ 1

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

Ответ 2

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

Поскольку ваш телефон рушится, вы должны делать что-то удивительное, что позволяет вашей программе работать за пределами выделенного пространства памяти VM. Сохраняете ли вы все контакты в списке или массиве? Если это так, там ваша проблема. Это то, что Streams хорошо фиксирует.

Ответ 3

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