当前位置 : 主页 > 编程语言 > java >

【Java -- 基础】常见四种引用及应用场景(强、弱、软、虚)

来源:互联网 收集:自由互联 发布时间:2022-06-22
前言 在Java中,对象的引用类型十分重要,因为这取决于 JVM 的 GC 活动 活动。 从 JDK 1.2 后开始,Java的引用类型分为4种:强引用、软引用、弱引用、虚引用 1. 强引用(StrongReference) 特

前言

在Java中,对象的引用类型十分重要,因为这取决于 JVM 的 GC 活动 & 活动。

从 JDK 1.2 后开始,Java的引用类型分为4种:强引用、软引用、弱引用、虚引用

1. 强引用(StrongReference)

  • 特点
    垃圾回收器不会回收

  • 当内存空间不足,JVM宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题
  • 使用最普遍

    • 使用场景
      该变量不希望被垃圾回收器回收
    • 使用示例(为1个变量创建强引用)
    String s="abc"

    // 变量s = 字符串对象"abc"的一个强引用
    // 注:只要给强引用对象赋空值null,该对象就可被垃圾回收器回收
    // 即:只要给强引用对象s赋空值null,该对象就可以被垃圾回收器回收。因为该对象此时不再含有其他强引用

    2. 软引用(SoftReference)

    • 特点
      当内存不足时,垃圾回收器会回收
    • 应用场景
      内存敏感的数据缓存机制,如图片、网页缓存等
    • 使用示例(为1个变量创建软引用)
    // 1. 声明强引用
    String str=new String("Test");

    // 2. 对str进行软引用
    ReferenceQueue<String> rq=new ReferenceQueue<String>();
    SoftReference<String> sr=new SoftReference<String>(str,rq);

    // 3. 撤掉强引用
    str=null;

    // 4. 取出软引用的对象:s即为str所指引的对象"Test"
    String s=sr.get();

    // 注:
    // a. 软引用可与1个引用队列联合使用
    // b. 若软引用所引用的对象被垃圾回收器回收,JVM就会把这个软引用加入到与之关联的引用队列中

    3. 弱引用(WeakReference)

    • 特点
      一旦发现弱引用对象,无论内存足否,都会进行回收

    即 拥有更短暂的生命周期

    • 应用场景
      1.防止内存泄漏,保证内存被JVM回收
      2.保护对象引用
    • 使用示例(为1个变量创建弱引用)
    // 1. 声明强引用
    Counter counter = new Counter();
    // 2. 声明弱引用
    WeakReference<Counter> weakCounter = new WeakReference<Counter>(counter);
    // 3. 撤掉强引用
    counter = null;

    // 注:
    // a. 使用 类似软引用,即也可与1个引用队列联合使用
    // b. 与软引用的区别:具备更短的生命周期

    4. 虚引用(PhantomReference)

    • 特点
      任何时候都可能被垃圾回收器回收
    • 应用场景
      跟踪对象被GC回收的活动

    通过判断引用队列中是否有虚引用来了解被引用对象是否被回收

    • 使用示例(为1个变量创建虚引用)
    // 虚引用 必须 和引用队列 (ReferenceQueue)联合使用
    // 即 当垃圾回收器准备回收一个对象时,若发现它还有虚引用,在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中

    // 1. 声明强引用
    DigitalCounter digit = new DigitalCounter();

    // 2. 声明虚引用
    PhantomReference phantom = new PhantomReference(digit);

    // 3. 撤掉强引用
    digit = null;


    上一篇:【Java -- 基础】JNI 与 NDK (含实例教学)
    下一篇:没有了
    网友评论