Java四种引用类型及常见应用场景

本文详细介绍了Java中的四种引用类型:强引用、软引用、弱引用和虚引用。强引用是默认的引用方式,不会被垃圾回收;软引用常用于缓存,如MyBatis的SoftCache,内存不足时会被回收;弱引用在下次垃圾回收时会被清理,例如MyBatis的WeakCache和ThreadLocalMap;虚引用不直接影响对象的生命周期,但可以接收对象被回收的通知,如Cleaner类在对象回收时执行特定操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java具有四种不同强度的引用类型:

强引用:

被强引用关联的对象不会被回收,一般通过new来构造对象时,就会返回一个强引用。

Object obj = new Object()

软引用:

通过SoftReference来构造,会在内存不足时回收,一般可用于缓存等场景,比如MyBatis中缓存的装饰器就有SoftCache类型。在Class.java中用于保存反射数据

弱引用:

通过WeakReference来构造,会在下次GC时回收,也可用于缓存场景,MyBatis缓存装饰器WeakCache

线程类中,ThreadLocalMap中的Entrykey就使用弱引用,在这里key是ThreadLocal类型。会在发生GC时回收,所以这里还会涉及key被回收导致的内存泄漏问题,使用ThreadLocal后记得调用remove释放value。

虚引用(幽灵引用):

通过PhantomReference来构造,不对对象的生存时间产生影响,也无法通过虚引用来获得对象。为一个对象设置虚引用关联的唯一目的就是能在这个对象被回收时收到一个系统通知。

sun.misc中的Cleaner类就继承自虚引用。该类用于直接操作内存相关的类,即DirectXXXBuffer系列,在构造DirectXXXBuffer时,会构造一个虚引用的Cleaner指向自己,并传入一个Runnable对象,当对象被回收时,会触发Cleaner的clean方法,并进一步执行Runnable对象的run方法,通过unsafe回收直接内存。

Reference类有个静态代码块,会创建一个最高优先级的引用处理线程,会一直循环调用tryHandlePending方法, 处理挂起的引用,如果发现存在Cleaner对象,就执行Clean.clean,并执行引用入队操作。J

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值