android утечка - Какие инструменты и методы Android лучше всего подходят для поиска утечек памяти / ресурсов?




4 Answers

Одной из наиболее распространенных ошибок, которые я обнаружил при разработке Android Apps, является ошибка «java.lang.OutOfMemoryError: Bitmap Size Exceeds VM Budget». Я быстро обнаружил эту ошибку при работе с большим количеством растровых изображений после изменения ориентации: активность разрушена, создана снова, а макеты «раздуты» из XML, потребляющего память VM, доступную для растровых изображений.

Растровые изображения в предыдущем макете деятельности не были должным образом освобождены сборщиком мусора, поскольку они пересекли ссылки на их деятельность. После многих экспериментов я нашел неплохое решение этой проблемы.

Сначала установите атрибут «id» в родительском представлении вашего XML-макета:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     android:id="@+id/RootView"
     >
     ...

Затем в методе onDestroy () вашей операции вызовите метод unbindDrawables (), передающий подтверждение родительскому представлению, а затем выполните команду System.gc ()

    @Override
    protected void onDestroy() {
    super.onDestroy();

    unbindDrawables(findViewById(R.id.RootView));
    System.gc();
    }

    private void unbindDrawables(View view) {
        if (view.getBackground() != null) {
        view.getBackground().setCallback(null);
        }
        if (view instanceof ViewGroup) {
            for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
            unbindDrawables(((ViewGroup) view).getChildAt(i));
            }
        ((ViewGroup) view).removeAllViews();
        }
    }

Этот метод unbindDrawables () исследует дерево представления рекурсивно и:

  1. Удаляет обратные вызовы во всех фоновых рисунках
  2. Удаляет дочерние элементы в каждой группе просмотра
андроид памятью

У меня разработано приложение для Android, и я нахожусь в разработке приложений для телефона, где все, кажется, работает хорошо, и вы хотите объявить о победе и отправке, но вы знаете, что должны быть какие-то утечки памяти и ресурсов там; и на Android есть только 16 мб кучи, и, по-видимому, это удивительно легко протекает в приложении для Android.

Я оглядывался и до сих пор мог только выкопать информацию о «hprof» и «traceview», а также не получил много положительных отзывов.

Какие инструменты или методы вы столкнулись или разработали и можете поделить, может быть, в проекте ОС?




В основном для путешественников Google из будущего:

К сожалению, большинство java-инструментов не подходят для этой задачи, потому что они анализируют только JVM-кучу. Однако у каждого приложения Android также есть своя куча, которая также должна соответствовать пределу ~ 16 МБ. Например, он обычно используется для битмап-данных. Таким образом, вы можете легко запускать ошибки Out Of Memory, даже если ваша JVM-куча чиллина составляет около 3 МБ, если вы используете множество чертежей.




Хороший отчет о вводе / выводе Google (2011) по управлению памятью в Android, а также подробные сведения о инструментах + методы для профилирования памяти:
http://www.youtube.com/watch?v=_CruQY55HOk




Ну, это те инструменты, которые связаны с уникальными форматами, которые использует Android. Я думаю, что вы можете быть неудовлетворены тем, что использует базовую структуру кода тестирования.

Вы пробовали тестировать области кода с помощью Android Mock Framework?




Related

android memory-leaks