1.各种引用名词介绍。
从总的来说不同的引用类型主要体现的是对象不同的可达性状态和对垃圾收集的影响。
强引用:最常见的普通对象引用,只要还有强引用指向一个对象,就能表明对象还活着,垃圾收集器就不会碰这种对象。普通对象超过了引用作用域或者显式地将引用赋值为null,就可以被垃圾收集了,具体回收时机还是要看垃圾收集策略。
软引用:(SoftReference)是一种弱化一些的引用,只有当JVM认为内存不足时才会试图回收软引用指向的对象,确保在抛出OutOfMemonyError(OutOfMemonyError就是传说中的OOM)之前清理软引用指向的对象。通常来实现内存敏感的缓存。实现软引用的代码如下:
Object obj = new Object();
//SoftReference是java自身提供好的类,有兴趣可以自己查看
SoftReference<Object> sf = new SoftReference<Object>(obj);
//获取对象
sf.get()
弱引用:(WeakReference),并不能使对象豁免垃圾收集,仅仅是提供一种访问在弱引用状态下对象的途径。可以用来构建一种没有特定约束的关系,比如维护一种非强制性的映射关系。如果对象获取时对象还在就使用它,否则重新实例化。
幻象引用:(又称虚引用)。不能通过他访问对象,仅仅是提供了一种确保对象被finalize以后做某些事情的机制。
2.对象可达状态
强可达:当一个对象可以有一个或多个线程可以不通过各种引用访问到的情况。
软可达:只能通过软引用才能访问到对象的状态。
弱可达:只能通过弱引用才能访问的状态
幻象可达:finalize过,只有幻象引用指向这个对象,已经无法访问到对象。
不可达:此状态下对象就可以被清除了。
判断对象可达性是JVM垃圾收集器决定如何处理对象的一部分考虑,所有引用类型都是Reference的子类,除了幻象引用都可以通过get方法获取原有对象(即软引用和弱引用都可以转变为强引用)
3.显示地影响软引用垃圾收集。
可以设置软引用在最后一次呗调用后保持的时间。
4.通过底层API来达到强引用的效果。
Reference.reachabiliyFence(this)。
5.引用和引用队列联合使用。
联合使用时,如果引用对象被垃圾回收器回收,java虚拟机会把这个引用加入到与之关联的引用队列之中,后续可以调用ReferenceQueue的poll()方法来检查她所关心的对象回收。如果队列为空,将返回一个null,否则该方法返回队列前面的一个Reference对象(幻象引用应该是不可以)。
参考:杨晓峰《java核心技术36讲》