强引用 - FinalReference
介绍:
强引用是平常中使用最多的引用, 强引用在程序内存不足 (OOM) 的时候也不会被回收, 使用方式:
String str = new String("str");
这个 str 就是强引用.
可用场景:
地球人都知道, 但是我讲不出来.
软引用 - SoftReference
介绍:
软引用在程序内存不足时, 会被回收, 使用方式:
- // 注意: wrf 这个引用也是强引用, 它是指向 SoftReference 这个对象的,
- // 这里的软引用指的是指向 new String("str")的引用, 也就是 SoftReference 类中 T
- SoftReference<String> wrf = new SoftReference<String>(new String("str"));
可用场景:
创建缓存的时候, 创建的对象放进缓存中, 当内存不足时, JVM 就会回收早先创建的对象. PS: 图片编辑器, 视频编辑器之类的软件可以使用这种思路.
软引用使用例子传送门: https://www.cnblogs.com/mjorcen/p/3968018.html
弱引用 - WeakReference
介绍:
弱引用就是只要 JVM 垃圾回收器发现了它, 就会将之回收, 使用方式:
WeakReference<String> wrf = new WeakReference<String>(str);
可用场景:
Java 源码中的 java.util.WeakHashMap 中的 key 就是使用弱引用, 我的理解就是, 一旦我不需要某个引用, JVM 会自动帮我处理它, 这样我就不需要做其它操作.
弱引用使用例子传送门: http://www.importnew.com/21206.html
虚引用 - PhantomReference
介绍:
虚引用的回收机制跟弱引用差不多, 但是它被回收之前, 会被放入 ReferenceQueue 中. 注意哦, 其它引用是被 JVM 回收后才被传入 ReferenceQueue 中的. 由于这个机制, 所以虚引用大多被用于引用销毁前的处理工作. 还有就是, 虚引用创建的时候, 必须带有 ReferenceQueue, 使用例子:
PhantomReference<String> prf = new PhantomReference<String>(new String("str"), new ReferenceQueue<>());
可用场景:
对象销毁前的一些操作, 比如说资源释放等. Object.finalize()虽然也可以做这类动作, 但是这个方式即不安全又低效(传送门:),so.
强调
上诉所说的几类引用, 都是指对象本身的引用, 而不是指 Reference<T > 的四个子类的引用(SoftReference<T > 等).
来源: http://www.bubuko.com/infodetail-2995587.html