JVM基础(12)——G1调优

这篇具有很好参考价值的文章主要介绍了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个小时内进行在线学习。

JVM基础(12)——G1调优,jvm专题,jvm

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,如下图:

JVM基础(12)——G1调优,jvm专题,jvm

预期停顿时间,我们采用默认值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:

JVM基础(12)——G1调优,jvm专题,jvm

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

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

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

JVM基础(12)——G1调优,jvm专题,jvm

然后系统继续运行,直到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日志分析问题。文章来源地址https://www.toymoban.com/news/detail-813409.html

到了这里,关于JVM基础(12)——G1调优的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JVM基础(9)——新生代调优

    作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 学习必须往深处挖,挖的越深,基础越扎实! 阶段1、深入多线程 阶段2、深入多线程设计模式 阶段3、深入juc源码解析

    2024年01月16日
    浏览(53)
  • 【JVM】JVM收集器CMS与G1区别

    CMS收集器和G1收集器的区别 CMS收集器是老年代的收集器,可以配合新生代的Serial和ParNew收集器一起使用 G1收集器收集范围是老年代和新生代。不需要结合其他收集器使用 CMS收集器以最小的停顿时间为目标的收集器。 G1收集器可预测垃圾回收的停顿时间(建立可预测的停顿时间

    2024年02月08日
    浏览(81)
  • G1垃圾收集分类-JVM(十四)

    上篇文章说了G1不在是连续的老年代年轻代,而是分为不同的region,有eden,survivor,old,humongous,当大于百分之50region的数据则直接进入humongous,如果对象太大,会连续的存储,分为初始标记,并发标记,最终标记,筛选标记,其中只有并发标记不会STW,G1可以设置STW的时候,

    2024年02月16日
    浏览(38)
  • JVM G1垃圾回收机制介绍

    G1(Garbage First)收集器 (标记-整理算法): Java堆并行收集器,G1收集器是JDK1.7提供的一个新收集器,G1收集器基于“标记-整理”算法实现,也就是说不会产生内存碎片。此外,G1收集器不同于之前的收集器的一个重要特点是:G1回收的范围是整个Java堆(包括新生代,老年代),而其

    2024年02月13日
    浏览(31)
  • JVM垃圾回收器G1详解

    在我们应用程序所应对的业务越来越庞大、复杂,用户越来越多,没有GC就不能保证应用程序正常进行,而经常造成STW的GC又跟不上实际的需求,我们需要不断地尝试对GC进行优化。G1(Garbage-First)垃圾回收器是在Java7 update4之后引入的一个新的垃圾回收器,是当今收集器技术发

    2024年02月09日
    浏览(35)
  • G1垃圾收集器-JVM(十三)

    上篇文章说了CMS垃圾收集器使用以及三色标记如何解决cms的一些问题。分别有初始标记,并发标记,重新标记,并发清理,并发重置。 CMS垃圾收集器三色标记-JVM(十二) G1收集器(Garbage-First) -XX:+UseG1GC 这是一款面向服务器的垃圾收集器,主要针对 设备多核cpu和大内存的机

    2024年02月16日
    浏览(64)
  • JVM CMS和G1执行过程比较

    CMS CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。由于大部分 Java 应用主要集中在互联网网站以及基于浏览器的 B/S 系统的服务端,这类应用通常会较为关注服务的响应速度,希望系统的停顿时间尽可能少,CMS 收集器就非常符合这类应用的需求

    2024年02月07日
    浏览(34)
  • JVM垃圾回收——G1垃圾收集器

    目录 一、什么是G1垃圾收集器 二、G1垃圾收集器的内存划分 三、G1垃圾收集器的收集过程  四、G1收集器的优缺点 五、G1收集器的JVM参数配置         Garbage First(简称G1)收集器是垃圾收集器技术发展史上里程碑式的成果,它摒弃了传统垃圾收集器的严格的内存划分,而是采

    2024年02月05日
    浏览(45)
  • JVM 17 调优指南:如何进行JVM调优,JVM调优参数

    在这篇文章中,我会详细介绍JVM调优的概念、重要性和具体的JVM调优参数。此外,我将提供12个实用的代码示例,每个示例都会包含JVM调优参数和相应的Java代码。 本文已收录于,我的技术网站 ddkk.com,有大厂完整面经,工作技术,架构师成长之路,等经验分享 JVM调优是调整

    2024年02月02日
    浏览(45)
  • JVM 8 调优指南:如何进行JVM调优,JVM调优参数

    这篇文章将详细介绍如何进行JVM 8调优,包括JVM 8调优参数及其应用。此外,我将提供12个实用的代码示例,每个示例都会结合JVM启动参数和Java代码。 本文已收录于,我的技术网站 ddkk.com,有大厂完整面经,工作技术,架构师成长之路,等经验分享 JVM调优是指通过调整Java虚拟

    2024年01月21日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包