ww_bin 2020-09-04 18:25 采纳率: 50%
浏览 131
已结题

Android(java) 回收gc问题

步骤:
1、activity中,有一个成员变量,这个成员变量是一个自定义类TestInnerClass
2、这个自定义TestInnerClass,里面有个内部类InnerClass,是个Runnable接口。
3、运行这个activity,然后调用了testInnerClass.run(),线程就会在后台一直跑。然后关闭activity。

代码如下:

public class TestActivity extends Activity {

    private TestInnerClass  testInnerClass;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        testInnerClass = new TestInnerClass();
        testInnerClass.run();
    }
}


public class TestInnerClass {

    public void run(){
        InnerClass innerClass = new InnerClass();
        Thread thread = new Thread(innerClass);
        thread.start();
    }


    public class InnerClass implements Runnable{

        private Context context;

        public InnerClass() {
        }

        public InnerClass(Context context) {
            this.context = context;
        }

        @Override
        public void run() {
            while (true) {
                try {
                    Thread.sleep(2000); 
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
     }

}

在此过程中,我猜测:
1、InnerClass是个内部类,在TestInnerClass的run()方法中,new了这个对象,那么TestInnerClass就会被InnerClass持有,而InnerClass这个runnable接口,又会被thread持有,因此,TestInnerClass在activity关闭之后,不会被释放。
2、由于TestInnerClass没有被释放,这时候就触及到了我的知识盲区,这个时候activity到底能不能被释放呢?gc规则的话,能否回收这个对象,要看可达性,activity是没有被其他地方强引用的,但是它的成员变量TestInnerClass又被thread持有,那activity会怎样呢?

然后我用android studio看了一下关闭activity后的内存:
图片说明

然后,对于TestInnerClass,确实存在于内存:
图片说明
图片说明

我的疑问是:
activity被回收的时候,成员变量在跟activity不同生命周期的thread中被引用。那么java的回收有没有可能存在是,实例被回收了,但是实例中的成员变量还在内存中?

  • 写回答

4条回答 默认 最新

  • dabocaiqq 2020-09-05 13:48
    关注
    评论

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!