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 {
}