Thinking in java对这个地方说得不清楚,随便在网上找了几篇文章也没看太明白。

是说想要在以后访问某个对像,但现在又想先回收了它,就可以使用持有引用来实现,而问题是回收就是回收了,怎么才能之后再访问到呢?没人说明。

深入查找资料之后发现上面的认识是错误的!

持有引用的作用是在执行gc之后允许你继续持有(可能)被回收了的对象的引用,而将对像实例清出内存,持有引用提供了与垃圾回收器之间有限的交互。

垃圾回收概述

垃圾回收器在回收对象之前需要判断一个对象是否存活,java中使用根搜索算法来判断。基本思想是对过一系列名为GC Roots的对象作为起始点,从这些节点向下搜索,当一个对象不能被任何一个GC Roots到达时就认为该对象是可回收的。然而您还需要注意一个重要的细节:仅凭对象可以被收集并不意味着垃圾收集器的一次指定运行就能够回收它。由于各种垃圾收集算法有所不同,某些算法会更频繁地分析生存期较短的对象,而不是较老、生存期较长的对象。因此,一个可供收集的对象可能永远也不会被回收。如果程序在垃圾收集器释放对象之前结束,这种情况就可能会出现。因此,概括地说,您永远无法保证可供收集的对象总是会被垃圾收集器收集。

一些术语:

  • 强可及对象(strongly reachable):可以通过强引用访问的对象。
  • 软可及对象(softly reachable):不是强可及对象,并且能够通过软引用访问的对象。
  • 弱可及对象(weakly reachable):不是强可及对象也不是软可及对象,并且能够通过弱引用访问的对象。
  • 虚可及对象(phantomly reachable):不是强可及对象、软可及对象,也不是弱可及对象,已经结束的,可以通过虚引用访问的对象。
  • 清除:将引用对象的 referent 域设置为 null ,并将引用类在堆中引用的对象声明为 可结束的

java.lang.ref包中提供了三个类来达到三种不同的引用类型:

SoftReference 类

SoftReference 类的一个典型用途就是用于内存敏感的高速缓存。 SoftReference 的原理是:在保持对对象的引用时保证在 JVM 报告内存不足情况之前将清除所有的软引用。关键之处在于,垃圾收集器在运行时可能会(也可能不会)释放软可及对象。对象是否被释放取决于垃圾收集器的算法以及垃圾收集器运行时可用的内存数量。

WeakReference 类

WeakReference 类的一个典型用途就是规范化映射(canonicalized mapping)。另外,对于那些生存期相对较长而且重新创建的开销也不高的对象来说,弱引用也比较有用。关键之处在于,垃圾收集器运行时如果碰到了弱可及对象,将释放 WeakReference 引用的对象。然而,请注意,垃圾收集器可能要运行多次才能找到并释放弱可及对象。

PhantomReference 类

PhantomReference 类只能用于跟踪对被引用对象即将进行的收集。同样,它还能用于执行 pre-mortem 清除操作。 PhantomReference 必须与 ReferenceQueue 类一起使用。需要 ReferenceQueue 是因为它能够充当通知机制。当垃圾收集器确定了某个对象是虚可及对象时, PhantomReference 对象就被放在它的 ReferenceQueue 上。将 PhantomReference 对象放在 ReferenceQueue 上也就是一个通知,表明 PhantomReference 对象引用的对象已经结束,可供收集了。这使您能够刚好在对象占用的内存被回收之前采取行动。

以上有两点需要说明,一是SoftReference用于高速缓存可以理解为维护了一组动态的内存,这块内存中的对象在需要是可以被gc回收而不会存在强引用指向它们。第二点是规范化映射是什么?它是指你可以使用WeakReference来创建一组映射,而这组映射里的对象是可以被回收的,比如当我们正常的创建一个Map时,向里面添加对象,被添加的这些对象是由它们的容器Map可达的,所以就不能被回收,而如果通过WeakReference封装对象然后再添加到Map中,这些对象就可以被回收了,具体请看这里:http://c2.com/cgi/wiki?CanonicalizedMapping。

下面在这里看与垃圾回收器的交互及持有引用的使用方法:Java 2 引用类使用指南 https://www.ibm.com/developerworks/cn/java/j-refs/,这篇文章里面说明了持有引用的原理和使用持有引用的正确方法。

使用Reference API:

The Reference Objects API allows programs to interact with the garbage collector

http://www.javaworld.com/javaworld/jw-01-2002/jw-0104-java101.html?page=2

另外java提供了WeakHashMap来实现规范映射,这与使用WeakReference的实现达到同样的效果,值得注意的一点就是这时需要运行再次垃圾回收才能把key(第一次回收)和value(第二次回收)回收掉。

java中的持有引用相关推荐

  1. 理解Java中的弱引用(Weak Reference)

    理解Java中的弱引用(Weak Reference) 本篇文章尝试从What.Why.How这三个角度来探索Java中的弱引用,理解Java中弱引用的定义.基本使用场景和使用方法.由于个人水平有限, ...

  2. java的弱引用_深入理解Java中的弱引用

    不久之前,我面试了一些求职Java高级开发工程师的应聘者.我常常会面试他们说,"你能给我介绍一些Java中得弱引用吗?",如果面试者这样说,"嗯,是不是垃圾回收有关的?& ...

  3. java弱引用怎么手动释放,十分钟理解Java中的弱引用,十分钟java引用

    十分钟理解Java中的弱引用,十分钟java引用 本篇文章尝试从What.Why.How这三个角度来探索Java中的弱引用,帮助大家理解Java中弱引用的定义.基本使用场景和使用方法.由于个人水平有限 ...

  4. Java中对象和引用的理解

    2019独角兽企业重金招聘Python工程师标准>>> 偶然想起Java中对象和引用的基本概念,为了加深下对此的理解和认识,特地整理一下相关的知识点,通过具体实例从两者的概念和区别两 ...

  5. java的弱引用_理解Java中的弱引用(Weak Reference)

    本篇文章尝试从What.Why.How这三个角度来探索Java中的弱引用,理解Java中弱引用的定义.基本使用场景和使用方法.由于个人水平有限,叙述中难免存在不准确或是不清晰的地方,希望大家可以指出, ...

  6. java中数组的引用是什么意思_java数组的引用有什么意义

    java中的数组引用就是让数组b直接指向数组a(即b = a;).在java编程中这样做的目的是为了提高程序运行的效率. 试想一下,假如数组中有上万个元素,在拷贝数组时,如果将数组a的所有元素都一一拷 ...

  7. JAVA中的各种引用

    JAVA中引用的分类 强引用 软引用 表示一个有用但是非必须的对象. 弱引用 表示希望在下一次垃圾回收时回收的对象 虚引用 主要用于监控对象何时被回收 实现 Reference Reference是软 ...

  8. Java中的强引用、软引用、弱引用与虚引用

    一.前言 今天我们浅谈一下java的四种引用,分别是强引用.软引用.弱引用与序引用.在谈引用之前我们不得不提一下Java的垃圾回收器机制GC,GC算是Java的一大特点,我们都知道c语言是不能自动释放 ...

  9. Java中的四大引用

    Java对引用的定义 无论是通用引用计数算法判断对象的引用数据,还是通过可达性分析算法判断对象的引用链是否可达,判定对象是否存活都与"引用"有关.在JDK1.2之前,Java中的引 ...

最新文章

  1. 区块链从一夜暴富到一夜暴“负”的辛酸史
  2. openNebula 搭建
  3. 【集合论】关系性质 ( 常见的关系的性质 | 关系性质示例 | 关系运算性质 )
  4. JDK提供的原子类原理与使用
  5. 社区电商才是未来,新科技才是社区电商的核心,社区电商如何实现核心竞争力呢?
  6. pca 和lda区别
  7. HttpClient常用的一些常识
  8. RFC(一系列以编号排定的文件)
  9. 数据库建表赋予权限语句
  10. 李萍matlab实验报告,李萍, 张磊, 王垚廷. 基于Matlab的偏微分方程数值计算[J]. 齐鲁工业大学学报, 2017, 31(4): 39-43....
  11. 【转】随机函数 rand() srand() 以及seed的原理
  12. 空间权重矩阵构建(Stata代码)
  13. IPV6网络简介及使用
  14. Linux配置VNC远程桌面
  15. Unity性能优化之图形渲染(渲染性能的加强)
  16. 树莓派开机启动chromium浏览器
  17. [Graphics]自组织植物建模方法(ContinousLassoBrush)
  18. 什么是计算机图形学?(转自中国科学技术大学-刘利刚)
  19. java找出命题p和q的合取_从键盘输入两个命题变元p和q的真值-求它们的合取、析取、蕴含和等价的真值...
  20. 音播系统开启内测!助力播客商业化

热门文章

  1. 50+ Best Unity Assets: Shader, Editor Extensions, Level Editors, Models, Terrain
  2. Revit 二次开发 获取多段轴网的location
  3. 【CocosBuilder 开发系列之一】cocos2dx使用CocosBuilder(编辑器)完成基础骨骼动画
  4. 2018计算机系统结构全国卷,2018年10月高等教育自学考试全国统一命题考试02325计算机系统结构试卷及答案.doc...
  5. oracle rowid与rownum的使用
  6. linux autoconf 升级,autoconf问题
  7. Free2022春节虎年微信祝福语拜年分享小程序源码
  8. 事务原子性、一致性、持久性的实现原理
  9. python_numpy_计算对数收益率和还原问题
  10. 微信小程序Day2学习笔记