Java的四种引用:强引用、软应用、弱引用、虚引用

前戏

在JDK远古时期的版本中,java对象的似乎就只有两种状态,即被引用和不被引用。也就是说程序中,如果一个对象不被任何其他对象或变量引用,那么JVM就判定这个对象无法被使用,JVM直接对对象内存进行回收。

但是,这两种极端状态并不能覆盖所有的对象,随着程序的运行,程序对某个对象的引用强度可能在不断地变化,比如一个对象可能会出现以下情况,一个对象表面表面上看起来处于不被引用的状态,它占据一定的内存空间,但是JVM马上对它进行回收又不太划算,或许在后面的场景下还可以用得上。

对于这样的可有可无的对象,JDK1.2版本实施了一种折衷的处理:如果内存足够,可以选择保留表面上处于不被引用状态的对象,但是如果内存空间不够,我就把这些可有可无的对象的内存回收(软引用),但是如果通过一些对象实在是对我没用,就在每次GC的时候直接把它回收掉(弱引用)。另外,JDK还设定,在回收的时候程序需要知道某个对象是否真正地回收掉(GC时的一个回调),一旦这个对象被回收,相应的用户线程会收到通知并对直接内存进行清理工作。

从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期。这四种级别由高到低依次为:强引用、软引用、弱引用和虚引用

说了半天,这四种引用到底是啥

强引用:最传统的「引用」的定义,是指在程序代码之中普遍存在的引用赋值,我们创建的对象一般都是这种引用关系。只要强引用关系还存在,垃圾收集器就永远不会回收掉被引用的对象。

软引用:描述一些还有用,但非必须的对象。只被软引用关联着的对象,在系统内存不足时,即将要发生内存溢出异常前,会把这些对象列进回收范围之中进行回收,如果回收之后内存还是不够,那么没办法,程序产生OOM异常。

弱引用:描述那些非必须对象,但是它的强度比软引用更弱一些,被弱引用关联的对象只能生存到下一次垃圾收集发生为止。也就是每当垃圾收集器开始工作,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。

虚引用:是最弱的一种引用关系。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。为一个对象设置虚引用关联的唯一目的只是为了能在这个对象被收集器回收时收到一个系统通知。


为啥要设定这么个蛋疼的东西

其实在前言中已经说过这么设定的原因,如果引用类型的数据中存储的数值代表的是另外一块内存的起始地址,就称这块内存代表着一个引用。 这种定义很纯粹,但是太过狭隘,一个对象在这种定义下只有被引用或者没有被引用两种状态,对于如何描述一些“食之无味,弃之可惜”的鸡肋对象就显得无能为力。 我们迫切希望能描述这样一类对象:当内存空间还足够时,则能保留在内存之中;如果内存空间在进行垃圾收集后还是非常紧张,则可以抛弃这些对象。 

大白话就是,一个对象的生命周期被有多种阶段(创建、应用、不可见、不可达、收集、终结、空间重分配),传统的被引用不被引用的两种描述这些状态显得太头疼了,老子不干了。

这玩意儿有啥用

1、WeakHashMap 实现类,如果 WeakHashMap 中的 Key 对象如果不需要了,WeakHashMap 内部可以配合 ReferenceQueue 引用队列进行移除

2、ThreadLocalMap类 该类时ThreadLocal的静态内部类,该Map使用开放地址法处理hash冲突的Map类,key为ThreadLocal对象,value为TheadLocal对象所对应的值value;其中Entry对象当中的Key值对TheadLocal的引用就是WeakReference,这样当ThreadLocal对象除了Entry对象外没有其他引用的时候,在下一次垃圾回收发生时,该对象将被回收。

3、缓存的实现,因为缓存一般情况会长时间存活,如果缓存的元素已经失效了,使用软弱引用配合 ReferenceQueue 引用队列可以执行清除操作

4、使用虚引用,完成垃圾回收时的消息回调等操作
 

后话

光说不练假把式,四种引用结合代码分析,后续再出

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值