何为引用(Reference
)
java.lang.ref.Reference
Abstract base class for reference objects. This class defines the operations common to all reference objects. Because reference objects are implemented in close cooperation with the garbage collector, this class may not be subclassed directly.
引用对象的抽象基类。这个类定义了所有引用对象通用的操作。因为引用对象是在与垃圾收集器密切合作的情况下实现的,所以这个类可能不会直接子类化。
JDK 1.2 之前对引用(reference
)的定义:
如果
reference
类型的数据中存储的数值代表的是另外一块内存的起始地址,就称该reference
数据是代表某块内存、某个对象的引用。
由于这种对reference
的定义只有“被引用”和“未被引用”。当内存空间充裕时,能保留在内存中,如果内存空间进行垃圾收集后,仍然比较紧张,这个时候,哪些“被引用”的对象能够被收集,成为了这种定义的痛点。
JDK 1.2 之后,Java对引用(reference
)的定义:
引用分为强引用(
Strongly Reference
)、软引用(Soft Reference
)、弱引用(Weak Reference
)和虚引用(Phantom Reference
)四种。
四种引用类型介绍
-
强引用(
Strongly Reference
)强引用是最传统的“引用”定义,是指在程序代码之中普遍存在的引用赋值,即
Object obj = new Object()
这种引用关系。无论任何情况下,只要强引用关系还存在,垃圾收集器就永远不会回收掉被强引用的对象。因此,强引用是造成Java内存泄漏的主要原因之一。 -
软引用(
Soft Reference
)软引用需要用
SoftReference
类来实现,它是用来描述一些还有用,但非必须的对象。只被软引用关联着的对象,在系统将要发生内存溢出异常前,会把这些对象列进回收范围之中进行第二次回收,如果这次回收还没有足够的内存,才会抛出内存溢出异常。软引用通常用在对内存敏感的程序中。 -
弱引用(
Weak Reference
)弱引用需要用
WeakReference
类来实现,它是用来描述那些非必须的对象,但是它的强度比软引用更弱一些,被弱引用关联的对象只能生存到下一次垃圾收集为止。当垃圾收集器开始工作时,无论当前内存是否足够,都会回收掉被只被弱引用的对象。 -
虚引用(
Phantom Reference
)虚引用需要用
PhantomReference
类来实现,它也被称为“幽灵引用”或“幻影引用”,它是最弱的引用关系。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来获取一个对象实例。为一个对象设置虚引用的唯一目的只是为了能在这个对象被收集器回收时收到一个系统通知。