引用计数法:每个对象都有个引用计数属性,新建一个引用,计数增加,引用释放计数减1,计数为0时被回收(方便,但是对于相互引用的对象无效)
可达性分析法:从gc roots开始根据引用链向下搜索,当对象不在引用链,会被回收。
gc roots对象:(有哪些是gc roots)
1,虚拟机栈中的引用对象(就是指方法中new 的对象)
2,方法中静态属性引用对象
3,方法中常量引用对象
4,本地方法栈中JN引用的对象
可达性分析法:内部原理:
对象被回收需要两次标记
第一次,对象没有与gc roots相连的引用链,会被标记
第二次,在虚拟机中的Finalizer队列,判断是否需要用Finalizer()
(第二次分类:
1,没有覆盖Finalizer,直接回收
2,覆盖Finalizer(),
2.1,执行过Finalizer(),回到第一次,若还是没有引用链就回收
2,2 ,未执行过Finalizer(),放入队列中,进行执行
注意:Finalizer()代价高