引用与回收

List<Bean> list = new ArrayList<>();
 list.add(bean);
bean = null;
System.gc();

请问list中的bean打印出来是什么?  答:是一个bean对象

正常不会这样写,一直有疑问,为什么 list里面的东西还在,bean不是设置为null了吗,并且GC了

解释:

bean只是一个栈中的变量,记录的是一个堆中的对象地址,bean=null;  只是把 栈中的变量地址置为null,堆中的对象仍然存在。

GC的时候,会有可达性分析法,发现堆中的对象没有引用,所以就会回收。

而这里bean在堆中的对象指向了bean和list,因此虽然bean变量置为null,但是还存在着list的引用,也就是说list还牵着堆中原来bean的对象,JVM发现有引用就不会回收,所以list还有东西在。

完整代码:

package com.my.study.reference;

import java.util.ArrayList;
import java.util.List;

public class ReferenceDemo {
    private BeanDemo beanDemo;

    public BeanDemo getBeanDemo() {
        return beanDemo;
    }

    public void setBeanDemo(BeanDemo beanDemo) {
        this.beanDemo = beanDemo;
    }

    public static void main(String[] args) {
        BeanDemo beanDemo = new BeanDemo();
        List<BeanDemo> list = new ArrayList<>();
        list.add(beanDemo);
        list.add(null);
        beanDemo = null;
        System.gc();
        System.out.println(list);
    }
}

class BeanDemo {

}

 

おすすめ

転載: blog.csdn.net/x18094/article/details/115911535