知道弱引用和软引用的概念与如何使用它们是两码事,引用类在垃圾回收工作的过程中有重要作用。我们都知道垃圾回收器会回收符合回收条件的对象的内存,但并不是所有的程序员都知道回收条件取决于指向该对象的引用类型。这正是Java中弱引用和软引用的主要区别。如果一个对象只有弱引用指向它,垃圾回收器会立即回收该对象,这是一种急切回收方式。相对的,如果有软引用指向这些对象,则只有在JVM需要内存时才回收这些对象。弱引用和软引用的特殊行为使得它们在某些情况下非常有用。例如:软引用可以很好的用来实现缓存,当JVM需要内存时,垃圾回收器就会回收这些只有被软引用指向的对象。而弱引用非常适合存储元数据,例如:存储ClassLoader引用。如果没有类被加载,那么也没有指向ClassLoader的引用。一旦上一次的强引用被去除,只有弱引用的ClassLoader就会被回收。这篇文章中我们将讲述不同类型的Java引用,例如:强引用(Strong Reference)和虚引用(PhantomReference)。

Java中弱引用VS软引用

Java中有如下四种类型的引用:

1.强引用(Strong Reference)

2.弱引用(WeakReference)

3.软引用(SoftReference)

4.虚引用(PhantomReference)

强引用是我们在编程过程中使用的最简单的引用,如代码String s=”abc”中变量s就是字符串对象”abc”的一个强引用。任何被强引用指向的对象都不能被垃圾回收器回收,这些对象都是在程序中需要的。弱引用使用java.lang.ref.WeakReference class 类来表示,你可以使用如下代码创建弱引用:

Counter counter = new Counter(); // strong reference - line 1

WeakReference weakCounter = new WeakReference(counter); //weak reference

counter = null; // now Counter object is eligible for garbage collection

现在只要你给强引用对象counter赋空值null,该对象就可以被垃圾回收器回收。因为该对象此时不再含有其他强引用,即使指向该对象的弱引用weakCounter也无法阻止垃圾回收器对该对象的回收。相反的,如果该对象含有软引用,Counter对象不会立即被回收,除非JVM需要内存。Java中的软引用使用java.lang.ref.SoftReference类来表示,你可以使用如下代码创建软引用:

Counter prime = new Counter(); // prime holds a strong reference – line 2

SoftReference soft = new SoftReference(prime) ; //soft reference variable has SoftReference to Counter Object created at line 2

prime = null; // now Counter object is eligible for garbage collection but only be collected when JVM absolutely needs memory

强引用置空之后,代码的第二行为对象Counter创建了一个软引用,该引用同样不能阻止垃圾回收器回收对象,但是可以延迟回收,与弱引用中急切回收对象不同。鉴于软引用和弱引用的这一区别,软引用更适用于缓存机制,而弱引用更适用于存贮元数据。另一个使用弱引用的例子是WeakHashMap,它是除HashMap和TreeMap之外,Map接口的另一种实现。WeakHashMap有一个特点:map中的键值(keys)都被封装成弱引用,也就是说一旦强引用被删除,WeakHashMap内部的弱引用就无法阻止该对象被垃圾回收器回收。

虚引用是java.lang.ref package包中第三种可用的引用,使用java.lang.ref.PhantomReference类来表示。拥有虚引用的对象可以在任何时候被垃圾回收器回收。和弱引用和软引用相似,你可以通过如下代码创建虚引用:

DigitalCounter digit = new DigitalCounter(); // digit reference variable has strong reference – line 3

PhantomReference phantom = new PhantomReference(digit); // phantom reference to object created at line 3

digit = null;

一旦移除强引用,第三行的DigitalCounter对象可以在任何时候被垃圾回收器回收。因为只有一个虚引用指向该对象,而虚引用无法阻止垃圾回收器回收对象。

除了了解弱引用、软引用、虚引用和WeakHashMap,还需要了解ReferenceQueue。在创建任何弱引用、软引用和虚引用的过程中你可以通过如下代码提供引用队列ReferenceQueue:

ReferenceQueue refQueue = new ReferenceQueue(); //reference will be stored in this queue for cleanup

DigitalCounter digit = new DigitalCounter();

PhantomReference phantom = new PhantomReference(digit, refQueue);

引用实例被添加在引用队列中,你可以再任何时候通过查询引用队列回收对象。一个对象的生命周期可以通过下图进行描述:这就是Java中弱引用和软引用的区别。我们还学到了一些基本的引用类:弱引用、软引用、虚引用以及WeakHashMap和WeakHashMap。总之,合理的使用引用可以帮助垃圾回收器更好的管理Java内存。

java 软引用_Java中弱引用和软引用的区别以及虚引用和强引用介绍相关推荐

  1. java replaceall函数_JAVA中string.replace和string.replaceAll的区别及用法

    展开全部 JAVA中string.replace()和string.replaceAll()的区别及用法乍一看,字面上理解好像replace只替换第一个出现的字符(受javascript的影响),32 ...

  2. java listfiles 使用_Java中list()和listFiles()方法之间的区别

    java.io包的名为File的类表示系统中的文件或目录(路径名).为了获得目录中所有现有文件的列表,此类提供了list()和ListFiles()方法. 它们之间的主要区别是该列表()方法返回一个字 ...

  3. java 枚举迭代_Java中的枚举和迭代器之间的区别

    java 枚举迭代 Java中的枚举与迭代器 (Enumeration vs Iterator in Java) Here, we will see how Enumeration differs f ...

  4. java 枚举常量_java中的枚举类和常量类区别在哪儿?

    假如有一笔业务需要审核,审核状态分:未审核,审核中,审核通过,审核不通过.我们在程序里是否可以直接这么写: if(state==1){//1代表未操作 //操作 }else{ //...... } 将 ...

  5. 的引用_java中的强引用,软引用,弱引用,虚引用

    一对象回收算法 Java在GC时判断对象是否存活有两种方式:第一种是引用计数方式,第二种是可达性分析算法: 引用计数器算法: 在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一:当引用 ...

  6. java 基本类型的引用_Java中的基本数据类型与引用数据类型

    一.基本数据类型 byte.short.int.long(整数类型) float.double(浮点数类型) char(字符型) boolean(布尔类型 ) Java数据大多数存放在堆栈中.栈区:存 ...

  7. java 数据类型分为_JAVA中分为基本数据类型及引用数据类型

    byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0 short:短整型,在内存中占16位,即2个字节,取值范围-32768~32717,默认值 ...

  8. java object 引用类型_java中的四种引用类型

    java中的四种引用类型 一.强引用 强引用是最常见的,把一个对象赋给一个引用变量,这个引用变量就是一个强引用.当一个对象被强引用变量引用时,他处于可达状态,它是不会被GC回收的,即使该对象以后永远不 ...

  9. java gc 例子_Java 中, 为什么一个对象的实例方法在执行完成之前其对象可以被 GC 回收?...

    收到好多邀请-泻药泻药.其中有好些感觉是想来吃瓜的. 所以请让我先跑个题,为吃瓜群众献上几个传送门: private static void newSingleThreadPool() { Execu ...

最新文章

  1. 【牛客每日一题】4.16 逆序对 ( 数学 , 排列组合 ,快速幂 , 快速乘 )
  2. python的位运算符
  3. 赠书:Java面试一战到底!
  4. map按value值查找——find_if的使用(转载)
  5. 20165218 2017-2018-1 《Java程序设计》第四周学习总结
  6. 什么时候z检验什么时候t检验?
  7. matlab没有int函数,matlab 未定义与 'char' 类型的输入参数相对应的函数 'int'。
  8. 偶然发现一个大佬写的 React 脚手架,叫Moderate, 用起来很方便
  9. linux账户管理代码和截图,linux 用户管理(示例代码)
  10. 计算机病毒实践汇总三:动态分析基础(分析程序)
  11. 【图像去噪】基于matlab高通+低通+带通+方向滤波器图像滤波【含Matlab源码 1209期】
  12. 超级硬盘恢复软件真的超好用哦!
  13. SoapUI接口测试工具测试webservice
  14. 屏幕取词编程学习总结
  15. VC2012/VS2012 MFC串口通讯上位机程序教程笔记
  16. Bartender 连接MySql数据库并对模板赋值打印标签二维码
  17. 2021年9月国产数据库排行榜:达梦奋起直追紧逼OceanBase,openGauss反超PolarDB再升一位...
  18. 傻瓜式操作更改微信步数
  19. 力扣347:前k个高频元素---leetcode347:Top K Frequent Elements
  20. JWT(Golang)

热门文章

  1. Android 开机自动运行和添加删除桌面快捷方式
  2. DVD碟片输出与刻录简单流程
  3. (二)spring cloud微服务分布式云架构-整合企业架构的技术点
  4. 【自动化测试】Python 读取 .ini 格式文件
  5. linux下的压缩与解压缩
  6. 如何使用Spring管理Filter和Servlet
  7. centos下部署tomcat详解
  8. js 1 声明变量 数据类型
  9. android 4.x环境搭建
  10. Code Hunt SECTOR 10 - 11(Jagged Arrays Arrays 2)