У меня разработано приложение для Android, и я нахожусь на стадии разработки приложения для телефона, где, кажется, все работает хорошо, и вы хотите объявить о победе и победе, но вы знаете, что просто должны быть некоторые утечки памяти и ресурсов там; и на Android всего 16 Мб кучи, и, по-видимому, удивительно легко просочиться в приложение для Android.
Я искал вокруг и до сих пор был в состоянии только выкопать информацию о «hprof» и «traceview», и ни один не получил много положительных отзывов.
С какими инструментами или методами вы столкнулись или разработали и хотите поделиться, возможно, в проекте ОС?
android
memory-leaks
jottos
источник
источник
Ответы:
Одной из самых распространенных ошибок, которые я обнаружил при разработке приложений для Android, является ошибка «java.lang.OutOfMemoryError: Размер растрового изображения превышает бюджет виртуальной машины». Я часто обнаруживал эту ошибку в действиях, использующих множество растровых изображений после изменения ориентации: действие уничтожается, создается заново, а макеты «раздуваются» из XML, потребляя память виртуальной машины, доступную для растровых изображений.
Битовые карты в предыдущем макете активности не освобождаются сборщиком мусора должным образом, потому что они пересекли ссылки на свою активность. После многих экспериментов я нашел довольно хорошее решение для этой проблемы.
Сначала установите атрибут «id» в родительском представлении макета XML:
Затем в методе onDestroy () вашего Activity вызовите метод unbindDrawables (), передав ссылку на родительский View, а затем выполните System.gc ().
Этот метод unbindDrawables () рекурсивно исследует дерево представлений и:
источник
PageAdapter
и я работаю над этой ошибкой :(Загрузите анализатор памяти Eclipse ( http://www.eclipse.org/mat/ ), проверьте http://kohlerm.blogspot.com/2010/02/android-memory-usage-analysis-slides.html и http: // kohlerm.blogspot.com/search/label/memory
источник
В основном для путешественников Google из будущего:
К сожалению, большинство инструментов Java не подходят для этой задачи, потому что они анализируют только JVM-кучу. Каждое Android-приложение также имеет собственную кучу, которая также должна умещаться в пределах ~ 16 МБ. Например, он обычно используется для растровых данных. Таким образом, вы можете легко столкнуться с ошибками нехватки памяти, даже если ваша JVM-куча занимает около 3 МБ, если вы используете много отрисовок.
источник
Ответ от @ hp.android хорошо работает, если вы просто работаете с растровым фоном, но в моем случае у меня был
BaseAdapter
наборImageView
s для aGridView
. Я изменилunbindDrawables()
метод в соответствии с рекомендациями, чтобы условие было:но проблема в том, что рекурсивный метод никогда не обрабатывает потомков
AdapterView
. Чтобы решить эту проблему, я вместо этого сделал следующее:так что потомки по-
AdapterView
прежнему обрабатываются - метод просто не пытается удалить все потомки (что не поддерживается).Однако это не совсем решает проблему, поскольку она
ImageView
управляет растровым изображением, которое не является их фоном. Поэтому я добавил следующее. Это не идеально, но работает:В целом
unbindDrawables()
метод тогда:Я надеюсь, что есть более принципиальный подход к освобождению таких ресурсов.
источник
Хороший доклад о вводе / выводе в Google (2011) по управлению памятью в Android, а также подробности об инструментах и методах профилирования памяти:
http://www.youtube.com/watch?v=_CruQY55HOk
источник
Valgrind был портирован на Android (спонсор Mozilla). См. Valgrind на Android - текущее состояние и поддержка Запуск Valgrind для Android на ARM (комментарий 67).
источник
Что ж, это инструменты, которые связывают уникальные форматы, которые использует Android ... Я думаю, что вы можете быть недовольны основной используемой платформой для тестирования кода.
Вы пробовали пробное тестирование областей кода с помощью Android Mock Framework?
источник