不同的参考类型
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);