1. java没有使用引用计数器的算法
有可能代码里面会出现两个对象之间相互循环引用,比如:
OjbA.getInstance()= ObjA;
ObjA.getInstance = objB;
2. java中采用的是可达性分析算法
java会从 'GC Roots'的对象开始作为起点,从这些节点开始搜索,搜索的路径称为引用链,当一个对象到'GC Roots'的时候没有引用链相连,就说明这个对象是不可用的.
可以称为'GC Roots'的对象有以下几种
1. 虚拟机栈中引用的对象
2. 方法区中静态类属性引用的对象
3. 方法区中常量引用的对象
4. 本地方法栈中引用的对象
3. java的引用
java的引用分为:强引用,软引用,弱引用,虚引用
**强应用**: new object()这类应用,只要强引用还在,垃圾收集器就不会回收
**软引用**: 是用来描述一些有用但非必须的对象,在内存溢出之前会把软引用的对象进行二次回收,如果这次回收还没有足够的内存,就会抛出内存溢出的异常
**弱引用**: 当垃圾收集器工作时,弱引用的对象就会被回收
**虚引用**: 虚引用的唯一目的就是在垃圾回收时受到一条通知