Java中的引用关系
在JDK1.2之前, Java中的引用的定义很传统, 一个对象只有被引用和没有被引用两种状态.
但是为了描述这样一类对象: 在内存足够时, 保留这些对象, 如果内存十分紧张, 则垃圾回收这些对象. 有很多应用场景符合这种描述,比如很多的系统缓存功能
在JDK1.2中, Java对引用的概念做出了扩充, 将引用分为了四种, 分别为强引用(Strong Reference), 软引用(Soft Reference), 弱引用( Weak reference), 虚引用(Phantom Reference ) , 这四种引用强度依次降低.
一. 强引用
强引用是Java中最常见的引用类型, 例如:
Object obj = new Object(); // 将一个对象赋值给一个变量,此时Object对象存在着强引用
这个Obj
变量指向这个Object类型的对象, 这就是强引用关系. 只要强引用还存在, 那么垃圾回收就永远不会去回收这个对象. 如果出现内存不足, 就会直接抛出OutOfMemoryError
.
如果要解除强引用, 只需要将变量指空:
obj = null; //obj变量不再引用Object对象,此时Object对象没有任何引用,等待被垃圾回收
这样这个Object对象就没有任何引用, JVM会在合适的时间将它回收
二. 软引用
软引用用来描述一些可能还有用,但并非是必须的对象. 如果内存足够, 软引用对象不会被回收, 当内存不足时, 它们才会被回收.
这种特性常常被用来实现缓存技术,比如网页缓存,图片缓存等。
在 JDK1.2 之后,用java.lang.ref.SoftReference
类来表示软引用。
三. 弱引用
弱引用也是用来描述一些可能还有用,但并非是必须的对象. 但是它的强度比软引用更低. 一旦JVM发起垃圾回收, 那么弱引用对象就会被回收.
在 JDK1.2 之后,用java.lang.ref.WeakReference
类来表示软引用。
四. 虚引用
虚引用是最弱的一种引用, 如果一个对象仅有虚引用, 那么它的生命周期就如同没有引用的变量一样, 它随时都有可能被垃圾回收.
给一个对象添加虚引用的唯一目的是让这个对象在被回收时发出一个系统通知, 也就是跟踪对象被回收的状态。
在 JDK1.2 之后,用java.lang.ref.PhantomReference
类来表示。