不同的参考类型

java.lang.ref 包提供了引用对象类,它支持与垃圾收集器的有限程度的交互。

Java 有四种主要的不同引用类型。他们是:

  • 强烈参考
  • 弱参考
  • 软参考
  • 幽灵参考

1.强烈的参考

这是创建对象的常用形式。

MyObject myObject = new MyObject();

变量 holder 持有对创建对象的强引用。只要此变量处于活动状态并保存此值,垃圾收集器就不会收集 MyObject 实例。

2.弱参考

如果你不想让对象保持更长时间,并且需要尽快清除/释放为对象分配的内存,则可以这样做。

WeakReference myObjectRef = new WeakReference(MyObject);

简单地说,弱引用是一个不足以强制对象保留在内存中的引用。弱引用允许你利用垃圾收集器为你确定可达性的能力,因此你不必自己执行此操作。

当你需要创建的对象时,只需使用 .get() 方法:

myObjectRef.get();

以下代码将举例说明:

WeakReference myObjectRef = new WeakReference(MyObject);
System.out.println(myObjectRef.get()); // This will print the object reference address
System.gc();
System.out.println(myObjectRef.get()); // This will print 'null' if the GC cleaned up the object

3.软参考

软引用比弱引用略强。你可以创建一个软引用对象,如下所示:

SoftReference myObjectRef = new SoftReference(MyObject);

它们可以比弱引用更强地保留在内存中。如果你有足够的内存供应/资源,垃圾收集器将不会像弱引用那样热心地清理软引用。

软引用在缓存中很方便。你可以将软引用对象创建为缓存,直到内存耗尽为止。当你的内存无法提供足够的资源时,垃圾收集器将删除软引用。

SoftReference myObjectRef = new SoftReference(MyObject);
System.out.println(myObjectRef.get()); // This will print the reference address of the Object
System.gc();
System.out.println(myObjectRef.get()); // This may or may not print the reference address of the Object

4.幽灵参考

这是最弱的引用类型。如果使用 Phantom Reference 创建了对象引用,则 get() 方法将始终返回 null!

这种引用的使用是“幻影引用对象,它们在收集器确定它们的对象可以被回收之后排队。幻像引用最常用于以比以下更灵活的方式安排预先清理操作。Java 终结机制。“ - 来自 Oracle 的 Phantom 参考 Javadoc

你可以创建 Phantom Reference 的对象,如下所示:

PhantomReference myObjectRef = new PhantomReference(MyObject);