Ошибка финализатора утечки памяти

Я изучал утечки памяти и проверял их с помощью анализатора памяти. Итак, на практике у меня есть следующий код, который пропускает активность, поскольку анонимный внутренний класс содержит ссылку на активность. Вот код:

   public class MainActivity extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    exampleOne();
  }

  private void exampleOne() {
    new Thread() {
      @Override
      public void run() {
        while (true) {
          SystemClock.sleep(1000);
        }
      }
    }.start();
  }
}

У меня есть изображения анализатора памяти для вышеупомянутых утечек здесь (6 ротаций): 6 ротаций активности.введите здесь описание изображения

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

Теперь рассмотрим следующий код:

public class MainActivity extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    exampleTwo();
  }

  private void exampleTwo() {
    new MyThread().start();
  }

  private static class MyThread extends Thread {
    @Override
    public void run() {
      while (true) {
        SystemClock.sleep(1000);
      }
    }
  }
}

Здесь я сделал класс статическим, чтобы не было ссылки на внешнюю активность, и сборщик мусора мог свободно возвращать объекты Activity, не мешая классу потока.

Вот скриншоты MAT для того же: 6 вращений снова.

введите здесь описание изображения

У меня есть замешательство относительно второго набора скриншотов, где есть 5 ссылок на финализатор. Я погуглил об этом и обнаружил, что JVM добавляет объекты в очередь ссылок, как только они собираются пройти GCed. Я ожидал, что хотя это и произойдет, эти изменения не будут доступны в MAT, так как я не думаю, что GC займет много времени, чтобы освободить эти ссылки. Даже если я использую 13 вращений, результат тот же, с 12 ссылками на финализатор. Я могу ошибаться, но я думал, что MAT отобразит только 1 объект Activity, так как другие, должно быть, прошли GCed. Мы будем признательны за любую помощь в отношении эталонной очереди финализации и процесса, который происходит во время сборки мусора. Спасибо.


person gaurav jain    schedule 15.04.2015    source источник
comment
Вы пробовали принудительно собирать мусор?   -  person Tim B    schedule 15.04.2015
comment
Ну, нет, я не пробовал форсировать. Во втором случае я думаю, что сборщик мусора автоматически освободит память, поскольку ему ничто не мешает это сделать. Помещение объектов в очередь финализатора указывает на то, что эта память действительно готова к освобождению, но меня смущает то, что это не отражается в MAT.   -  person gaurav jain    schedule 15.04.2015


Ответы (1)


введите здесь описание изображения

Выберите Обзор финализатора. Он предоставляет информацию о количестве объектов, ожидающих запуска финализатора, и другую связанную информацию о потоке финализатора.

person Mohan Raj    schedule 25.04.2015