(一) 引用计数法
每有一个引用就加1,每失效一个就减1,为0表示可回收;但是此方法无法解决相互引用的情况
(二) 根搜索算法
从一系列的GCRoots对象为起点向下搜索,搜索的路径称为引用链,当一个对象没有任何引用链和GCRoots相连(也可以说成GCRoots到该对象不可达),则说明该对象可回收
1. 根搜索第一阶段
1) 与GCRoots之间没有引用链将会被第一次标记
2) 判断此对象是否有必要执行finalize方法,以下是没有必要执行情况:
l 对象没有覆盖finalize方法
l Finalize方法已经被虚拟机调用过
2. 两个条件都满足(必要执行finalize方法)后会被放入名为F-Quene的队列中
l 由虚拟机自动建立的,低优先级的finalizer线程机会触发,不等待执行结束,否则可能因为执行缓慢或死循环影响内存回收
l 除非再次被引用链连上,否则只能等待死亡
(三) 引用
jdk1.2后分为:强引用,软引用,弱引用,虚引用;强度逐渐减弱;垃圾回收器工作时无论内存是否足够,都会回收只被弱引用关联的对象
1. 强引用
l 必需对象,不会被回收
l 类似新创建的对象:Object obj=new Object()
2. 软引用
l 非必需对象
l 软引用关联着的对象在要发生内存溢出之前会列为第二次回收对象,若内存仍然不足才会抛出内存溢出异常
3. 弱引用
l 非必需对象
l 弱引用关联着的对象只能生存到下次垃圾收集前
4. 虚引用
l 也被称为幽灵引用或幻影引用
l 设置虚引用的唯一目的就是希望关联对象被回收时收到一个系统通知
l 不对对象生存时间产生影响,也无法被引用