首页 > 系统相关 >Java虚拟机(JVM):第五幕:自动内存管理 - HotSpot算法细节以及低延迟垃圾收集器

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

时间:2023-07-13 09:45:39浏览次数:41  
标签:Java 映射 收集器 虚拟机 并发 内存 ZGC 引用

一、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,映射,收集器,虚拟机,并发,内存,ZGC,引用
From: https://www.cnblogs.com/kuangmeng/p/17539404.html

相关文章

  • Java 继承、super() 关键字使用、super 和 this的区别
    Java继承、super()关键字使用、super和this的区别1.继承继承是子类使用extends关键字来继承父类获取相同的属性和方法,可以解决代码的复用性问题继承的基本思想:父类的构造器进行父类初始化,子类的构造器进行子类的初始化继承使用细节:子类在使用父类的方法或属性时,不能......
  • Java 封装
    Java封装1.封装封装就是把抽象的数据和方法进行封装,数据在内部通过授权的方法来进行数据的操作,例如遥控器通过按钮对电视机的操作。封装的好处:隐藏实现细节校验并保护数据的安全封装的三步骤:对属性进行私有化设置公共的set方法设置该属性,可在内部进行业务逻辑判断......
  • Java关于方法的一些总结
    方法的一些总结1、方法的定义方法包含一个方法头和一个方法体。下面是一个方法的所有部分:修饰符:修饰符,这是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。返回值类型:方法可能会返回值。returnValueType是方法返回值的数据类型。有些方法执行所需的操作,但没有......
  • Java面试题全集(一)
    JDK、JRE、JVM之间的区别JDK(JavaSEDevelopmentKit),Java标准开发包,它提供了编译、运⾏Java程序所需的各种⼯具和资源,包括Java编译器、Java运⾏时环境,以及常⽤的Java类库等JRE(JavaRuntimeEnvironment),Java运⾏环境,⽤于运⾏Java的字节码⽂件。JRE中包括了JVM以及JVM⼯作......
  • Java学习day02:流程控制1
    我在B站上大学......
  • 如何掌握JavaScript面向对象开发相关模式?
    本文学习目标:理解面向对象开发思想掌握JavaSciprt面向对象开发模式不管是JavaScript高级还是针对JavaScript语言本身的一个进阶学习,在开始之前我们先来对JavaScript相关知识点做一个回顾总结。一、JavaScript是什么1.1解析执行:轻量级解释型的语言特点:动态、头等函数(First-classFu......
  • Java面试高频技术线程池,源码笔记答案全纪录
    有一定的java基础(线程),尤其是正要或正准备找工作的童鞋如果想在众多面试者中脱颖而出,你就需要多准备一些知识点,多刷一些面试题。而对于企业而言,有这么多的选择那我们就提高面试门槛,可能我需要的仅仅是CRUD的初中级,但我也希望你能了解JVM、多线程、Spring源码、Sql优化、分布......
  • Java TreeMap 介绍与使用
    介绍TreeMap是Java集合框架中的一个类,它实现了SortedMap接口,可以存储键值对,并按照键的自然顺序或者指定的比较器进行排序。TreeMap的底层是一棵红黑树,这是一种自平衡的二叉搜索树,可以保证在插入,删除,查找等操作中的时间复杂度为O(logn)。使用要使用TreeMap,我们需要导入......
  • 你知道Java是世界第一的秘密吗?
    说Java你会说他就是一个计算机语言吧,对它并不是很了解。看完下面的文字,你肯定就不会说你对Java不了解了。Java从1995年诞生到现在已经21年了,他的辉煌你知道吗?Java一直在改变你的生活!傲居语言排行榜榜首Java在TIOBE上的位置TIOBE编程语言社区排行榜是编程语言流行趋势的一个指标,每......
  • JAVA 数字类型 的使用和选择
    JAVA语言中有八种基本的数字类型,分别是byte、short、int、long、float、double、char和boolean。这些类型的区别在于它们所占用的内存空间和表示的范围不同。在使用和选择数字类型时,需要考虑以下几个因素:数字的大小:如果数字很小,可以使用byte或short类型,它们占用1个字......