Объекты потока не собраны мусором после завершения
Я заметил, что у моего приложения есть утечка памяти. Это можно увидеть в DDMS, и я удалось получить ошибку OutOfMemoryError.
Я нашел источник утечки. В одном из заданий поток работает в фоновом режиме. Эта тема остановлена вonDestroy()
, Он завершает работу, как это видно из DDMS.
Теперь, если поток запущен, происходит утечка, активность не собирается после уничтожения мусора, потому что на него ссылается поток. Если поток вообще не запускается, все в порядке.
Вот простой пример, демонстрирующий это:
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();
}
}
Добавьте одну кнопку для начала нового действия и одну для запуска потока. Начать новую деятельность. После возврата память будет очищена, только если поток не был запущен.
В чем причина этого поведения?