JVM系统优化实践(9):G1垃圾回收器

news2024/11/6 7:06:35

您好,我是湘王,这是我的CSDN博客,欢迎您来,欢迎您再来~


在JDK8及其之前,一直用的都是ParNew+CMS的组合:ParNew负责年轻代的垃圾回收,而由CMS负责老年代的垃圾回收,但会产生Stop the World这个无法避免的问题。

所以为了解决这个问题,出现了G1垃圾回收算法。G1不再区分年轻代和老年代,它可以同时回收年轻代和老年代。总的来说,G1的特点是:将JVM堆拆分为多个大小相等Region。物理上不再划分年轻代和老年代,但逻辑上仍然存在。可以设置垃圾回收的预期停顿时间,例如:1小时内STW时间不能超过1分钟。

G1的核心设计思路是:

1、追踪每个Region中的回收价值,例如:Region中有多少垃圾?又需要花费多少时间回收?

2、得到预期卡顿时间与已卡顿时间的差值,对每个Region的“回收价值”进行估算;

3、在尽可能短的时间内回收尽可能多的垃圾。

并且如果之前的GC已经造成了系统卡顿,当又要进行GC的时候,就会评估回收哪个Region中的垃圾更合理。很明显:花费1s回收10M垃圾,肯定不如花费200ms回收20M垃圾性价比高。

所有Region的内容都由G1分配,同一个Region,要么是年轻代,要么是老年代。而且同一个Region,不能既是年轻代,又是老年代。所以年轻代区域和老年代区域是动态变动的,没有固定的大小和范围。

可以通过JVM参数-XX:+UseG1GC来启用G1。

1、单个Region大小 = JVM堆大小 / 2048(最大值,且为默认值)

2、单个Region大小必须是2的指数倍数,如2M,4M,8M等......,因为计算机是二进制,这样便于处理;

3、可以使用-XX:G1HeapRegionSize=8M调整单个Region大小;

4、默认年轻代= JVM堆 × 5%,可使用-XX:G1NewSizePercent=10来调节;

5、年轻代占比默认60%,可使用-XX:G1MaxNewSizePercent=10来调节。

虽然JVM已经从ParNew+CMS切换到了G1,但-XXSurvivorRatio=8仍然有用。例如100个Region,那么如果80个是Eden区,那么S0、S1会各占10个。

G1NewSizePercent和G1MaxNewSizePercent为实验属性,需要通过-XX:+UnlockExperimentalVMOptions打开。当年轻代所用Region空间之和 ≥ -XX:G1MaxNewSizePercent设置的值时,就会触发G1的年轻代GC。年轻代的GC仍然采用的是古老的复制算法。

-XX:MaxGCPauseMillis=200指定系统卡顿时间(默认200ms),超过这个时间,无论垃圾回收是否终止,都会强行结束。

G1追踪每个Region的回收价值的方式,其实和ParNew类似:年轻代“躲过”-XX:MaxTenuringThreshold指定的次数。

G1的动态年龄判定规则:年轻代GC后,全部存活对象大小总和超过Survivor × 50%,则年龄最大的一批存活对象全部进入老年代。也就是有一批Region的属性由年轻代切换为老年代。

对于大对象的处理,G1提供了专门的Region存放大对象:

对象大小>单个Region大小 × 50%,就是大对象。如果单个Region放不下,可能会横跨多个Region存放,GC时,也会连带大对象一起进行回收。

G1的特点就先说这么,后面继续说G1的混合回收。


感谢您的大驾光临!咨询技术、产品、运营和管理相关问题,请关注后留言。欢迎骚扰,不胜荣幸~

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

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

相关文章

脑机接口科普0016——独立BCI与非独立BCI

本文禁止转载!!!! 所谓的“独立BCI”与“非独立BCI”仅仅是BCI系统中的一个术语。本章主要是介绍一下这两个术语。 这两个术语是由Wolpaw在2002年提出来的。 独立BCI是指不依赖于中枢神经系统的的输出。 非独立BCI是指那种依赖…

工作5年了,你竟然还不会应用优雅停机?

事情是这样的,小明是一个工作五年的老程序员,半秃着的头已经彰显了他深不可测的技术实力。 这一天,小明收到了领导给过来的一个需求。 领导对小明说:“小明啊,你工作五年了,这个需求我交给你一个人负责很是…

开源写作平台WriteFreely(基础篇)

什么是 WriteFreely ? WriteFreely 是一个专为作家打造的干净、极简主义的出版平台。可以用来创建一个博客,在您的组织内分享知识,或者围绕共同的写作行为建立一个社区。 这里值得一提的是, WriteFreely 支持 ActivityPub 协议,这…

逐句回答,流式返回,ChatGPT采用的Server-sent events后端实时推送协议Python3.10实现,基于Tornado6.1

善于观察的朋友一定会敏锐地发现ChatGPT网页端是逐句给出问题答案的,同样,ChatGPT后台Api接口请求中,如果将Stream参数设置为True后,Api接口也可以实现和ChatGPT网页端一样的流式返回,进而更快地给到前端用户反馈&…

剑指offer在排序数组中的二分法应用总结

排序数组中的搜索问题,首先想到 二分法 解决,本篇详细解析关于二分法边界的问题。 目录 一、二分法概念 二、剑指Offer53.在排序数组中查找数字 三、在排序数组中查找元素的第一个和最后一个位置 一、二分法概念 二分法就是在一个有序递增的数组中进行…

使用RabbitMQ发送短信

1、在项目中分别创建模块financial-core、financial-mq、financial-sms&#xff0c;如图&#xff1a; 模块构成 <modules><module>financial-common</module><module>financial-base</module><module>financial-core</module><mo…

剑指 Offer 66. 构建乘积数组

摘要 剑指 Offer 66. 构建乘积数组 一、左右乘积列表 我们不必将所有数字的乘积除以给定索引处的数字得到相应的答案&#xff0c;而是利用索引左侧所有数字的乘积和右侧所有数字的乘积&#xff08;即前缀与后缀&#xff09;相乘得到答案。对于给定索引i&#xff0c;我们将使…

Qt广告机服务器(上位机)

目录功能结构adSever.promain.cpptcp_MSG.h 共用Tcp传输信息adsever.h 服务器adsever.cpp 服务器addate.h 时间处理addate.cpp 时间处理adtcp.h 客户端Socket处理adtcp.cpp 客户端Socket处理client.h 客户端信息类client.cpp 客户端信息类admsglist.h 信息记录模块admsglist.cp…

jupyter的使用

1.安装 安装过程看这篇记录。 安装 2.如何启动 环境搭建好后&#xff0c;本机输⼊jupyter notebook命令&#xff0c;会⾃动弹出浏览器窗⼝打开 Jupyter Notebook # 进⼊虚拟环境 workon ai(这个是虚拟环境的名称) # 输⼊命令 jupyter notebook本地notebook的默认URL为&…

宝藏级BI数据可视化功能|图表联动分析

在浏览其他人的BI数据可视化报表时&#xff0c;经常会发现这样的一个现象&#xff0c;点一下上一张数据可视化图表中的某个门店&#xff0c;下一张图表将立即针对该门店展开数据可视化分析。这是什么效果&#xff1f;怎么实现&#xff1f;BI软件中还有多少宝藏级BI数据可视化功…

Oracle表分区的创建、新增、拆分

Oracle中为了方便管理、查询数据当数据量大于500w或者2G时最好用分区表&#xff0c;常见的一种是使用时间作为分区。 分区表添加新的分区有 2 种情况&#xff1a; (1) 原分区里边界是 maxvalue 或者 default。 这种情况下&#xff0c;我们需要把边界分区 drop 掉&#xff0c;加…

好的计划是成功的一半,如何制定项目计划?

好的计划是成功的一半&#xff0c;不好的计划会使项目一步步失败&#xff0c;任何事情&#xff0c;要取得成功&#xff0c;离不开一个科学合理的计划。 计划是为了实现项目所提出的各项目标&#xff0c;每一项任务都是针对某一个特定目标的&#xff0c;因此&#xff0c;一项计划…

计算机视觉手指甲标注案例

关键点标注是指识别和标注图像或视频中特定的相关点或区域的过程。在机器学习行业&#xff0c;它经常被用来训练计算机视觉模型&#xff0c;以执行诸如物体检测、分割和跟踪等任务。 关键点注释可用于以下应用&#xff1a; 面部关键点检测&#xff1a;识别图像中人脸上的眼睛…

12.SpringSecurity中OAuth2.0的实现

一、OAuth2.0介绍 1.概念说明 https://oauth.net/2/ 先说OAuth&#xff0c;OAuth是Open Authorization的简写。   OAuth协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAuth的授权不会使第三方触及到用户的帐号信息&#xff08;如…

[league/glide]两行代码实现一套强大的图片处理HTTP服务

只要两行代码&#xff0c;就能实现类似对象存储云提供的基于参数的图片处理&#xff0c;比如裁剪、放大、水印、旋转等等。 我们经常使用第三方的对象存储服务&#xff0c;比如七牛云或阿里云&#xff0c;他们都提供了“智能媒体服务”&#xff0c;其实就是在链接上加上各种参…

Vue:(三十四)Vuex及其属性

Vuex的学习更多是代码了&#xff0c;所以就放在一起了&#xff0c;接下来大概说一下吧。概念&#xff1a;专门在Vue中实现集中式状态&#xff08;数据&#xff09;管理的一个Vue插件&#xff0c;对Vue应用中多个组件的共享状态进行集中式的管理&#xff08;读/写&#xff09;&a…

【Git】P4 Git 远程仓库(2)克隆,抓取与拉取

Git 克隆&#xff0c;拉取与抓取git 克隆 clonegit 拉取 fetch、合并 mergegit 抓取 pullgit 克隆 clone 克隆的使用场景很少&#xff0c;举个例子&#xff0c;老板给你一个任务&#xff1a;这个服务的 bug 由你来解决&#xff1a;那么你的第一步就是从云端克隆到本地&#xf…

VMware 搭建 Linux 系统

前言 使用 VMware Workstation 17 Pro 基于CentOS 7.9 镜像搭建 K8S 一主多从本地虚拟服务器环境 主机名IP配置k8s-master192.168.179.214核CPU 8G内存 20G硬盘k8s-node1192.168.179.224核CPU 8G内存 20G硬盘k8s-node2192.168.179.234核CPU 8G内存 20G硬盘VMware 下载安装 VMw…

Spark读取JDBC调优

Spark读取JDBC调优&#xff0c;如何调参一、场景构建二、参数设置1.灵活运用分区列实际问题&#xff1a;工作中需要读取一个存放了三四年历史数据的pg数仓表&#xff08;缺少主键id&#xff09;&#xff0c;需要将数据同步到阿里云 MC中&#xff0c;Spark在使用JDBC读取关系型数…

案例13-localStorage的使用分析

1、背景介绍 大家看下边的逻辑是否能看明白呢&#xff1f; 前端在调用后端接口获取某一个人的评论次数、获赞次数、回复次数。调用之后判断后端返回过来的值。如果返回回来的值是0的话&#xff0c;从缓存中获取对应的值&#xff0c;如果从缓存中获取的评论次数为空那么其他两…