2013-04-16 2 views
0

Это происходит во встроенной системе, использующей пользовательскую сборку платформы Android 4.0.2. Я вижу, что одно из наших приложений для приложений для Android растет примерно до 400 МБ (rss-размер, когда вызывается «ps») и убивается убийцей Linux OOM. Платформа Android была настроена с максимальным размером кучи, установленным на 62M. Я не знаю, как Dalvik VM позволил деятельности расти до 400 МБ.Линукс из памяти, убивающий мое приложение для Android.

Не должно ли приложение извлекать исключения из памяти Java, когда куча достигает 60 МБ? Мы не видим эти исключения Java в журналах logcat или в трассировках anr.

Мы реализовали выборочную активность, которая последовательно распределяет байтовые массивы и задает каждый байт для фиктивного значения. Мы видим исключения Outofmemory, когда активность распределяется около 60 МБ.

Существуют ли пути выделения в android, которые не учитываются в бюджете кучи? Действие отображает растровые изображения, загруженные с веб-сайта.

Ниже приведены результаты "getprop" на нашей платформе.

$ adb shell getprop | grep -i heap

Я ценю любые указатели.

Благодаря

Отредактировано: Примечание: Ниже выводится пс. Pss и Uss около 316M, что выше.

 
          PID  Vss  Rss  Pss Uss cmdline 
logcat: hd[0]: pexecd(65): 982 351512K 351316K 326300K 316632K mytest.home^M 
logcat: hd[0]: pexecd(65): 660 679916K 61044K 57200K 56952K ./videngine^M 

RAM: 741764K total, 20320K free, 2148K buffers, 80104K cached, 24964K shmem, 10368K slab 

ответ

2

Прямые распределения в собственном коде не учитываются в общей сумме кучи Java. Могут быть и другие возможности (возможно, страницы отображаются и заполнены из файлов?).

Если у вас есть специальная сборка Android, вы можете установить значения убийцы OOM, чтобы сохранить собственное приложение.

+0

Это обычное приложение для Android без каких-либо пользовательских вещей JNI. Я хочу, чтобы JVM выбрала исключения OOM вместо того, чтобы позволить процессу расти до 400 МБ. – videoguy

+0

Возможно, это не обычай (на самом деле я подумал - возможно, ошибочно - это даже не ваше приложение), но что он делает? В коде платформы много JNI. –

+0

Это приложение загружает веб-страницу с помощью элемента управления веб-браузером для Android. Похоже, что механизм Webkit делает много распределений в собственном коде вне кучи Android Java на основе загружаемой страницы. Это объясняет, почему приложение выросло до 300 Мбайт +. – videoguy

2

Я вижу один из наших андроид приложений деятельности, растущих около 400MB (размер RSS, когда «пс» вызывается)

Цитирую Dianne Hackborn, о выходе ps на Android: «ВСС и Rss-столбцы в основном представляют собой шум (это прямое адресное пространство и использование ОЗУ в процессе, где, если вы добавляете объем использования ОЗУ в процессы, вы получаете смехотворно большое число) «

Я сердечно призываю вас читать her epic SO answer on measuring an app's memory footprint. Примечательно, что Rss не играет никакой роли в ее анализе, помимо цитируемой мной цитаты. Следовательно, я бы предложил не беспокоиться о Rss и сосредоточиться на других показателях.

+0

Я собираюсь взглянуть на нить. Спасибо, что поделился. Это то, что я вижу, когда вызывается «ps». LogCat: HD [0]: pexecd (65): 982 351512K 351316K 326300K 316632K mytest.home^М LogCat: HD [0]: pexecd (65): 660 679916K 61044K 57200K 56952K ./native_engine^M ... – videoguy

1

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

Перейти к DDMS, и создать дамп кучи, нажав на иконку, которая выглядит следующим образом: HPROF

Следующих конвертировать HPROF в андроида формата обычного формата HPROF с помощью инструмента HPROF-сопу в androir-SDK/tools.

Затем откройте кучу кучи с Eclipse Memory Analyser (MAT) и посмотрите на дерево доминанта, там вы увидите список переменных, которые ваше приложение вынуждает Хранитель мусора Dalvik (GC) сохранить. Щелкните правой кнопкой мыши на них и перейдите к «Путь к корню GC» и «Исключить слабые ссылки», покажут ссылки, которые поддерживают эти объекты. Посмотрите, есть ли у вас какие-либо устаревшие ссылки, которые были сохранены как утечка памяти.

Вы можете посмотреть this video для подробного поиска утечки памяти в приложении для Android.

+0

Спасибо за информацию и ссылку. Мы исправим утечку памяти. Меня беспокоит то, почему во время работы Dalvik не выбрасывались исключения OutOfMemory. – videoguy

+1

Не все выделено на куче Dalvik Heap, различные вещи собираются получить больше, и они могут отражать в памяти приложения (например, вкладку запуска приложения под настройками), например JIT или что-то еще. Я действительно рекомендую смотреть видео с ввода-вывода, он подробно объясняет, что происходит с кучей, и как генерируется outOfMem Exp. – wangyif2

Смежные вопросы