【发布时间】:2012-07-23 07:59:57
【问题描述】:
我注意到我的应用程序正在泄漏内存。这可以在 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();
}
}
添加一个用于启动新活动的按钮和一个用于启动线程的按钮。开始新的活动。回去之后,只有在线程没有启动的情况下才会清理内存。
这种行为的原因是什么?
【问题讨论】:
-
您能提出一个问题吗?我怀疑它的行为符合预期。每次发送 Intent 时,都会创建新的 Activity,而您似乎并没有关闭 Activity。
-
您可以通过按返回来关闭活动。这就是泄漏发生的时候
-
您在
startActivity中分发了对this的引用。这个引用可以存储在某个地方吗?
标签: android debugging memory-leaks garbage-collection ddms