一、HotSpot算法细节

  1、根节点枚举:所有的收集器在根节点枚举的时候,必须暂停用户线程,同时要保证一致性的快照中得以进行。一致性:整个枚举期间执行子系统看起来就像是冻结在某一个时间点上,不会出现分析过程中,根节点的对象应用关系还在不断变化的情况。

  2、安全点:用户程序执行到某一些位置的时候,才能够暂停下来进行垃圾回收。一般安全点的产生,只有在指令序列复用。垃圾收集的时候,所有线程跑到最近的安全点:抢先式中断和主动式中断。

  3、安全区域:这样的方式似乎解决停顿用户线程,但是如果程序“不执行”的话,程序也就没有分配处理器的时间,这样也就没有响应虚拟机的中断请求,这种情况,必须引入安全区域来解决问题。

  4、记忆集与卡表:记忆集:用于记录从非收集区域指向收集区域的指针集合的抽象数据结构。记忆集是一种比较“抽象”的数据结构,抽象的意思是只定义了记忆集的行为意图,并没有定义其行为的具体实现。卡表是记忆集的一种具体实现。

  5、写屏障:写屏障技术来维护卡表状态的。

  6、并发的可达性分析:解决并发扫描的对象消失问题,产生了两种解决方案:增量更新和原始快照。所谓的原始快照:当灰色对象要删除指向的白色对象的引用关系时,将要删除的引用记录下来,在并发扫描结束之后,再将这些记录过的引用关系的灰色对象为根,重新扫描一次、PS:也就是说无论引用关系是否删除,都需要按照刚刚开始扫描那一刻的对象图快照进行搜索。

二、低延迟垃圾收集器

  衡量垃圾收集器最重要的三项指标:内存占用、吞吐量、延迟。其中延迟被誉为垃圾收集器最受到重视的性能指标。只有Shenandoah和ZGC属于低延迟垃圾收集器,并且实现垃圾收集的停顿时间不超过10毫秒,只有初始标记、最终标记这些阶段有短暂的停顿,停顿时间为固定的,与堆的容量、堆的数量没有正比例关系。

  1、Shenandoah收集器:是最“孤独”的一个。Shenandoah收集器的目标是能够在任何的堆内存大小下都能够可以把垃圾收集的停顿时间控制在10毫秒以内。同时与G1一样的是,Shenandoah收集器使用基于Region的堆内存布局,和G1不同的是,它只是并发的整理算法,但是不能和用户线程并发。G1收集器中使用的记忆集,消耗了大量的内存和计算资源。所以在Shenandoah收集器中抛弃了这种方式,改用“连接矩阵”来记录跨Region的引用关系。收集器的工作流程分为以下九个阶段:1、初始标记。2、并发标记。3、最终标记。4、并发清理。5、并发回收。6、初始引用更新。7、并发引用更新。8、最终引用更新。9、并发清理。

  Shenandoah收集器用来支持并行整理的核心概念 -- Brooks Pointer。转发指针分散的存放在每一个对象头前面。

  2、ZGC收集器:具有实验性质的低延迟垃圾收集器,不设分代,仅使用读屏障、染色指针[直接将少量额外的信息存储到指针]、内存多重映射来实现标记 - 整理算法。与Shenandoah、G1收集器不同的是,ZGC采用的基于Region的堆内存布局具有动态性,设置了大、中、小三类容量。需要注意的是,因为大型的Region内存分配在ZGC的实现中是不会重新分配的,因为复制大对象的代价非常的昂贵。

  接下来介绍一下ZGC的核心问题---并发整理算法,具有标志性的设计,采用了染色指针技术。ZGC直接将标记信息记到了引用对象的指针上,从而变成了遍历“引用图”来标记“引用”了。把染色指针中的标志位看做是地址的分段符,将不同的地址段都映射到同一个物理内存空间,经过多重映射转换后,使用染色指针可以正常进行寻址。ZGC的多重映射是采用染色指针技术的伴生产物,并不是专门为了实现其他的某种特性需求而去做的。

  ZGC收集器的工作流程:1、并发标记。2、并发预备重分配。3、并发重分配。4、并发重映射。

  当对象处于重分配中,用户线程在这个时候访问了此对象,则该访问会被预置的内存屏障截获,同时根据Region的转发表将访问转发到新复制的对象上,同时修正更新该引用的值,使其指向新的对象,ZGC将这种行为称为指针的“自愈能力”。

  巧妙地不止这个,还有并发重映射,重映射所要做的是修正整个堆中指向重分配集中旧对象的所有引用,但并不是一个迫切去完成的任务,之所以重映射这些旧引用是为了不变慢,所以说这个并不是很迫切,于是,巧妙地将并发重映射阶段做的工作,合并到了下一次垃圾收集循环中的并发标记阶段去完成。因此,基于上述过程,ZGC收集器和Shenandoah收集器做到了几乎可以在整个收集过程并发。

  ZGC收集器有一个技术优点:支持“NUMA-Aware”的内存分配,NUMA是为多处理器或者是多核处理器的计算机所设计的内存架构。

额外的知识点:

1、内存屏障:

2、虚拟内存映射技术:

 

Java虚拟机(JVM):第五幕:自动内存管理 - HotSpot算法细节以及低延迟垃圾收集器的更多相关文章

  1. 深入理解Java虚拟机之读书笔记一 自动内存管理机制

    一.运行时数据区域 1.程序计数器是线程的私有空间,每个线程都有.针对线程执行的是Java代码还是Native代码有两种取值,Java代码时:虚拟机字节码指令的地址:Native代码时:计数值为Und ...

  2. JVM 低延迟垃圾收集器 Shenandoah 和 ZGC

    本文部分摘自<深入理解 Java 虚拟机第三版> 概述 衡量垃圾收集器的三项指标分别是:内存占用.吞吐量和延迟.这三者共同构成一个"不可能三角",即一款优秀的收集器最多 ...

  3. Java自动内存管理机制学习(二):垃圾回收器与内存分配策略

    备注:本文引自<深入理解Java虚拟机第二版>仅供参考 图片来自:http://csdn.net/WSYW126 垃圾收集器与内存分配策略 概述 GC要完成3件事: 哪些内存需要回收? 什 ...

  4. JAVA之自动内存管理机制

    一.内存分配 1.JVM体系结构 2.运行时数据区域 3.内存分配二.内存回收 1.垃圾收集算法 2.垃圾收集器三.相关参考一.内存分配JVM体系结构 在了解自动内存管理的内存分配之前,我们先看下JV ...

  5. JVM | 第1部分:自动内存管理与性能调优《深入理解 Java 虚拟机》

    目录 前言 1. 自动内存管理 1.1 JVM运行时数据区 1.2 Java 内存结构 1.3 HotSpot 虚拟机创建对象 1.4 HotSpot 虚拟机的对象内存布局 1.5 访问对象 2. 垃 ...

  6. [深入理解Java虚拟机]<自动内存管理>

    Overview 走近Java:介绍Java发展史 第二部分:自动内存管理机制 程序员把内存控制的权利交给了Java虚拟机,从而可以在编码时享受自动内存管理.但另一方面一旦出现内存泄漏和溢出等问题,就 ...

  7. JVM自动内存管理-Java内存区域与内存溢出异常

    摘要: JVM内存的划分,导致内存溢出异常的可能区域. 1. JVM运行时内存区域 JVM在执行Java程序的过程中会把它所管理的内存划分为以下几个区域: 1.1 程序计数器 程序计数器是一块较小的内 ...

  8. JVM自动内存管理机制——Java内存区域(下)

    一.虚拟机参数配置 在上一篇<Java自动内存管理机制——Java内存区域(上)>中介绍了有关的基础知识,这一篇主要是通过一些示例来了解有关虚拟机参数的配置. 1.Java堆参数设置 a) ...

  9. JVM自动内存管理机制——Java内存区域(上)

    一.JVM运行时数据区域概述 Java相比较于C/C++的一个特点就是,在虚拟机自动内存管理机制的帮助下,我们不需要为每一个操作都写像C/C++一样的delete/free代码,所以也不容易出现内存泄 ...

  10. Java虚拟机笔记(五):JVM中对象的分代

    为什么要分代 为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能.你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我们要找到哪些对象没用, ...

随机推荐

  1. Go语言编程技巧:实现高效的数据处理和企业应用程序

    目录 Go语言编程技巧:实现高效的数据处理和企业应用程序 摘要 Go语言是一种现代的编程语言,以其高效.简洁.安全.可靠等优点而备受欢迎.本文将介绍Go语言编程技巧,包括数据处理和企业应用程序方面的应 ...

  2. SQL Sever Josn相互转化

    正向转化: SELECT TOP 2 StudentID, Name AS "name", Sex AS "urname" FROM dbo.student F ...

  3. python笔记:第四章使用字典

    1.1 概述 说白了就是键值对的映射关系 不会丢失数据本身关联的结构,但不关注数据的顺序 是一种可变类型 格式:dic = {键:值, 键:值} 键的类型:字典的键可以是任何不可变的类型,如浮点数,字 ...

  4. (四) MdbCluster分布式内存数据库——业务消息处理

    (四) MdbCluster分布式内存数据库--业务消息处理   上篇:(三) MdbCluster分布式内存数据库--节点状态变化及分片调整   离上次更新文章已有快5个月,我还是有点懒.但我们系统 ...

  5. jquery中for循环一共几种

    $.each()  第一个参数是循环的对象 , 第二个参数对对象中的每一个元素 执行 function函数 ,function 的第一个参数 i 是索引,item 是 循环对象中的每一个元素.

  6. DevOps|研发效能治理:进化史、规模化与治理复杂性

    麻广广@码猿外 研发效能这个词近几年火遍全网,各大企业都加入了研发效能治理的行列,开始梳理企业内部各个团队的研发流程,以期望找到企业降本增效的方向. 抛开政治因素,研发效能治理我们到底是在谈什么呢?从 ...

  7. 王道oj/problem17

    网址:http:oj.lgwenda.com/problem17 思路:指针其实就是存储地址的一个空间,LinkList=LNode* 代码: #define _CRT_SECURE_NO_WARNI ...

  8. CTF中的神兵利刃-foremost工具之文件分离

    原理 Foremost可以依据文件内的文件头和文件尾对一个文件进行分离,或者识别当前的文件是什么文件.比如拓展名被删除.被附加也仍然可以对其分离. 使用 安装: 需要使用这个工具,首先我们需要安装他, ...

  9. 如何创建Windows 10 虚拟机

    一 ,新建Windows 10 虚拟机 1.1 创建新的虚拟机 1,点击创建新的虚拟机 2,选择典型,点击下一步 3,选择稍后安装操作系统,点击下一步. 4,操作系统选择windwos,版本选着Win ...

  10. Promise的理解和使用(二)

    一.Promise的常用APIpromise的这些方法执行完成都会返回一个新的promise,promise的状态由执行的结果决定. (1) new Promise()中的excutor函数 new ...