java - GC会尝试多次释放内存吗?

时间:2016-09-22 15:22:20

标签: java android android-asynctask garbage-collection

假设我有这样的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尝试的第一次尝试时,并且在尝试之后内存永远丢失了?

1 个答案:

答案 0 :(得分:1)

垃圾收集器不基于活动生命周期运行,它基于&#34操作;是否有任何对象引用它&#34;。所以是的,活动内存将在线程完成后释放(并且AsyncTask不再引用它)。

但这仍然是一个非常重的对象(活动)的内存泄漏。而且不应该做的不好的编程。

我不确定你是否有想要应用的实际问题,或者这是关于虚拟机内部工作的纯理论问题,但如果它是你的实际问题想要申请;答案是:不要这样做!