Java虚拟机(JVM):第五幕:自动内存管理 - HotSpot算法细节以及低延迟垃圾收集器
一、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算法细节以及低延迟垃圾收集器的更多相关文章
- 深入理解Java虚拟机之读书笔记一 自动内存管理机制
一.运行时数据区域 1.程序计数器是线程的私有空间,每个线程都有.针对线程执行的是Java代码还是Native代码有两种取值,Java代码时:虚拟机字节码指令的地址:Native代码时:计数值为Und ...
- JVM 低延迟垃圾收集器 Shenandoah 和 ZGC
本文部分摘自<深入理解 Java 虚拟机第三版> 概述 衡量垃圾收集器的三项指标分别是:内存占用.吞吐量和延迟.这三者共同构成一个"不可能三角",即一款优秀的收集器最多 ...
- Java自动内存管理机制学习(二):垃圾回收器与内存分配策略
备注:本文引自<深入理解Java虚拟机第二版>仅供参考 图片来自:http://csdn.net/WSYW126 垃圾收集器与内存分配策略 概述 GC要完成3件事: 哪些内存需要回收? 什 ...
- JAVA之自动内存管理机制
一.内存分配 1.JVM体系结构 2.运行时数据区域 3.内存分配二.内存回收 1.垃圾收集算法 2.垃圾收集器三.相关参考一.内存分配JVM体系结构 在了解自动内存管理的内存分配之前,我们先看下JV ...
- JVM | 第1部分:自动内存管理与性能调优《深入理解 Java 虚拟机》
目录 前言 1. 自动内存管理 1.1 JVM运行时数据区 1.2 Java 内存结构 1.3 HotSpot 虚拟机创建对象 1.4 HotSpot 虚拟机的对象内存布局 1.5 访问对象 2. 垃 ...
- [深入理解Java虚拟机]<自动内存管理>
Overview 走近Java:介绍Java发展史 第二部分:自动内存管理机制 程序员把内存控制的权利交给了Java虚拟机,从而可以在编码时享受自动内存管理.但另一方面一旦出现内存泄漏和溢出等问题,就 ...
- JVM自动内存管理-Java内存区域与内存溢出异常
摘要: JVM内存的划分,导致内存溢出异常的可能区域. 1. JVM运行时内存区域 JVM在执行Java程序的过程中会把它所管理的内存划分为以下几个区域: 1.1 程序计数器 程序计数器是一块较小的内 ...
- JVM自动内存管理机制——Java内存区域(下)
一.虚拟机参数配置 在上一篇<Java自动内存管理机制——Java内存区域(上)>中介绍了有关的基础知识,这一篇主要是通过一些示例来了解有关虚拟机参数的配置. 1.Java堆参数设置 a) ...
- JVM自动内存管理机制——Java内存区域(上)
一.JVM运行时数据区域概述 Java相比较于C/C++的一个特点就是,在虚拟机自动内存管理机制的帮助下,我们不需要为每一个操作都写像C/C++一样的delete/free代码,所以也不容易出现内存泄 ...
- Java虚拟机笔记(五):JVM中对象的分代
为什么要分代 为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能.你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我们要找到哪些对象没用, ...
随机推荐
- pta第三阶段题目集
(1)前言 pta第三阶段作业中,主要包含了如下的主要内容: 1.全程贯穿了课程设计的程序,每一次都是上一次的迭代和修改,难度较大,中间涉及到先是类与类之间的多态和继承关系,后面的修改中,转变为了组合 ...
- 一文搞懂什么是 API
在我学习软件开发之前,API 听起来像是一种啤酒(IPA,印度淡色艾尔).如今我经常使用这个术语,事实上最近我还尝试在酒吧里点了一个 API,结果酒保给了我一个: 404 资源未找到的回应 无论是在科 ...
- 相较于Scrum, 我更推崇精益Kanban,帮助团队建立价值交付流,识别瓶颈问题
最近在学习实践精益Kanban方法,结合自己团队实践Srum的经历,整理些资料二者的差异.相较于Scrum, 我更推崇精益Kaban. Agile是一套理论和原则,就像天边的北极星.Devops是一种 ...
- 用字符串表达式执行引擎消除掉if else if
背景 最近我搞了个微信机器人,@机器人 xxx 这样来发送命令 能拿到的信息有,消息内容,消息发送人,消息所在的群id等 需要根据消息内容或者消息发送群id等不同的条件组合来决定走哪个处理逻辑. 简单 ...
- windows CMD命令的一些使用方法及注意事项
windows CMD命令的一些使用方法及注意事项 转载请著名出处:https://www.cnblogs.com/funnyzpc/p/17572397.html 一.执行路径或参数带中文.空格.特 ...
- 行行AI人才直播第12期:风平智能创始人林洪祥《AI数字人的技术实践和商业探讨》
行行AI人才是博客园和顺顺智慧共同运营的AI行业人才全生命周期服务平台. 歌手孙燕姿凭借AI翻唱席卷各大视频平台.有视频博主用AI技术复活已故的奶奶,并且与之对话缅怀亲人填补遗憾.更有国外网红通过GP ...
- Linux 软件包:lvm
lvm LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制. Linux用户安装Linux操作系统时遇到的一个常见的难以决定的 ...
- chrome pre 自动换行
问题引出 当我想要使用chrome的打印功能生成一份关于md的pdf版本的时候发现有的代码块没有自动换行,生成的PDF没有自动换行,导致部分信息无法阅读 处理方式 把有自动换行的部分处理一下,在md文 ...
- 基于Go编写一个可视化Navicat本地密码解析器
前提 开发小组在测试环境基于docker构建和迁移一个MySQL8.x实例,过程中大意没有记录对应的用户密码,然后发现某开发同事本地Navicat记录了根用户,于是搜索是否能够反解析Navicat中的 ...
- 解锁Spring组件扫描的新视角
本文分享自华为云社区<Spring高手之路10--解锁Spring组件扫描的新视角>,作者: 砖业洋__. 首先,我们将探讨一些Spring框架中IOC(Inversion of Cont ...