本文首发CSDN博客地址:https://blog.csdn.net/u013277209?viewmode=contents

前言

在JDK1.2以前的版本中,当一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及状态,程序才能使用它。而对于如何描述一些“食之无味,弃之可惜”的对象就显得无能为力。我们希望能描述这样一类对象:当内存空间还足够时,则能保留在内存之中,如果内存在进行垃圾收集后还是非常紧张,则可以抛弃这些对象。

在JDK1.2之后,Java对引用的概念进行扩充,将引用分为强引用、软引用、弱引用、虚引用四种,这四种引用强度依次逐渐减弱。

强引用

我们使用的大部分引用实际上都是强引用,这是使用最普遍的引用。比如下面的object

Object object = new Object();

只要强引用还存在,垃圾回收器永远不会回收掉被引用的对象。即使当内存空间不足,JVM宁愿抛出OutOfMemoryError使程序终止,也不回收这种对象。

如果想中断强引用和某个对象之间的关联,可以显示地将引用赋值为null,这样一来的话,JVM在合适的时间就会回收该对象。比如ArraryList类的clear方法中就是通过将引用赋值为null来实现清理工作的:

在ArrayList类中定义了一个私有的变量elementData数组,在调用方法清空数组时可以看到为每个数组内容赋值为null。不同于elementData=null,强引用仍然存在,避免在后续调用 add()等方法添加元素时进行重新的内存分配。使用如clear()方法中释放内存的方法对数组中存放的引用类型特别适用,这样就可以及时释放内存。

软引用

软引用用来描述一些还有用,但并非必须的对象,在Java中用java.lang.ref.SoftReference类来表示。对于软引用关联着的对象,在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围之中并进行第二次回收,如果这次回收还是没有足够的内存,才会抛出内存溢出异常。因此,这一点可以很好地用来解决OOM的问题,并且这个特性很适合用来实现缓存:比如网页缓存、图片缓存等。

运行结果如下:

从上面的示例中就能看出,软引用关联的对象不会被GC回收。JVM在分配空间时,如果Heap空间不足,就会进行相应的GC,但是这次GC并不会收集软引用关联的对象,但是在JVM发现就算进行了一次回收后还是不足(Allocation Failure),JVM会尝试第二次GC,回收软引用关联的对象。

像这种如果内存充足,GC时就保留,内存不够,GC再来收集的功能很适合用在缓存的引用场景中。在使用缓存时有一个原则,如果缓存中有就从缓存获取,如果没有就从数据库中获取,缓存的存在是为了加快计算速度,如果因为缓存导致了内存不足进而整个程序崩溃,那就得不偿失了。

弱引用

弱引用也是用来描述非必须对象的,他的强度比软引用更弱一些,被弱引用关联的对象,在垃圾回收时,如果这个对象只被弱引用关联(没有任何强引用关联他),那么这个对象就会被回收。

运行输出:

从上面的代码中可以看出,弱引用关联的对象是否回收取决于这个对象有没有其他强引用指向它。这个确实很难理解,既然弱引用关联对象的存活周期和强引用差不多,那直接用强引用好了,干嘛费用弄出个弱引用呢?其实弱引用存在必然有他的应用场景。

weakHashMap类的设计:

设计 WeakHashMap类是为了解决一个有趣的问题。如果有一个值,对应的键已经不再 使用了, 将会出现什么情况呢? 假定对某个键的最后一次引用已经消亡,不再有任何途径引 用这个值的对象了。但是,由于在程序中的任何部分没有再出现这个键,所以,这个键 / 值 对无法从映射中删除。为什么垃圾回收器不能够删除它呢? 难道删除无用的对象不是垃圾回 收器的工作吗?

遗憾的是,事情没有这样简单。垃圾回收器跟踪活动的对象。只要映射对象是活动的, 其中的所有桶也是活动的, 它们不能被回收。因此,需要由程序负责从长期存活的映射表中 删除那些无用的值。 或者使用 WeakHashMap完成这件事情。当对键的唯一引用来自散列条目时, 这一数据结构将与垃圾回收器协同工作一起删除键 / 值对。

WeakHashMap 使用弱引用(weak references) 保存键。 WeakReference 对象将引用保存到另外一个对象中,在这里,就是散列键。对于这种类型的对象,垃圾回收器用一种特有的方式进行处理。通常,如果垃圾回收器发现某个特定的对象 已经没有他引用了,就将其回收。然而, 如果某个对象只能由 WeakReference 引用, 垃圾 回收器仍然回收它,但要将引用这个对象的弱引用放人队列中。WeakHashMap将周期性地检 查队列, 以便找出新添加的弱引用。一个弱引用进人队列意味着这个键不再被他人使用, 并 且已经被收集起来。于是, WeakHashMap将删除对应的条目。

除了WeakHashMap使用了弱引用,ThreadLocal类中也是用了弱引用。

虚引用

虚引用也称为幽灵引用或者幻影引用,它是最弱的一种引用关系。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象的实例,为一个对象设置虚引用关联的唯一目的就是希望能在这个对象被收集器回收时收到一个系统通知。在JDK1.2之后,提供了PhantomReference类来实现虚引用。

弱引用使用场景桌面_吃透Java基础十五:强引用、软引用、弱引用、虚引用相关推荐

  1. java参数注解pam_吃透Java基础十:注解

    一.什么是注解 官方定义: 注解是一系列元数据,它提供数据用来解释程序代码,但是注解并非是所解释的代码本身的一部分.注解对于代码的运行效果没有直接影响. 注解有许多用处,主要如下: 提供信息给编译器: ...

  2. 弱引用使用场景桌面_面试|再次讲解Threadlocal使用及其内存溢出

    ThreadLocal彻底详解 整理本文主要是想帮助大家完全消化面试中常见的ThreadLocal问题.希望读懂此文以后大家可以掌握: 简单介绍原理 ThreadLocal使用案例场景 Threadl ...

  3. c++二进制文件java读取int_吃透Java基础十二:IO

    一.什么是IO流 Java中将输入输出抽象称为流,就好像水管,将两个容器连接起来.流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流. 按数据来源(去向) ...

  4. JVM 学习(2)—简单理解Java 四大引用(强、软、弱、虚)

    一.Java 引用概述 Java 中出现四种引用是为了更加灵活地管理对象的生命周期,以便在不同场景下灵活地处理对象的回收问题.不同类型的引用在垃圾回收时的处理方式不同,可以用来实现不同的垃圾回收策略. ...

  5. java中四种引用类型(对象的强、软、弱和虚引用)

    2019独角兽企业重金招聘Python工程师标准>>> 对象的强.软.弱和虚引用在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有 ...

  6. Java:对象的强、软、弱和虚引用

    见:http://zhangjunhd.blog.51cto.com/113473/53092 maven/Java/web/bootstrap/dataTable/app开发QQ群:56686262 ...

  7. 软引用和弱引用的区别_强、软、弱、虚引用的区别和使用

    原文阅读: 强.软.弱.虚引用的区别和使用​mp.weixin.qq.com Java提供了四种级别的应用类型:强引用.软引用.弱引用及虚引用.那么这四种引用类型有什么区别呢? 首先我们通过一张图来看 ...

  8. java-基础-强、软、弱、虚引用

    Java的四种引用,强弱软虚,用到的场景. JDK1.2之前只有强引用,其他几种引用都是在JDK1.2之后引入的. 强引用(Strong Reference) 最常用的引用类型,如Object obj ...

  9. 对象的强、软、弱和虚引用

    本文介绍对象的强.软.弱和虚引用的概念.应用及其在UML中的表示. 1.对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有 ...

最新文章

  1. Mysql索引,用户及授权(root密码恢复)
  2. sklearn综合示例3:逻辑回归
  3. 浅谈C中的malloc和free
  4. Mycat 安装配置
  5. 模型的搜索和优化方法综述:
  6. 谈跨平台C++动态连接库的实现
  7. 删除目录及目录下所有文件与子目录
  8. 小隐隐于野:基于TCP反射DDoS攻击分析
  9. 面向对象设计模式之策略模式
  10. 第8章 多项式回归与模型泛化 学习笔记中
  11. 硬盘分区MBR与GPT
  12. GNSS定位中的不同高度概念及计算
  13. 数论—乘法逆元—费马小定理
  14. Matlab根据excel数据画图
  15. 微信开发安卓虚拟键盘挡住输入框的问题
  16. 重新认识Windows计算器Calc(MatLab计算替代品)——你所不知道的细节
  17. b2g process 和nuwa process 通信
  18. k8s自定义controller三部曲之三:编写controller代码
  19. java EE单例Singleton自启动
  20. 苹果4怎么越狱_来看iPhone迁移怎么用 除iOS12.4苹果还为旧款设备推送了更新

热门文章

  1. oracle共享时监听,Oracle监听---共享连接参数配置介绍
  2. 电商退货处理流程_多个退货单
  3. python枪战项目计划书_燕山大学操作系统课程设计计划书
  4. 大班运用计算机教学案例,幼儿园大班体验课程教学案例
  5. 皮一皮:大家族的悲哀。。。
  6. 程序员加入新团队必问的20道问题
  7. 用了5年的Git,你竟然还不晓得它的实现原理!
  8. IntelliJ IDEA 2020.2.1 发布,Lombok插件可能被官方支持
  9. SpringBoot + RabbitMQ (保证消息100%投递成功并被消费)
  10. 如何用 StreamAPI 处理 BigDecimal 的 add 操作