JVM基础(12)——G1调优

news2024/9/28 13:23:17

作者简介:大家好,我是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日志分析问题。

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

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

相关文章

解释程序基本原理

解释程序基本原理 1、解释程序的基本结构2、高级语言编译与解释方式的比较 语言处理程序是一类系统软件的总称,其主要作用是将高级语言或汇编语言编写的程序翻译成某种机器语言程序,使程序可在计算机上运行。语言处理程序主要分为汇编程序、编译程序和解…

【详解】结构体的内存对齐(每步配图)

目录 引言: 为什么存在结构体内存对齐? 结构体内存对齐规则: 练习一: 测试代码: 结果如下: 第二个练习:结构体的嵌套问题 测试代码: 代码结果如下: 两个关于结构体的易错…

thinkphp递归实现无限级子分类合并上级children

//设别分类列表public function getCategoryList(){$list = Db::name(categorys)->select(

在vue中实现树形结构的表格,以及对数据结构的处理

需求:有一些告警数据,如果他们的计划编码相同则实现折叠效果,单击某行数据可以进行关闭,状态发生改变,关闭以后按钮禁用。 实现效果:目前所有告警消息都被关闭,如果未被关闭则可以进行关闭 实现…

leetcode 2645. 构造有效字符串的最少插入数-python

题目: 给你一个字符串 word ,你可以向其中任何位置插入 “a”、“b” 或 “c” 任意次,返回使 word 有效 需要插入的最少字母数。 如果字符串可以由 “abc” 串联多次得到,则认为该字符串 有效 。 解题方法 1.先判断字符串是否…

李沐之神经网络基础

目录 1.模型构造 1.1层和块 1.2自定义块 1.3顺序块 1.4在前向传播函数中执行代码 2.参数管理 2.1参数访问 2.2参数初始化 3.自定义层 3.1不带参数的层 3.2带参数的层 4.读写文件 4.1加载和保存张量 4.2加载和保存模型参数 1.模型构造 1.1层和块 import torch fr…

一种具有轨迹优化的无人驾驶车实时运动规划器 论文阅读

论文题目:A Real-Time Motion Planner with Trajectory Optimization for Autonomous Vehicles Abstract 本文的实时规划器首先将空间离散化,然后基于一组成本函数搜索出最佳轨迹。迭代优化所得到的轨迹的Path和Speed。post-optimization计算复杂度低&…

阿里云服务部署docker容器

1.1 为什么要用docker 问题 开发、测试、生产环境不统一,造成项目测试、部署时产生问题 解决方案 使用容器化技术,将环境和项目一起发送给测试、部署人员,测试人数和运维人员直接使用发过 来的环境和项目进行操作,避免环境不统一…

【卡梅德生物】单B细胞技术:牛单抗制备

1.牛单B细胞技术原理 单个B细胞抗体制备技术是近年来新发展的一类快速制备单克隆抗体的技术,基于流式细胞分选技术进行单B细胞单抗制备,利用每个B细胞只含有一个功能性重链可变区DNA序列和一个轻链可变区DNA序列且只产生一种特异性抗体的特性&#xff0c…

嵌入式linux 编译qt5(以v851s为例)

本文参考Blev大神的博客:Yuzuki Lizard V851S开发板 --移植 QT5.12.9教程(群友Blev提供) - Allwinner / 柚木PI-V851S - 嵌入式开发问答社区 (100ask.net) 一. 环境准备 1.下载qt5源码:Open Source Development | Open Source …

MathType绝对是我数学编辑的首选工具!

去年,微软曾说,要去掉Office里的公式编辑器,建议用户使用MathType编辑公式。目前Office用户可以到微软官网安装MathType的插件,现在免费使用,以后要收费。Word里安装这个插件以后,就会出现MathType的菜单。…

双交叉限幅控制总结

空燃比小于等于1使用下图:空燃比大于1,MAX变MIN,MIN变MAX,高低选互换即可。加负荷,先加空气,后加煤气,降负荷,先降煤气,后降空气。 交叉限幅和双交叉限幅的区别 交叉限幅…

磷酸铁锂电池生产污废水需要哪些工艺及设备

磷酸铁锂电池作为一种常见的锂离子电池,已广泛应用于电动汽车、储能系统等领域。然而,在磷酸铁锂电池的生产过程中,难免会产生一定量的污废水。为了有效处理和处理这些污废水,我们需要合适的工艺和设备。 首先,针对磷酸…

java期末复习题

1.任何一个Java程序都默认引入一个包,这个包的名字是________________。 正确答案:java.lang Java程序默认引入的包是java.lang包。这个包是Java语言的核心,它提供了Java中的基础类,包括基本Object类、Class类、String类、基本类…

react 项目结构配置

1 项目整体目录结构的搭建 如下图: 2 重置css样式: normalize.css reset.less ; 第一步 安装 npm i normalize.css 入口文件index.tsx导入:import ‘noremalize.css’ 第二步 创建自己的css样式:在assets文件夹中创建css…

【MySQL】:掌握SQL中DDL的数据库定义与操作

🎥 屿小夏 : 个人主页 🔥个人专栏 : MySQL从入门到进阶 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言一. SQL的分类二. DDL数据库操作2.1 查询所有数据库2.2 查询当前数据库2.3 创建数…

分类预测 | Matlab实现RP-LSTM-Attention递归图优化长短期记忆神经网络注意力机制的数据分类预测【24年新算法】

分类预测 | Matlab实现RP-LSTM-Attention递归图优化长短期记忆神经网络注意力机制的数据分类预测【24年新算法】 目录 分类预测 | Matlab实现RP-LSTM-Attention递归图优化长短期记忆神经网络注意力机制的数据分类预测【24年新算法】分类效果基本描述模型描述程序设计参考资料 分…

《设计模式的艺术》笔记 - 简单工厂模式

介绍 定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有相同的父类。因为在简单工厂模式中用于创建实例的方法是静态方法,因此简单工厂模式又被称为静态工厂方法模式,属于类创建型模式 实现 class Pr…

实现JavaScript的函数链式执行

本篇文章将会实现函数链式执行,链式步骤延时等操作。 1.工具类 const executor (name) > {/*** 执行器名称*/const executorName name;/*** 方法数组*/const methodArray [];/*** 同步执行某个方法*/function run(func){methodArray.push(func);return this…

谷歌aab包在Android 14闪退而apk没问题(targetsdk 34)

问题原因 Unity应用(target SDK 34)上线到GooglePlay,有用户反馈fold5设备上(Android14系统)疯狂闪退,经测试,在小米手机Android14系统的版本复现成功了,奇怪的是apk直接安装没问题,而打包成aa…