Java中的引用

Java中的引用

Java 中的引用,是指除了基本数据类型以外的所有类型,这些类型在内存中,会在堆区存储实际的数据,在栈区存储一个别名(Alias),应用通过栈区的别名指向堆区的实际存储空间,来操作实际的数据,详细参考:JVM内存模型

1. 四种引用关系

1.1 强引用

直接 new 出来的对象就是强引用。只要强引用还存在,则不会被 GC,若内存不足,则 JVM 会直接抛出 OOM,可通过置为 null 来尝试回收。

1.2 软引用SoftReference

若内存足够,发生 GC 时不会被回收,若内存不足,发生 GC 时会被回收。若回收软引用对象后仍然内存不足,则抛出 OOM。使用方法:

1
SoftReference<Type T> sr = new SoftReference<>(Object obj);

1.3 弱引用WeakReference

不论内存是否足够,只要 GC,都会回收。

1.4 虚引用PhantomReference

一个对象持有虚引用几乎相当于未持有任何引用,随时都可能会被回收。虚引用必须配合引用队列一起使用。


2. 引用队列ReferenceQueue

可配合软引用、弱引用、虚引用使用。当 GC 准备回收一个对象时,若发现该对象存在引用,则会先将其加入到与之关联的引用队列中,可以通过判断引用队列中是否存在引用来判断被引用的对象是否将要被回收。