Объекты потока не собираются мусором после завершения

Я заметил, что в моем приложении происходит утечка памяти. Это можно увидеть в DDMS, и я удалось получить OutOfMemoryError.

Я нашел источник утечки. Одно из действий имеет поток, работающий в фоновом режиме. Этот поток остановлен в onDestroy(). Он завершает работу, как это видно в DDMS.

Теперь, если поток запущен, происходит утечка, Activity не собирается мусором после уничтожения, потому что на него ссылается поток. Если поток вообще не запущен, все в порядке.

Вот простой пример, демонстрирующий это:

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    volatile boolean finished = false;
    byte[] memoryEater = new byte[4 * 1024 * 1024];

    Thread thread = new Thread(new Runnable() {

        @Override
        public void run() {
            while (!finished) {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            Log.d(getClass().getName(), "Thread finished");
        }
    });

    @Override
    protected void onDestroy() {
        super.onDestroy();
        finished = true;
    }

    public void startActivity(View view) {
        startActivity(new Intent(this, MainActivity.class));
    }

    public void startThread(View view) {
        thread.start();
    }
}

Добавьте одну кнопку для запуска нового действия и одну для запуска потока. Начать новую деятельность. После возврата память будет очищена только в том случае, если поток не был запущен.

В чем причина такого поведения?

10
задан Tomasz Niedabylski 13 April 2016 в 16:00
поделиться