【JAVA基础】对象的四种引用

对象的四种引用

强引用

先看图:
在这里插入图片描述
开发过程中我们一般用的都是强引用,强引用指向的堆内存不会被垃圾回收器回收!

软引用

先看图:
在这里插入图片描述

从图上可以看出,当我们内存不够的时候,软引用指向的堆内存会被回收!

弱引用

先看图:
在这里插入图片描述
从图可以看出,只要垃圾回收,弱引用指向的堆内存就会被回收!

Threadlocal的弱引用

先看图:
在这里插入图片描述
看set方法,如下图:
在这里插入图片描述

从图可以看出为什么threadlocal是线程独有,因为把值设置到了本地线程对象的map里.
接下来看下这个map的构造方法,看图:
在这里插入图片描述
重点是这个entry对象,如下图:
在这里插入图片描述

这里key使用了弱引用,为什么要这样处理?前面说了这个map是本地线程持有的,生命周期跟线程一样,假设threadlocal对象使用完之后,线程没结束,如果key使用强引用,那这个threadlocal还是不能被回收,会造成内存泄漏(内存浪费)! 看图:
在这里插入图片描述
那这里还存在个问题:value也是强引用,key失效其实value也应该要被回收,怎么办?
所以这里我们要调threadLocal.remove()方法,手动删除value,防止value导致的内存泄漏!

虚引用

先看图:
在这里插入图片描述
如图,虚引用必须结合引用队列使用,虚引用指向的对象将被回收时,会把对象引用存入相关联的队列中!记住这时候对象没有被回收!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值