怎么判断一个对象是否应该被回收?

主要的方法分为两种:引用计数算法和可达性分析算法,目前常用的就是可达性分析算法;

程序计数算法

对一个对象添加一个引用的计数器,当该对象被引用依次那么计数器+1,如果引用被释放,那么计数器-1,这样根据对象最终引用次数为0时,将该对象回收;

缺点:当两个对象互相的引用,引用计数器就无法得到为0,那么也就无将对象就行回收;

可达性分析算法

首先找到一个GC root点,通过该点作为起始点,无法与起始点相连的对象都是不可达的,需要进行回收,反之就存活;

能够作为GC Root 的对象可以为:
1、方法区中常量引用的对象、
2、方法区中静态属性引用的对象;
3、虚拟栈帧中引用的对象;
4、本地方法栈引用的对象;