面试题:Java 中的强引用、软引用、弱引用和虚引用分别是什么?

在Java中,引用类型主要包括强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)。每种引用类型都有其特定的用途和应用场景,下面分别介绍这四种引用类型:

  1. 强引用(Strong Reference)
    • 这是最常见的引用形式,即我们通常使用的对象引用方式。例如,String s = new String("Hello")中的s就是一个强引用。
    • 强引用的对象不会被垃圾收集器回收,即使内存不足时,JVM宁愿抛出OutOfMemoryError也不会回收这种类型的对象。
  2. 软引用(Soft Reference)
    • 软引用是用来描述一些还有用但并非必需的对象。对于软引用关联着的对象,在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围之中进行第二次回收。如果这次回收还没有足够的内存,才会抛出内存溢出异常。
    • 适用于实现内存敏感的缓存。可以通过java.lang.ref.SoftReference类来创建软引用。
  3. 弱引用(Weak Reference)
    • 弱引用也是用来描述非必需对象的,但是它的强度比软引用更弱一些。被弱引用关联的对象只能生存到下一次垃圾收集发生之前。当垃圾收集器工作时,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。
    • 可以通过java.lang.ref.WeakReference类来创建弱引用。它常用于实现规范化映射(canonicalized mappings),如WeakHashMap
  4. 虚引用(Phantom Reference)
    • 虚引用是最弱的一种引用关系。一个对象与虚引用关联,并不会对其生存时间造成任何影响,也无法通过虚引用来获取该对象的实例。为一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。
    • 要使用虚引用,必须配合引用队列(ReferenceQueue)一起使用。可以通过java.lang.ref.PhantomReference类来创建虚引用。主要用于做一些清理工作,确保某些资源在对象被回收前得到妥善处理。

每种引用类型的使用场景各不相同,正确选择合适的引用类型可以帮助程序更好地管理内存,提高性能和稳定性。

THE END
喜欢就支持一下吧
点赞15 分享