JVM基础(12)——G1调优

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO

联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬

学习必须往深处挖,挖的越深,基础越扎实!

阶段1、深入多线程

阶段2、深入多线程设计模式

阶段3、深入juc源码解析

阶段4、深入jdk其余源码解析

阶段5、深入jvm源码解析

一、简介

本章和下一章,我们将通过一个实际案例来讲解如何针对G1进行JVM参数调优。G1的优化思想和“ParNew+CMS”是类似的,我们将通过案例,按照G1的垃圾回收过程,逐步优化。

还是先来看下案例的背景,把整个系统的核心业务流程、峰值流量、内存使用模型梳理清楚。

1.1 案例背景

假设现在有一个在线教育平台,日活用户几十万,其核心业务流程就是:用户浏览 -> 选择课程 -> 下单付费 -> 选课排课。这样一个流程,几乎没什么并发度,这种在线教育系统,高峰期一般在晚上的2~3个小时内,占据全天流量的99%,此时几十万用户会在这集中的2-3个小时内进行在线学习。

1.2 内存使用模型估算

交代完了背景,我们再来估算下高峰时期的系统内存使用模型:

我们假设有60万用户会在晚间3个小时内集中访问系统,那么就是每小时20万用户。这20万用户每人每分钟会在平台上进行1次互动操作,那么20万用户1小时内总共进行1200万次互动操作,平均每秒大概3000次互动操作。

也就是说,我们的在线教育系统需要 能够承载每秒3000次并发请求 。根据经验,4核8G的机器抗个每秒600并发请求没有问题,所以我们一 共部署5台4核8G的机器 。

我们假设一次请求产生的对象大小为5KB,那一秒钟600次请求总共产生3MB对象,一分钟就是18MB对象。

二、G1调优

2.1 初始状态

我们先来看下G1的初始内存布局,采用4核8G的机器,给Java堆空间分配4G内存,其中新生代初始占比5%(200MB),最大60%,每个Java线程的栈内存占1MB,元数据区(永久代)的内存为256MB,如下图:

预期停顿时间,我们采用默认值200ms,即希望每次触发GC时,系统停顿时间不超过200ms,可以通过参数-XX:MaxGCPauseMills设置。

此时,JVM的参数配置如下:

-Xms:4096M -Xmx:4096M -Xss1M -XX:PermSize=256M -XX:MaxPermSize=256M -XX:UseG1GC -XX:G1NewSizePercent=5 -XX:G1MaxNewSizePercent=60 -XXMaxGCPauseMills=200

-XX:G1NewSizePercent用来设置新生代的初始占比, -XX:G1MaxNewSizePercent用来设置新生代的最大占比。初始状态下,每个Resion为2MB,新生代一共100个Region。

2.2 新生代对象分配

系统运行后,会不断的在新生代的Eden区分配对象,按照之前的计算,每秒分配3MB对象,那么1分钟左右就会将塞满100个Region,大约200MB:

新生代的大小是在5%~60%之间动态变化的,那是否直到新生代占据了60%的Region后,才会触发新生代的GC?

显然不是的,G1的新生代GC触发机制如下:随着新生代Region的不断分配, G1会动态监测每个Region的回收价值,当它发现新生代的某些Region的总回收时间差不多接近预期停顿时间时,就会触发一次新生代GC 。

举个例子,假设上述的在线教育系统,G1回收掉300个Region需要200ms,接近“预期停顿时间”。那么当最初的100个Region占满后,G1会判断,如果此时进行回收仅需要几十ms,远小于200ms,新生代频繁GC是不好的,还不如再等会儿,于是会给新生代再增加些Region,然后继续在里面分配对象:

然后系统继续运行,直到300Region都快占满了,此时GC评估下总体回收时间,接近200ms,那么这个时候就可能触发一次新生代的GC,从而保证了GC时间在“预期停顿时间”范围内。

事实上,G1到底会分配多少Region给新生代,多久触发一次新生代GC,每次GC耗费多长时间,这些都是不确定的,必须通过一些工具去查看系统实际运行情况才能知道,这块我们后续实战篇中会进行讲解。

2.3 新生代GC优化

G1是非常适合大内存的机器的,所以应该给JVM分配足够的Java堆内存,然后设置合理的预期停顿时间。

-XX:MaxGCPauseMills这个参数设置太小,就会导致G1对新生代进行频繁GC,虽然每次GC的停顿时间很短。如果这个参数设置太大,那么G1会等到积累了很多对象后一次性回收,此时一次新生代GC的停顿时间可能达到几百毫秒,但是GC的频率很低。

所以,-XX:MaxGCPauseMills参数的设置,需要结合系统压测工具、GC日志、内存分析工具综合考虑,既然保证系统的GC频率不会太高,也要保证每次GC的停顿时间不会太长。后续实战篇,我们会详解具体分析的方法。

2.4 Mixed GC优化

当老年代的Region数量达到堆内存的45%时(通过参数-XX:InitiatingHeapOccupancyPercent可以配置),会触发一次 混合回收(Mixed GC) ,即对新生代和老年代一起回收。

我们之前已经讲解过了G1中对象进入老年代的几个条件:

  • 对象躲过了多次GC,达到一定的年龄(-XX:MaxTenuringThrehold参数设置);
  • 符合动态年龄判断规则,即某次新生代GC后,各年龄存活对象的累加大小超过了Survivor的50%;

所以,对于Mixed GC的优化,核心思路还是尽量减少对象进入老年代。优化方式主要还是调整-XX:MaxGCPauseMills这个参数,在保证新生代GC别太频繁的同时,还要考虑每次GC过后存活对象的大小,避免存活对象太多太快进入老年代,频繁触发Mixed GC。

到底如何优化-XX:MaxGCPauseMills这个参数,涉及大量工具,我们在后续的实战篇系列中再详细分析。

三、总结

截止本章为止,我们已经深入讲解了JVM的内存模型、垃圾回收机制,以及“ParNew+CMS”和G1垃圾回收器的原理,并结合案例讲解了JVM的基本调优思路和步骤。

下一章开始,我们将进入实战系列,通过各种实际案例,讲解如何真正进行线上环境的JVM调优,包括各类工具的使用以及如何通过JVM日志分析问题。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

BitMap源码解析

文章目录 前言数据结构添加与删除操作 JDK中BitSet源码解析重要成员属性初始化添加数据清除数据获取数据size和length方法集合操作:与、或、异或优缺点 前言 为什么称为bitmap? bitmap不仅仅存储介质以及数据结构不同于hashmap,存储的key和v…

没啥特长又想搞钱的进:2024副业小项目推荐

利用副业赚钱,绝对不是找个项目就做那么简单。实际上,网上很多副业项目都是看着高大上,做起来还不如送外卖、打零工实在。思路决定出路,你需要的不是具体的副业项目,你需要的是副业思维。 思维一;经验的二次利用比如你…

【iOS】数据持久化(四)之FMDB基本使用

正如我们前面所看到的,原生SQLite API在使用时还是比较麻烦的,于是,开源社区就出现了一系列将SQLite API进行封装的库,其中FMDB的被大多数人所使用 FMDB和SQLite相比较,SQLite比较原始,操作比较复杂&#…

Unity摇杆+键鼠控制位移、旋转

1、位移 首先我们找到两张图片,一个大圆一个小圆,像这样: 结构是这样的: 然后,新建一个场景,用胶囊去做玩家,摄像机在胶囊下,并且在场景中放两个cube作为参照物 像这样搭好后&#…

【电源专题】案例:在EN脚加个电阻就能解决电源下电输出振荡?

案例背景:在某产品上使用一颗升压芯片发现下电输出波形振荡,但此产品并不是第一个使用此升压芯片的。早先此升压芯片使用在其他产品上没有报过这个异常。 分析方法:使用DEMO板,查看标准DEMO板无异常。将异常板卡上的参数与全部换到DEMO板上发现同样存在异常。 推测原因:…

学习就要从简单的开始嘛,开始学一个个人博客吧

做一个个人博客第一步该怎么做? 好多零基础的同学们不知道怎么迈出第一步。 那么,就找一个现成的模板学一学呗,毕竟我们是高贵的Ctrl c v 工程师。 但是这样也有个问题,那就是,那些模板都,太!…

基于ssm的校园预点餐系统(有报告)。Javaee项目。ssm项目。

演示视频: 基于ssm的校园预点餐系统(有报告)。Javaee项目。ssm项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Spring Sp…

【Databend】行列转化:一行变多行和简单分列

文章目录 数据准备和需求生成序列和分隔函数根据分隔符变多行JSON 数据简单分列总结 数据准备和需求 行列转化在实际工作中很常见,其中最常见的有一行变多行,有下面一份数据: drop table if exists fact_suject_data; create table if not …

Linux常用命令之tar解压缩文件、uname -a查看系统信息

tar:解压缩 *.Z-------------------compress程序压缩的文件*.gz------------------gzip程序压缩的文件*.bz2-----------------bzip2程序压缩的文件*.tar------------------tar程序打包的数据,并没有压缩*.tar.gz---------------tar程序打包的文件,其中经过gzip的压…

蓝牙音视频远程控制协议(AVRCP) AV/C command格式介绍

零.声明 本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下: 第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些概念,产生背景,发展轨迹,市面蓝牙介绍,以及蓝牙开发板介绍。 第二篇:Trans…

关于lombok插件的使用

在 idea 中有个非常好用的插件 lombok,可以用来在实体类中自动生成 get 、set以及构造方法,下面我们来学习如何使用它: 首先打开settings,按照以下方法: 到 marketplace 中搜索 lombok,我这里已经安装好了…

探索短链接:让网络分享更便捷

短链接是一种将长网址缩短为简洁形式的编码,它在互联网领域具有广泛的应用。本文将从多个方面介绍短链接的原理、类型、优势及应用场景,帮助您深入了解这一重要的网络技术。 短链接 | 一个覆盖广泛主题工具的高效在线平台(amd794.com) https://amd794.…

JavaScript数组全攻略

🧑‍🎓 个人主页:《爱蹦跶的大A阿》 🔥当前正在更新专栏:《VUE》 、《JavaScript保姆级教程》、《krpano》 ​ ​ 目录 ✨ 前言 数组的定义 创建数组 1. 数组字面量 2. Array构造函数 3. Array.of() 4. Arra…

Web后端开发

一、Maven 1.1 简介 1.2 作用 1.3 流程 通过各种插件实现项目的标准化构建。 1.4 安装 1.5 配置环境 1.5.1 当前工程环境 1.5.2 全局环境 1.6 创建 Maven项目 1.7 导入项目 1.8 依赖管理 1.8.1 依赖配置 1.8.2 依赖传递 pom.xml——右键——Diagrams——show dependen…

Maya参考图的导入和层的应用

参考视频:08.参考图的导入和层的应用_哔哩哔哩_bilibili 前视图/右视图模式下导入图形 创建图层 锁定后可以避免图片位置的移动 前视图和右视图要根据参照物对齐 与模型保持一定距离,同时把该参照图添加到图层中 模型可以添加到图层2中

window-nginx注册服务(nginx-1.24.0.zip)

window-nginx注册服务(nginx-1.24.0.zip) 1、下载当前windows版nginx的稳定版本。 https://nginx.org/en/download.html 2、解压到指定目录中,这里解压到D盘根目录,D:\nginx-1.24.0 3、管理员打开命令行,可先进行相关操作,看一下n…

NLP论文阅读记录 - 2023 | EXABSUM:一种新的文本摘要方法,用于生成提取和抽象摘要

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.相关工作三.本文方法四 实验效果4.1数据集4.2 对比模型4.3实施细节4.4评估指标4.5 实验结果4.6 细粒度分析 五 总结思考 前言 EXABSUM: a new text summarization approach for generating ex…

生产数据不备份,用时两行泪

背景:项目使用pg一主一从,因慢sql导致查询慢,所以想从原本的4核加到16核,联系好运维后,打算先从从库开始操作,机器上的pgsql都正常关闭,然后停止,关机,扩容一切都很顺利&…

gpu显卡简介

一、目录 1.基本常用参数 2. nvidia 显卡基本了解(基本简介) 3. 显卡查看算力 4. 显卡算力、驱动版本(Driver Version)、CUDA Toolkit(CUDA Version)、PyTorch版本之间的关系 5. 显卡安装流程 6. NVIDIA显卡简介 二、实现 基本常…

使用ElementUI的el-tab+vxe-table表格+复选框选择

效果: 功能:首先进来是全部清空的状态的 点击左边选择不同项右边会实时发送接口获取数据填充表格 复选的内容可以保留显示,比如A的1勾选后切换到B再切换回来A的1仍然是勾选状态 说实话官网的setCheckboxRow方法我实现不了,这里…