假设我有这样的asyncTask:
public void startAsyncTask() {
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
try {
Thread.sleep(300000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
}.execute();
}
对于那些不了解asyncTask的人,只需创建一个后台线程。 而匿名类实际上是非静态内部类。
现在让我们在活动(主线程)中说我呼叫startAsyncTask()
线程需要一段时间才能完成(大约5分钟)。
在后台线程生命周期中,让我们假设活动获得销毁以及垃圾收集活动的时间。由于asyncTask具有对外部类(活动)的隐式引用,因此活动将泄漏并且不会被垃圾回收。
但我的问题如下:经过一段时间后,子线程最终会完成。 GC可以再次尝试释放内存还是活动永远泄露?我真正想知道的是,如果子线程在一段合理的时间内完成,活动内存是否会被释放,或者只是在GC尝试的第一次尝试时,并且在尝试之后内存永远丢失了?
答案 0 :(得分:1)
垃圾收集器不基于活动生命周期运行,它基于&#34操作;是否有任何对象引用它&#34;。所以是的,活动内存将在线程完成后释放(并且AsyncTask不再引用它)。
但这仍然是一个非常重的对象(活动)的内存泄漏。而且不应该做的不好的编程。
我不确定你是否有想要应用的实际问题,或者这是关于虚拟机内部工作的纯理论问题,但如果它是你的实际问题想要申请;答案是:不要这样做!