强引用、软引用、弱引用和幻象引用的区别

本文深入探讨Java中的四种引用类型:强引用、软引用、弱引用和虚引用的特性和应用场景,以及它们如何影响内存管理和垃圾回收过程。

参考文章:https://www.cnblogs.com/wjh123/p/11142176.html
https://www.bilibili.com/video/BV117411g7ib?from=search&seid=660483692485420103
强引用:通过关键字new创建的对象所关联的引用就是强引用,如Object obj=new Object();
JVM内存空间不足,JVM宁愿抛出OutOfMemoryError运行时错误(OOM),使程序异常终止,也不会靠随意回收具有强引用的“存活”对象来解决内存不足的问题。对于一个普通的对象,如果没有其他的引用关系,只要超过了引用的作用域或者显式地将相应强引用赋值为 null,就是可以被垃圾收集的了,但不会被立即回收,具体回收时机还是要看垃圾收集策略。
内存不足时垃圾回收器不能随意回收强引用的对象
软引用:软引用通过SoftReference类实现,只有当 JVM 认为内存不足时,才会去试图回收软引用指向的对象,即JVM 会确保在抛出OutOfMemoryError之前,清理软引用指向的对象。
应用场景:软引用通常用来实现内存敏感的缓存。如果还有空闲内存,就可以暂时保留缓存,当内存不足时清理掉,这样就保证了使用缓存的同时,不会耗尽内存。
在这里插入图片描述

//运行前先指定虚拟机内存20M,软应用对象占用10M,当有一个20M的对象时,查看软应用会被gc自动回收
  @Test
    public void test3() throws InterruptedException {
        SoftReference<byte[]> softReference = new SoftReference<byte[]>(new byte[1024*1024*10]);  
        System.out.println(softReference.get());//[B@159424e2
        system.gc(); //gc不会主动去回收弱引用
        Thread.sleep(1000);
        System.out.println(softReference.get());//[B@159424e2
        byte[] bytes = new byte[1024 * 1024 * 20];
        System.out.println(softReference.get()); //null
    }

弱引用:弱引用通过WeakReference类实现,WeakReference对象指向的对象,就是弱引用。
弱引用的特点:遇到gc就会被回收
虚引用:虚引用也叫幻象引用,通过PhantomReference类来实现。
如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。当一个虚引用关联的对象被垃圾收集器回收之前会收到一条系统通知。
应用场景:当JVM中内存的某个对象引用了堆外内存中的某个对象时,当JVM内存中的对象不存在时,就会发一条消息通知JVM可以清理堆外内存了,gc线程就会去清理堆外内存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值