GC如何判断对象可以被回收
引用计数法:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收.
引用计数法,可能会出现A引用了B,B又引用了A,这时候就算他们都不再使用,但是因为相互引用,计数器=1,导致永远无法回收.
Java 不采用引用计数法作为GC垃圾判断机制,而采用可达性分析法.
可达性分析法:从GC Roots开始向下搜索,搜索走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象时不可用的,那么虚拟机就判断是可回收对象.
GC Roots的对象有:
虚拟机栈(栈帧中的本地变量表)中引用的对象
方法区中静态属性引用的对象
方法区中常量引用的对象
本地方法栈中JNI(即Native方法)引用的对象