强引用、软引用、弱引用和ThreadLocal详解

本文详细介绍了Java中的四种引用类型:强引用、软引用、弱引用以及ThreadLocal的工作原理和应用场景。强引用是最常见的引用类型,垃圾回收时不会回收强引用对象。软引用常用于缓存,内存不足时才会回收。弱引用的强度小于强引用和软引用,JVM在任何时候都会回收弱引用对象。ThreadLocal通过弱引用避免内存泄露,当ThreadLocal变量置为null时,弱引用的Entry在下一次GC时会被回收。
摘要由CSDN通过智能技术生成

强引用

在Java中,最多的就是强引用,垃圾回收时宁愿内存不足也不会回收掉强引用的对象,一般是通过 new 方式创建的强引用。

注意这里指的垃圾回收是指在方法即在栈帧运行期间时发生的垃圾回收,此时强引用不会被回收,如果是方法运行结束即栈帧结束,此时这个方法的不管什么对象都一定要被回收的!

强引用存在的问题:

当内存不足时,由于不会回收强引用的对象,此时如果对于程序来说对象不被使用,此时强引用对象就会占相当一大部分堆的空间。

解决方法:

将强引用对象置为 null ,脱离强引用即可,ArrayList的clear() 方法的原理就是将元素置为null来做清除工作。

软引用

软引用用来描述一些有用但不是非必须的对象,用 SoftReferebce 表示,对于软引用关联的对象,只有内存不足时JVM才会回收该对象,所以该引用适合作为缓存,当内存足够时,就可以利用缓存储存查询,当内存不足时,就可以将缓存删除回收掉,这是典型的以空间换时间的。

弱引用

相对于强引用和软引用来说,弱引用的强度就更小了,当JVM进行回收时,无论内存是否充足都会回收该引用的对象,弱引用用WeakReference表示。

例子

A a = new A();
B b = new B();

此时a和b都是强引用,JVM不会回收两个对象。

A a = new A();
B b = new B();
a = null;
b = null;

当我们把他们都置为null后,他们就和强引用脱离了关系,此时JVM会对a和b的堆中的空间进行垃圾回收。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值