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, поэтому, пожалуйста, легко на меня:).....
Ответы
Ответ 1
Хотя это не лучший ответ, я настоятельно рекомендую вам посмотреть видеозапись Управление памятью для Android-приложений в Google IO 2011. Это делает отличная работа, объясняющая, как управлять памятью и какие сообщения, которые вы видите, фактически означают.
Ответ 2
Вам нужно разместить свой код для тех, кто поможет. В противном случае я предполагаю две вещи:
Поскольку ваш телефон рушится, вы должны делать что-то удивительное, что позволяет вашей программе работать за пределами выделенного пространства памяти VM.
Сохраняете ли вы все контакты в списке или массиве? Если это так, там ваша проблема. Это то, что Streams хорошо фиксирует.
Ответ 3
Загружая вы имеете в виду выборку данных из удаленного места? Кажется, что вы храните много ссылок на свои данные в памяти. Тебе обязательно? В зависимости от того, чего вы пытаетесь достичь, обычно есть несколько вещей, которые вы могли бы попытаться свести к минимуму объем памяти. Начнем с того, что я не буду использовать ссылки на String, но я бы передал данные непосредственно потребителю. Кроме того, попробуйте обработать все ваши данные в кусках. Вам также необходимо сохранить данные в файловой системе? Если это так, переходите непосредственно к файловой системе и избегайте хранения памяти. Если вы разместите какой-то код, это может помочь.