JAVA软引用介绍

软引用

软引用是一种相对强引用弱化了一些的引用,要求用java.lang.ref.SoftRerence类来实现,可以让对象豁免一些垃圾收集。
对于只有软引用的对象来说:
【当系统内存充足时它 不会 被收回】,
【当系统内存不足时它 会 被收回】。
软引用通常用在对内存敏感的程序中,比如高速缓存就有用到软引用,内存够用的时候就保留,不够用就回收。

代码演示

内存够用

import java.lang.ref.SoftReference;
public class SoftReferenceDemo {
    //内存够用的时候就保留,不够用就回收.
    public static void softRefMemoryEnough(){
        Object o1 = new Object();
        SoftReference<Object> softReference = new SoftReference<>(o1);
        System.out.println(o1);
        System.out.println(softReference.get());

        o1 = null;
        System.gc();//手动启动GC

        System.out.println(o1);
        System.out.println(softReference.get());
    }

    /**
     * JVM配置,故意产生对象并配置小的内存,让它内存不够用了导致OOM,看软引用的回收情况
     * -Xms5m -Xmx5m -XX:+PrintGCDetails
     */
    public static void softRefMemoryNotEnough(){
        Object o1 = new Object();
        SoftReference<Object> softReference = new SoftReference<>(o1);
        System.out.println(o1);
        System.out.println(softReference.get());

        o1 = null;
        try {
            //占用内存new个大对象
            byte[] bytes = new byte[30 * 1024 * 1024];
        }catch (Throwable e){
            e.printStackTrace();
        }finally {
            System.out.println(o1);
            System.out.println(softReference.get());
        }

    }

    public static void main(String[] args) {
        softRefMemoryEnough();
//        softRefMemoryNotEnough();
    }
}

运行结果
在这里插入图片描述

内存不够用演示

第一步 放开注释代码调用softRefMemoryNotEnough();方法

    public static void main(String[] args) {
//        softRefMemoryEnough();
        softRefMemoryNotEnough();
    }

第二步 设置JVM配置如图
在run -> Edit Configurations
在这里插入图片描述
运行结果如下:
在这里插入图片描述

发布了28 篇原创文章 · 获赞 1 · 访问量 1452

猜你喜欢

转载自blog.csdn.net/baidu_37313657/article/details/104011197