我注意到,我的应用程序正在泄漏内存。 这可以在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();
}
}
添加一个按钮,用于启动新的活动和一个用于启动一个线程。 开始新的活动。 回去之后,内存只能如果线程尚未启动清洗。
什么是这种行为的原因是什么?