JavaRush /Java 博客 /Random-ZH /Java中弱引用、软引用、幻像引用和常规引用的区别
theGrass
第 24 级
Саратов

Java中弱引用、软引用、幻像引用和常规引用的区别

已在 Random-ZH 群组中发布
“弱”引用和“软”引用(WeakReference、SoftReference)很早以前就被添加到了Java API 中,但并不是每个程序员都熟悉它们。这表明在理解何处以及如何使用它们方面存在差距。引用类在垃圾收集的上下文中尤其重要。众所周知,垃圾收集器本身会释放对象占用的内存,但并不是所有程序员都知道它是根据对象可用的引用类型来决定释放内存的。 SoftReferenceWeakReferenceJava中弱链接、软链接、幻像链接和常规链接的区别 - 1之间的主要区别在于收集器如何使用它们。只要弱链接指向某个对象,它就可以随时删除该对象,而软链接的对象只有在JVM确实需要内存时才会被收集。由于参考类的这些特征,每个参考类都有其自己的用途。SoftReference可用于实现缓存,当JVM需要内存时,它将通过删除此类对象来释放内存。WeakReferences非常适合存储元数据,例如,存储类加载器链接。如果没有要加载的类,那么存储对ClassLoader 的引用是没有意义的,只要我们分配它而不是强引用,弱引用就会使 ClassLoader 可以被删除。在本文中,我们将了解链接类型之间的差异,包括强引用幻像引用

Java 中的弱引用与软引用

对于那些不知道的人,有 4 种类型的链接:
  1. 参考性强
  2. 弱引用
  3. 软参考
  4. 虚拟参考
强链接是最简单的,因为我们每天在编程中都会用到它,例如,在像String s = “abc”这样的代码中,变量s就是强链接。垃圾收集器禁止删除任何具有强引用的对象。当然,这些都是Java程序需要的对象。弱引用由java.lang.ref.WeakReference类表示,您可以像这样定义弱引用:
Counter counter = new Counter(); // strong reference
WeakReference weakCounter = new WeakReference(counter); //weak reference
counter = null; // now Counter object is eligible for garbage collection
现在,一旦将强引用计数器设置为 null (counter = null),第一行中创建的对象就可用于垃圾回收,因为它不再具有强引用。Weak 创建的weakCounter 引用不能阻止收集器删除Counter 对象。另一方面,如果它是软引用,则直到JVM对内存的需求特别高时,Counter 对象才会被删除。Java中的软引用由java.lang.ref.SoftReference类表示。在Java中创建 SoftReference 的示例
Counter prime = new Counter();  // prime holds a strong reference
SoftReference soft = new SoftReference(prime) ; //soft reference variable has SoftReference to Counter Object
prime = null;  // now Counter object is eligible for garbage collection but only be collected when JVM absolutely needs memory
清除强引用(第3行)后,Counter对象将只剩下1个软引用,这将无法阻止垃圾收集器删除该对象,但与弱引用不同,它将能够推迟这个过程直到内存严重不足。鉴于软链接和弱链接之间的差异,第一个更适合缓存,而弱链接更适合元数据。一个很好的例子是 WeakHashMap 类,它是 Map 接口(如HashMapTreeMap类)的后代,但具有一个显着特征。WeakHashMap将键包装为弱引用,这意味着只要没有对对象的强引用,位于WeakHashMap内部的弱引用将无法将您从垃圾收集器中拯救出来。幻像链接是 java.lang.ref 包中可用的第三种链接。幻像引用由java.lang.ref.PhantomReference类表示。仅由虚拟链接指向的对象可以随时被收集器删除。虚拟链接的创建方式与弱链接或软链接相同。
DigitalCounter digit = new DigitalCounter(); // digit reference variable has strong reference
PhantomReference phantom = new PhantomReference(digit); // phantom reference
digit = null;
一旦清除了对 DigitalCounter 对象的强引用,垃圾收集器将随时删除它,因为现在只有幻像引用指向它。除了 WeakReference、SoftReference、PhantomReference、WeakHashMap 类之外,了解ReferenceQueue类也很有用。您可以在创建 WeakReference、SoftReference 或 PhantomReference 对象时使用此类:
ReferenceQueue refQueue = new ReferenceQueue(); //reference will be stored in this queue for cleanup
DigitalCounter digit = new DigitalCounter();
PhantomReference phantom = new PhantomReference(digit, refQueue);
对象引用将被添加到ReferenceQueue中,您可以通过轮询ReferenceQueue来监视引用的状态。下图很好地展示了 Object 的生命周期: 这就是JavaJava中弱引用、软引用、幻像引用和常规引用的区别 - 2中弱引用和软引用之间的所有区别。我们还熟悉了幻像链接、WeakHashMap类和ReferenceQueue。正确使用引用将有助于垃圾收集,并使Java中的内存管理更加灵活。 来源文章
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION