Android-四种引用模式

一、概述

引用类型 说明 使用场景
强引用(Strong Reference) 只要强引用存在,垃圾回收器就不会回收被引用的对象。 业务逻辑中的关键对象、长期存在的对象
软引用(Soft Reference) 在系统内存充足的时候,软引用对象不会被回收;当系统内存不足时,软引用对象可能会被垃圾回收器回收,以释放内存空间。 缓存、大数据量的临时对象
弱引用(Weak Reference) 弱引用对象的生命周期更短,只要垃圾回收器发现弱引用对象,不管系统内存是否充足,都会回收该对象。 容器中的临时对象、避免循环引用导致的内存泄漏
虚引用(Phantom Reference) 虚引用不会决定对象的生命周期,它的存在主要是为了在对象被回收时收到一个通知。 资源清理、监测对象回收

二、示例

强引用:

public class StrongReferenceExample {
    public static void main(String[] args) {
        // 创建一个对象并使用强引用
        String str = new String("Strong Reference");
        System.out.println(str);
    }
}

软引用:

import java.lang.ref.SoftReference;

public class SoftReferenceExample {
    public static void main(String[] args) {
        // 创建一个大对象模拟占用大量内存
        byte[] bigData = new byte[1024 * 1024 * 10]; 

        // 使用软引用包裹大对象
        SoftReference<byte[]> softRef = new SoftReference<>(bigData);

        // 尝试强制进行垃圾回收,看软引用对象是否被回收
        System.gc();

        if (softRef.get()!= null) {
            System.out.println("Soft reference object is still available.");
        } else {
            System.out.println("Soft reference object has been collected.");
        }
    }
}

弱引用:

import java.lang.ref.WeakReference;

public class WeakReferenceExample {
    public static void main(String[] args) {
        // 创建一个对象
        String str = new String("Weak Reference");

        // 使用弱引用包裹对象
        WeakReference<String> weakRef = new WeakReference<>(str);

        // 尝试强制进行垃圾回收
        System.gc();

        if (weakRef.get()!= null) {
            System.out.println("Weak reference object is still available.");
        } else {
            System.out.println("Weak reference object has been collected.");
        }
    }
}

 虚引用:

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;

public class PhantomReferenceExample {
    public static void main(String[] args) {
        // 创建一个对象
        String str = new String("Phantom Reference");

        // 创建引用队列
        ReferenceQueue<String> queue = new ReferenceQueue<>();

        // 使用虚引用包裹对象并关联引用队列
        PhantomReference<String> phantomRef = new PhantomReference<>(str, queue);

        // 尝试强制进行垃圾回收
        System.gc();

        // 检查引用队列中是否有虚引用对象被回收
        try {
            if (queue.poll()!= null) {
                System.out.println("Phantom reference object has been collected.");
            } else {
                System.out.println("Phantom reference object is still in memory.");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

三、项目实践

实践应用一:

如在图片加载库中,将已经加载过的图片用软引用来存储,当系统内存充足时可快速访问,内存不足时自动回收以避免系统崩溃。

实践应用二:

处理大型文件时,将文件部分内容读取到内存中进行处理,处理完后可回收以释放内存。

实践应用三:

在一些容器类中存储临时对象,当对象不再被外部强引用持有时能自动被回收。例如在事件监听器管理容器中,当组件不再被使用时,其对应的事件监听器对象若只被容器弱引用,可及时被回收避免内存泄漏。

实践应用四:

在图形绘制系统等场景中,若两个对象之间存在循环引用,且其中一个对象只在特定情况下被访问,可使用弱引用打破循环引用确保对象能被回收。

猜你喜欢

转载自blog.csdn.net/LIUCHANGSHUO/article/details/143522641