对象是否存在的判定方法
- 混淆点 : 引用计数的算法难以解决对象之间的相互循环引用.所以, JAVA 和 C# 都是用根据搜索算法来判断对象是否存活的.
- 算法思路 : 通过一系列的名为 "GCRoot" 的对象作为起始点,从这些节点开始向下搜索,搜索所有走过的路径称为引用链,当一个对象到 CCRoot 没有任何引用链相连时,说明该对象不可用.
- 可以作为 GCRoot 对象有:
- 虚拟栈(栈桢中本地变量表)中引用的对象
- 方法区中的类静态属性引用的对象
- 方法区中常量引用的对象
- 本地方法中 JVI(native 方法)的引用对象
- 应用的分类:
- 强引用
- 软引用 : softReference, 软引用被回收在内存溢出之前
- 弱引用 : weakReference, 弱引用被回收在下一次 GC 回收之前
- 虚引用 : phantomReference
"虚引用"顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收。
虚引用主要用来跟踪对象被垃圾回收的活动。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列(ReferenceQueue)联合使用。当垃 圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。程序可以通过判断引用队列中是 否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。程序如果发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。特别注意,在程序设计中一般很少使用弱引用与虚引用,使用软引用的情况较多,这是因为软引用可以加速JVM对垃圾内存的回收速度,可以维护系统的运行安全,防止内存溢出(OutOfMemory)等问题的产生。
以下是软引用的代码:
import java.lang.ref.SoftReference; public class Test { public static void main(String[] args){ System.out.println("开始"); A a = new A(); SoftReference<A> sr = new SoftReference<A>(a); a = null; if(sr!=null){ a = sr.get(); } else{ a = new A(); sr = new SoftReference<A>(a); } System.out.println("结束"); } } class A{ int[] a ; public A(){ a = new int[100000000]; } }
行到水穷处,坐看云起时。
中岁颇好道,晚家南山陲。
兴来每独往,胜事空自知。
偶然值林叟,谈笑无还期。