Java 四大引用

Java 中的四大引用类型是指 JVM 提供的四种不同生命周期的引用类型,分别是:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)。这些引用类型主要用于帮助我们更好地控制对象的生命周期,尤其是在内存管理和垃圾回收方面。


强引用(Strong Reference):

强引用是 Java 中最常见的引用类型。当一个对象有强引用时,垃圾回收器绝不会回收这个对象。即使是在内存不足时导致 OutOfMemoryError 异常发生,持有强引用的对象也不会被垃圾回收器回收。在代码中直接使用 new 关键字创建的对象就是强引用。

    Object obj = new Object();

软引用(Soft Reference):

软引用是一种内存敏感的引用,如果没有强引用指向一个对象,那么该对象可能在内存紧张时被垃圾收集器回收。软引用通常用于实现内存感知的缓存。如果不再有足够的内存,GC 将会清理软引用所指向的对象。使用 java.lang.ref.SoftReference 类来创建软引用。

    public static void main(String[] args) {
        Byte[] b1 = new Byte[1024 * 1024 * 1000];
        SoftReference softRef = new SoftReference<>(b1);
        System.gc();
        System.out.println(softRef.get()); // [Ljava.lang.Byte;@3dd3bcd

        b1 = null;
        Byte[] b2 = new Byte[1024 * 1024 * 1000];
        System.gc();
        System.out.println(softRef.get()); // null
    }

弱引用(Weak Reference):

弱引用比软引用更弱。垃圾收集器在每次运行时都会回收只被弱引用指向的对象,不管当前内存是否足够。弱引用是有用的在实现缓存等地方,它也帮助避免内存泄漏的问题。使用  java.lang.ref.WeakReference 类来创建弱引用。

    public static void main(String[] args) {
        String str = new String("引用");
        WeakReference weakRef = new WeakReference<>(str);
        System.gc();
        System.out.println(weakRef.get()); // 引用

        str = null;
        System.gc();
        System.out.println(weakRef.get()); // null
    }

虚引用(Phantom Reference):

虚引用是所有引用类型中最弱的一个。一个持有虚引用的对象与没有任何引用效果相当。虚引用(java.lang.ref.PhantomReference)必须和引用队列(java.lang.ref.ReferenceQueue)一起使用。

    public static void main(String[] args) {
        String str = new String("引用");
        ReferenceQueue refQueue = new ReferenceQueue<>();
        PhantomReference phantomRef = new PhantomReference<>(str, refQueue);
        System.gc();
        System.out.println(phantomRef.get());  // null
        System.out.println(refQueue.poll());   // null

        str = null;
        System.gc();
        System.out.println(phantomRef.get());  // null
        System.out.println(refQueue.poll());   // java.lang.ref.PhantomReference@3dd3bcd
    }

需要注意的是,调用虚引用的 get() 方法始终都会返回 null,所以虚引用主要用于跟踪对象什么时候被垃圾回收器回收,并不是为了使用对象本身。


强引用是最普通的引用形式,而软引用、弱引用和虚引用则可以用来解决特定问题,如内存敏感的缓存策略、统计对象的生命周期。在设计缓存策略或者处理大量对象的应用时,合理使用这些引用类型可以有效地优化内存使用和性能。

你可能感兴趣的:(Java基础,java,开发语言)