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

Проверка и устранение утечек памяти в приложении

Итак, я закончил проект, теперь главная проблема, с которой я столкнулся, - это Утечка памяти в приложении ( "утечка" означает, что вы сохраняете ссылку на активность, тем самым предотвращая GC от его сбора)

В некоторых случаях я обнаружил, что происходит утечка памяти:

Контекст утечки

Это происходит из-за долговечной ссылки на контекст активности.

Хорошим примером этого я нашел здесь,

private static Drawable sBackground;

@Override
protected void onCreate(Bundle state) {
  super.onCreate(state);

  TextView label = new TextView(this);
  label.setText("Leaks are bad");

  if (sBackground == null) {
    sBackground = getDrawable(R.drawable.large_bitmap);
  }
  label.setBackgroundDrawable(sBackground);

  setContentView(label);
}

здесь проблема заключается в private static Drawable sBackground;. Статический Drawable создается с помощью Activity как контекста, поэтому в случае THAT есть статическая ссылка на Drawable, которая ссылается на Activity, и на то, почему там происходит утечка. Пока эта ссылка существует, активность будет храниться в памяти, утечка всех ее представлений.

Изменение ориентации экрана

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

Это приведет к большому количеству утечек памяти, так как могут быть большие битмапы для загрузки.

Контекст-активности

Третий случай, я нашел ссылку на контекст активности. Это также приводит к утечке памяти.

Интересно, есть ли простой способ избежать таких утечек памяти из происходит. или если может быть инструмент для проверки и удаления этих утечки памяти из приложения.

4b9b3361

Ответ 1

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

http://developer.android.com/tools/help/traceview.html

http://kohlerm.blogspot.com/2009/04/analyzing-memory-usage-off-your-android.html

Вот несколько статей, которые я нашел полезными

http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html

http://vahidmlj.blogspot.com/2012/10/android-memory-leak-on-screen-rotation.html

Ответ 2

Я знаю, что это старый пост, но в последнее время Square выпустила библиотеку под названием LeakCanary, которая на сегодняшний день является самым элегантным решением для поиска утечек памяти.