JVM学习笔记之四 四种引用和垃圾回收的两次标记
四种引用和两次标记
四种引用
java中的数据类型我们知道是分为基本数据类型和引用类型的。基本数据类型是8种,分别是boolean byte short int long double float char,基本数据类型其变量内存中存储的是该变量的值,而引用类型在JDK 1.1中的描述是:如果Reference类型的数据中存储的数值代表的是另外一块内存的起始地址,就称这块内存代表着一个引用。此定义下,一个对象只有被引用和没有被引用两种状态,这在使用中不够灵活方便。JDK1.2中对引用概念进行了扩充,细分为以下四种:
强引用 Strong Reference
强引用就是类似“Object obj = new Object()”的引用,强引用永远不会被垃圾收集器回收。
软引用 Soft Reference
用来描述一些还有用但是但是并非必须的对象。软引用关联的对象,在系统将要发生内存溢出之前,将会把这些对象列进回收范围之中进行第二次回收。如果回收后还是没有足够的内存,这会抛出OOM。很多系统缓存都会使用该类型的引用。
弱引用 WeakReference
也用来描述非必须对象,但是其强度比软引用弱,其关联的对象只能生存到下一次垃圾收集之前,当垃圾收集器开始回收内存时,无论内存是否够用,这些弱引用关联的对象都会被回收掉。
虚引用 PhantomReference
也称幽灵引用或者幻影引用,是最弱的引用关系。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。设置虚引用的唯一目的就是能在这个对象被垃圾收集器回收时收到一个系统的通知。
两次标记
一个对象从被判定为死亡对象到被垃圾收集器回收掉还要经历两次标记的过程,该过程可以认为是该对象在死刑的缓刑阶段。第一次标记:当可达性分析确认该对象没有引用链与GC Roots相连,则对其进行第一次标记和筛选,筛选的条件是重写了finalize()方法并没有执行过,对于重写了且并没有执行finalize()方法的对象这将其放置在一个F-Queue队列中,并在稍后由一个由虚拟机自动建立的低优先级的Finalizer线程去执行它。此处执行只保证执行该方法,但是不保证等待该方法执行结束,之所以这样子设计是为了系统的稳定性和健壮性考虑,以免该方法执行时间较长或者死循环导致系统崩溃。在此之后,系统会对对象进行第二次标记,如果在第一次标记之后的对象在执行finalize()方法时没有被引用到一个新的变量,这该对象将被回收掉。finalize方法只能被执行一次,并且一般不推荐也不建议重写Object的该方法,如果需要关闭外部资源,比如数据库,I/O等完全可在finally块中完成。以下是jdk中Object对象中finalize()方法的注释,部分做了翻译:
大意是:当垃圾收集判定一个对象没有引用指向它时,垃圾收集器会调用该方法。一个子类为了处理系统资源或者完成其他清理工作需要覆盖该方法。
声明:本博客中大量参考引用了周志明作者《深入理解java虚拟机》2版中的第三章节的内容,也可以看作是本书的学习笔记。
JVM学习笔记之四 四种引用和垃圾回收的两次标记相关推荐
- Java 中的四种引用及垃圾回收策略
Java 中有四种引用:强引用.软引用.弱引用.虚引用: 其主要区别在于垃圾回收时是否进行回收: 1.强引用 使用最普遍的引用.如果一个对象具有强引用,那就 类似于必不可少的生活用品,垃圾回收器绝不会 ...
- JVM学习笔记(四)
JVM学习笔记(四) 文章目录 JVM学习笔记(四) 笔记链接 1.GC算法 1.1GC-判断对象是否可回收 1.1.1 引用计数法 1.1.1 可达性分析 1.2GC-回收算法 标记清除法(Mark ...
- JVM学习笔记(四)------内存调优
首先需要注意的是在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提 ...
- JVM之引用类型Java四种引用
Java中提供了一个Reference抽象类,此类定义所有引用对象共有的操作,与垃圾收集器密切配合实现的.主要是为了决定某些对象的生命周期,有利于JVM进行垃圾回收.而继承此类的有四种引用,分别是St ...
- JVM学习笔记之四:分代垃圾回收
2019独角兽企业重金招聘Python工程师标准>>> 如图所示,在HotSpot虚拟机中共划分有三个代:年轻代(young generation),年老代(old generati ...
- 《具体数学》学习笔记: 4.四种方法推导平方和公式
四种方法推导平方和公式 序言: 连续自然数的平方和, Sn=∑k=0nk2=12+22+...+n2S_n = \sum_{k=0}^{n}{k^2} = 1^2 + 2^2 + ... + n^2S ...
- java 堆_JAVA学习笔记 07——堆、栈和垃圾回收机制
程序执行的内存分析过程: 虚拟机栈(简称:栈)的特点如下: 1. 栈描述的是方法执行的内存模型.每个方法被调用都会创建一个栈帧(存储局部变量.操作数.方法出口等). 2. JVM为每个线程创建一个栈, ...
- jvm学习笔记(二)
jvm学习笔记(二) 文章目录 jvm学习笔记(二) 1.全部笔记链接 2. Native关键字 3.关于JVM规范 3.1 JVM规范中运行时数据区的概念 4.HotSpot的JVM运行时数据区 4 ...
- jvm学习笔记(三)
jvm学习笔记(三) 文章目录 jvm学习笔记(三) 1.全部笔记链接 2.堆 2.1堆的划分 使用JVM参数查看划分 Hotspot堆内存划分图(JDK8之前) 2.2 GC对堆的回收 GC的种类 ...
最新文章
- 谈谈 Java 类加载机制
- UA MATH567 高维统计I 概率不等式9 亚高斯性的推广:Orlicz空间与Orlicz范数
- 从其它地方复制的代码到VS 提示无法识别的标记的解决办法
- Android开发学习之路--Camera之初体验
- cocos2d-x初探学习笔记(14)--菜单项
- Vue文件导致的报错 'axios' is not defined
- 随机生成一组不重复的随机数组
- ad软件侵权律师函_专业版,无AD无限制,建议收藏~
- 解决request-html chromium下载失败原因
- 在新旧交替的过程中,我们成长着—导师制,舞台和挑战
- [网络安全自学篇] 十六.Python攻防之弱口令、自定义字典生成及网站暴库防护
- 新的抗VEGF药物——阿柏西普ELISA 试剂盒相关研究
- 产业大观 | “制造之都”东莞谋变背后:服务型制造铺就荣光之路
- POJ2248 Addition Chains(迭代加深搜索)
- Java实习生常规技术面试题每日十题Java基础(三)
- 乐优商城之规格参数商品查询(十)
- 电脑如何同时远程控制多台手机
- spring的依赖注入 -------基于注解方式
- 虚拟运营商会如何卖手机?且看JDPhone和余额宝
- JS CryptoJS 编码/解码 Base64 字符串