G1与ZGC

G1垃圾收集器(-XX:+UseG1GC)详解

在这里插入图片描述G1(Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器。以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特性。
G1把内存区域划分为小格子(Region),最多可以有2048个Region,一般Region大小等于堆大小除以2048,比如堆大小为4096M,则Region大小为2M,每个小格子也是有分代概念的。默认年轻代对堆内存的占比时5%,如果堆大小为4096M,那么年轻代占据200M左右的内存,大概时100个Region。一个Region可能之前是年轻代,如果Region进行了垃圾回收,之后可能又会变成老年代,也就是说Region的区域功能可能会动态变化。
G1垃圾收集器对于对象什么时候会转移到老年代根之前讲过的原则一样,唯一不同的是对大对象的处理,G1有专门的大对象存储区Humongous,当放到Eden区时超过50%,则放到Humongous区。
G1收集器一次GC的运作大致分为以下几个步骤:
在这里插入图片描述

  • 初始标记:STW,并记录下gc roots直接能引用的对象,速度很快;
  • 并发标记:并发标记阶段是从GC Root的直接关联对象开始遍历整个对象的过程,这个过程耗时较长,但不需要停顿用户线程,可以与垃圾收集器线程一起并发运行。因为用户线程继续运行,可能会导致已经标记的对象状态发生改变。
  • 最终标记:重新标记阶段就是为了修正并发标记期间因为用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段的时间稍长,远远比并发标记时间短,主要用到三色标记里的增量更新算法啊,做重新标记。
  • 筛选回收:筛选回收阶段首先对各个Region的回收价值和成本进行排序,根据用户所期望的GC停顿时间来制定回收计划,比如说老年代此时有1000个Region都满了,但是因为预期停顿时间,本次垃圾回收只能停顿200毫秒,那么通过之前回收成本计算得知,可能回收其中800个Region刚好需要200ms,那么就只会回收800个Region。筛选回收不一定回收所有的。底层用了复制算法,即区域如果有20%的非垃圾对象,会将其复制到相邻区域,剩下的清理掉,复制很少碎片。

G1收集器在后台维护了一个优先列表,每次根据允许的收集时间,优先选择回收价值最大的Region,比如一个Region花200ms能回收10M垃圾,另外一个Region花50ms能回收20M垃圾,在回收时间有限情况下,G1当然会优先选择后面这个Region回收。

最终标记G1用的原始快照,CMS用的增量更新,最大停顿时间可设,使用的类似标记整理算法,底层用复制算法。如果最多只能回收4个Region,提前做计算,回收时间短的Region。存活的对象越多,回收垃圾的效益比越低。
G1垃圾收集分类:
Yong GC:触发Yong GC时,会计算判断这次GC回收的时间是不是接近200ms,如果接近做Yong GC,如果没有则丢到新区域。
Mixed GC:老年代的堆根据-XX:InitiatingHeapOccupancyPercent设定的值触发,回收所有的年轻代和部分Old,(根据最大停顿时间回收效益比,可能只回收一部分),大对象区域也会回收。主要使用复制算法,拷贝过程中如果发现没有足够空的region能够承载拷贝对象就会触发一次Full GC。
Full GC:底层只用单线程回收(老年代没有足够的Region供拷贝时触发)。
每个Eden区都有一个卡表,记录那块区域的引用,每个小的放个都有一个卡表,记录别的老年代区域对当前区域年轻代的引用。

G1垃圾收集器优化建议

        假设参数-XX:MaxGCPauseMills设置的值很大,导致系统运行很久,年轻代可能都占用了堆内存的60%了,此时才出发年轻代gc。
        那么存活下来的对象可能就会 很多,此时就会导致Survivor区域放不下那么多对象,就会进入老年代。
        这里核心还是在与调节-XX:MaxGCPauseMills这个参数的值,在保证他的年轻代GC别太频繁的同时,还得考虑每次GC过后的存活对象有多少,避免存活对象太多快速进入老年代,频繁触发mixed gc.

ZGC收集器(-XX:+UseZGC)

ZGC目标

在这里插入图片描述

  • 支持TB量级的堆:最大支持 16TB 的大堆,最小支持 8MB 的小堆
  • 最大GC停顿时间不超10ms
  • 奠定未来GC特性的基础
  • 最糟糕的情况下吞吐量会降低15%:跟 G1 相比,对应用程序吞吐量的影响小于 15 %

ZGC内存布局

ZGC是一款基于Region内存布局的,使用了读屏障、颜色指针等技术来实现可并发的标记-整理算法,以低延迟为首要目标的垃圾收集器。
ZGC的Region有大、中、小三个容量:

  • Small Region:容量固定为2M,用于存放小于256KB的小对象。
  • Medium Region:容量固定为32M,用于存放大于等于256K但小于4M的对象。
  • Large Region:容量不固定,可动态变化,但必须是2MB得倍数,用于存放大于等于4M的对象。大型Region在ZGC的实现中是不会被重分配的,因为复制一个大对象的代价非常昂贵。
    在这里插入图片描述

NUMA-aware

NUMA就是Non Uniform Memory Access Architecture,UMA模式内存只有一块,存在争抢问题,有争抢就会有锁,影响效率,而且CPU核数越多竞争越激烈。NUMA每块CPU对应一块内存,且这块内存在主板上离这个CPU是最近的,每个CPU优先访问这块内存,那效率自然就提高了。

读屏障

读屏障类似于 Spring AOP 的前置增强,是 JVM 向应用代码中插入一小段代码,当应用线程从堆中读取对象的引用时,会先执行这段代码。注意:只有从堆内存中读取对象的引用时,才会执行这个代码。下面代码只有第一行需要加入读屏障。

Object o = obj.FieldA
Object p = o //不是从堆中读取引用
o.dosomething() //不是从堆中读取引用
int i =  obj.FieldB //不是引用类型

读屏障在解释执行时通过 load 相关的字节码指令加载数据。作用是在对象标记和转移过程中,判断对象的引用地址是否满足条件,并作出相应动作。如下图:
在这里插入图片描述

颜色指针

在这里插入图片描述
每个对象都有64位指针,这64位被分为:

  • 16位:预留给以后使用
  • 1位:Finalizable标识,此位与并发引用处理有关,它标识这个对象这能通过finalizer才能访问
  • 1位:Remapped标识,设置后,对象未指向relocation set中(relocation set表示需要GC的Region集合 )
  • 1位:Marked1标识
  • 1位:Marked0标识,和Marked1都是标记对象用于辅助GC
  • 44位:对象的地址(所以它可以支持2^44=16T内存)

GC过程

在这里插入图片描述

  • 初始标记:从 GC Roots 出发,找出 GC Roots 直接引用的对象,放入活跃对象集合,这个过程需要 STW,不过 STW 的时间跟 GC Roots 数量成正比,耗时比较短
  • 并发标记:与G1一样,并发标记是遍历对象图做可达性分析的阶段,它的初始标记(Mark Start)和最终标记(Mark End)也会出现短暂的停顿,与G1不同的是,ZGC的标记是在指针上而不是在对象上进行的,标记阶段会更新染色指针中的Marked 0、Marked 1标志位。
  • 再标记:并发标记阶段 GC 线程和 Java 应用线程并发执行,标记过程中可能会有引用关系发生变化而导致的漏标记问题。再标记阶段重新标记并发标记阶段发生变化的对象,还会对非强引用(软应用,虚引用等)进行并行标记。
    这个阶段需要 STW,但是需要标记的对象少,耗时很短。
  • 初始转移:转移就是把活跃对象复制到新的内存,之前的内存空间可以被回收。
    初始转移需要扫描 GC Roots 直接引用的对象并进行转移,这个过程需要 STW,STW 时间跟 GC Roots 成正比。
  • 并发转移:重分配是ZGC执行过程中的核心阶段,这个过程要把重分配集中的存活对象复制到新的Region上,并为重分配集中的每个Region维护一个转发表(Forward Table),记录从旧对象到新对象的转向关系。ZGC收集器能仅从引用上就明确得知一个对象是否处于重分配集之中,如果用户线程此时并发访问了位于重分配集中的对象,这次访问将会被预置的内存屏障(读屏障)所截获,然后立即根据Region上的转发表记录将访问转发到新复制的对象上,并同时修正更新该引用的值,使其直接指向新对象,ZGC将这种行为称为指针的“自愈”(Self-Healing)能力。
  • 并发重映射(Concurrent Remap):重映射所做的就是修正整个堆中指向重分配集中旧对象的所有引用,但是ZGC中对象引用存在“自愈”功能,所以这个重映射操作并不是很迫切。ZGC很巧妙地把并发重映射阶段要做的工作,合并到了下一次垃圾收集循环中的并发标记阶段里去完成,反正它们都是要遍历所有对象的,这样合并就节省了一次遍历对象图的开销。一旦所有指针都被修正之后, 原来记录新旧对象关系的转发表就可以释放掉了。
    参考: 12 张图带你彻底理解 ZGC

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/646477.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java常见的面试问题

目录 一、异常 1、 throw 和 throws 的区别? 2、 final、finally、finalize 有什么区别? 3、try-catch-finally 中哪个部分可以省略? 4、try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗&#…

大创项目推荐 题目:垃圾邮件(短信)分类 算法实现 机器学习 深度学习 开题

文章目录 1 前言2 垃圾短信/邮件 分类算法 原理2.1 常用的分类器 - 贝叶斯分类器 3 数据集介绍4 数据预处理5 特征提取6 训练分类器7 综合测试结果8 其他模型方法9 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 基于机器学习的垃圾邮件分类 该项目…

DP读书:在常工院的2023年度总结

DarrenPig的年度总结 这是最好的时代,这是最坏的时代。——狄更斯 这是最好的时代,这是最坏的时代。——狄更斯 这是最好的时代,这是最坏的时代。——狄更斯 一、2023我的感受 不就是2023吗,不就是一年的经历吗,大家…

Spring Boot 集成 API 文档 - Swagger、Knife4J、Smart-Doc

文章目录 1.OpenAPI 规范2.Swagger: 接口管理的利器3.Swagger 与 SpringFox:理念与实现4.Swagger 与 Knife4J:增强与创新5.案例:Spring Boot 整合 Swagger35.1 引入 Swagger3 依赖包5.2 优化路径匹配策略兼容 SpringFox5.3 配置 Swagger5.4 S…

硅像素传感器文献调研(九)3

欧洲X射线自由电子激光器抗辐射像素传感器的设计和初步试验 摘要 目前正在汉堡建造的欧洲X射线自由电子激光器的高强度和高重复率需要硅传感器,该传感器可以在高偏置电压下工作3年,承受高达1 GGy的X射线剂量。在AGIPD合作范围内,研究了由四家…

# [NOI2019] 斗主地 洛谷黑题题解

[NOI2019] 斗主地 题目背景 时限 4 秒 内存 512MB 题目描述 小 S 在和小 F 玩一个叫“斗地主”的游戏。 可怜的小 S 发现自己打牌并打不过小 F,所以他想要在洗牌环节动动手脚。 一副牌一共有 n n n 张牌,从上到下依次标号为 1 ∼ n 1 \sim n 1∼…

如何在Shopee平台上进行选品 :充分利用渠道获取灵感和数据支持

在Shopee平台上进行选品是一个关键的决策过程,它直接影响到卖家的销售业绩和店铺的发展。为了帮助卖家更好地进行选品,Shopee提供了多种渠道来获取灵感和数据支持。下面将介绍一些主要的选品渠道以及如何利用它们来进行选品。 先给大家推荐一款shopee知…

如何快速解决局域网IP冲突问题?连接IP地址冲突如何用代理IP搞定?

随着互联网的普及,局域网已经成为了许多家庭和企业中不可或缺的一部分。然而,局域网中的IP地址冲突问题却时常困扰着用户。一旦出现IP地址冲突,网络连接就会变得不稳定,甚至无法正常上网。那么,如何快速解决局域网IP冲…

[极客大挑战 2019]Upload1

直接上传php一句话木马&#xff0c;提示要上传image 把文件名改成gif并加上gif文件头后&#xff0c;绕过了对image类型的检测&#xff0c;但是提示文件内含有<?&#xff0c;且bp抓包后改回php也会被检测 那我们考虑使用js执行php代码 <script languagephp>eval($_PO…

算力、应用、方案,联想布局全栈AI,以自身制造与供应链范本助力千行百业智能化转型升级

1月23日-24日&#xff0c;联想集团举办主题为“算领AI时代 筑基智能变革”的擎智媒体沙龙和新IT思享会“走进联想”活动。在活动中&#xff0c;联想集团副总裁、中国区首席市场官王传东表示&#xff0c;今年是联想成立40周年&#xff0c;联想已构建了全栈智能布局&#xff0c;将…

WMS仓储管理系统可视化数据看板解决方案

在快节奏的现代商业环境中&#xff0c;有效的仓储管理对于确保供应链的顺畅运作至关重要。随着科技的飞速发展&#xff0c;传统的仓储管理方式已逐渐被数字化、自动化的管理方式所取代。其中&#xff0c;WMS仓储管理系统可视化数据看板作为新兴的仓储管理工具&#xff0c;为仓库…

TCP的连接和关闭的那些事

一、基础概念 1、啥是TCP&#xff1f; 它是面向连接的一种协议&#xff0c;任何数据发送之前都需要建立连接。 2、TCP/IP协议的四层中那一层&#xff1f; TCP位于运输层&#xff0c;详见下图 3、TCP协议的状态机有哪些? 在链接建立和断开不同阶段都有不同的状态&#xf…

Linux 驱动开发基础知识——编写LED驱动程序(三)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…

边裁边招,2024大厂往哪“卷”?

裁员只是大厂踌躇、转型的缩影&#xff0c;无论是林平还是背后的公司、行业&#xff0c;都亟需给未来一个确定的答案。 从2021年冬天开始&#xff0c;大厂裁员的消息有如“击鼓传花”般&#xff0c;不断冲击着圈内外网友们的神经&#xff0c;那可能是“裁员”这个话题自互联网…

css中>>>、/deep/、::v-deep的作用和区别,element-ui自定义样式

文章目录 一、前言1.1、/deep/1.2、::v-deep1.3、>>> 二、区别三、总结四、最后 一、前言 1.1、/deep/ 在style经常用scoped属性实现组件的私有化时&#xff0c;要改变element-ui某个深层元素&#xff08;例如.el-input__inner&#xff09;或其他深层样式时&#xf…

JOSEF约瑟 大容量中间继电器 RXMH2 RK223 067 DC220V 带底座

系列型号 RXMH2 RK 223 067大容量中间继电器&#xff1b; RXMH2 RK 223 068大容量中间继电器&#xff1b; RXMH2 RK 223 069大容量中间继电器&#xff1b; RXMH2 RK 223 070大容量中间继电器&#xff1b; 一、用途 RXMH2系列大容量中间继电器用于工业自动化控制及电力系统二次…

app重新签名之后,teamID会改变吗?

哈喽大家好&#xff0c;我是咕噜美乐蒂&#xff0c;很高兴又见面啦&#xff01; 在iOS和macOS开发中&#xff0c;我们经常需要对应用进行重新签名&#xff0c;以便在发布或测试时更改应用的证书或代理。在重新签名应用程序时&#xff0c;可能会出现teamID变化的情况。本文将探…

冷知识:COS上传文件时可以同步获取文件信息

背景介绍 本文将介绍如何在上传文件到 COS 时同步获取文件信息&#xff0c;如图片的宽高、格式等。 目前&#xff0c;可以通过 COS 上传接口&#xff0c;如 PUT Object、CompleteMultipartUploads 等将文件存储至 COS 存储桶中&#xff0c;我们针对以下三种场景提供上传时同步…

Windows主机Navicat远程连接到Ubuntu18.04虚拟机MySQL

1. 在虚拟机上安装MySQL sudo apt-get install mysql-server sudo apt-get install libmysqlclient-dev 2. 检查安装 sudo netstat -tap | grep mysql 3. 查看默认密码 sudo cat /etc/mysql/debian.cnf 4. 用查看到的密码登录MySQL server&#xff0c;修改root用户的密码 …

javaWebssh宠物基地管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh宠物基地管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用 B/S模式开发。开发环境为TOMCAT7.…