gpt4 book ai didi

android - 线程对象在完成后未被垃圾回收

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:57:46 24 4
gpt4 key购买 nike

我注意到我的应用程序正在泄漏内存。这可以在DDMS中看到,我设法获得 OutOfMemoryError。

我找到了泄漏的源头。其中一个 Activity 有一个线程在后台运行。此线程在 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();
}
}

添加一个用于启动新 Activity 的按钮和一个用于启动线程的按钮。开始新的 Activity 。回去后只有线程没有启动才会清理内存。

这种行为的原因是什么?

最佳答案

我刚刚发现了同样的问题。

Tomasz,你走在正确的轨道上。 DDMS 中没有错误,您的程序中也没有内存泄漏。

真正的问题是您正在以 DEBUG 模式(在 Eclipse 下)运行程序。不知何故,当 Android 在 DEBUG 模式下运行时,即使在 run() 方法退出后线程也不会被垃圾回收。我想这可能是 Android 需要保留 Thread 才能使某些调试功能正常工作。

但是如果您在 RUN 模式下运行您的应用程序(仍在 Eclipse 下),线程垃圾收集就会发生。 Thread 将被完全释放,您的 Activity 将被完全释放。

关于android - 线程对象在完成后未被垃圾回收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11640390/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com