JVM实战(14)——Young GC调优

这篇具有很好参考价值的文章主要介绍了JVM实战(14)——Young GC调优。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

阶段1、深入多线程

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

阶段3、深入juc源码解析

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

阶段5、深入jvm源码解析

一、简介

本章,我们还是以案例驱动的方式讲解Young GC调优,之前在基础篇中,我们曾通过讲解过一个新生代调优。新生代调优最简单的思路就是扩Survivor区,本章示例的调优思路也是一脉相承。

1.1 案例背景

假设生产环境有一个商户BI系统,用于商户日常经营数据的分析和报表输出,其大致运行逻辑如下:

  1. 商户会在业务平台上进行运营,产生各种各样的业务数据;
  2. Hadoop、Spark等会对这些业务数据进行计算,然后放入MySQL、HBase之类的存储中;
  3. 最后,我们的BI系统会把各种存储好的数据暴露给前端,允许前端基于各种搜索条件筛选和展示。

JVM实战(14)——Young GC调优,jvm专题,jvm

系统刚上线时,商户数量只有几万家,生产机器配置是4核8G,新生代分配1.5G,Eden区有1G:

JVM实战(14)——Young GC调优,jvm专题,jvm

1.2 内存使用模型估算

每个商户的主页,前端每隔几秒钟就会发送一个请求给BI系统,用于生成一种实时报表。每台机器差不多每秒抗500个请求,由于报表需要的数据量比较大,一般每个请求需要加载约100KB的数据到内存中,每秒500个请求总共就是50MB数据,每次Young GC过后存活对象也就几十MB:

JVM实战(14)——Young GC调优,jvm专题,jvm

二、Young GC调优

根据上述内存使用模型的估算,每秒需加载50MB数据到Eden区,那3分钟左右就会将Eden区占满,触发Young GC。在1G的内存空间中进行Young GC的效率是很高的,基本上10ms左右就可以搞定,所以BI系统每运行几分钟就会出现10ms左右的卡顿,但是对终端用户和系统运行基本没有影响:

JVM实战(14)——Young GC调优,jvm专题,jvm

2.1 采用大内存

针对这样的业务场景,几万商户数量级基本没有什么影响,但是当商户数量达到百万级以上就会出现问题。所以,最简单的优化思路就是提升机器配置,比如采用16核32G的机器,这样每台机器可以抗几千个请求,部署20~30台就差不多了。

32G内存的机器,新生代分配20G,其中Eden区占16G。此时每秒几千请求的话,大概每秒会加载几百MB数据到Eden区,最多1分钟就会填满Eden区。

此时,Young GC从原来只需回收1G的内存变成了回收16G,速度会慢很多,从商户的体验上看就是每隔1分钟,系统就要卡1s左右:

JVM实战(14)——Young GC调优,jvm专题,jvm

卡顿时间过长,会导致大量请求排队,严重时导致系统时不时就出现请求超时的现象。

2.2 采用G1

既然是大内存的机器,其实采用G1才是正确的思路。对G1设置一个合理的预期停顿时间,比如100ms,让G1保证每次Young GC的时候最多停顿100ms,避免影响终端用户的使用。

三、总结

本文通过一个示例讲解了Young GC的基本优化思路,在系统内存不是很大的情况下,可以通过提升Eden和Survivor的空间,来容纳更多的新生代对象。但是,当新生代的内存空间太大时,需要考虑每次Young GC的时间成本,传统的ParNew回收器不太适合这种大内存场景,所以 针对大内存机器建议使用G1进行垃圾回收 。

另外,通过本文示例也可以看到,即使Young GC频繁些,但是只要保证每次GC时间很短(控制在几十毫秒内),对系统基本不会有什么影响。文章来源地址https://www.toymoban.com/news/detail-795577.html

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

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

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

相关文章

  • JVM调优笔记(一)--Nacos GC引发的服务批量下线问题

    线上批量发服务下线的告警邮件,偶发nacos连接超时。采用了spring boot admin(以下称sba)进行服务监控。 因为sba服务是基于nacos对其它服务进行监控,所以遇到这个问题,第一怀疑对象是nacos发生问题,但不清楚具体是什么问题。由于服务过一段事件会恢复,所以nacos肯定是没

    2023年04月23日
    浏览(31)
  • Java线上故障排查(CPU、磁盘、内存、网络、GC)+JVM性能调优监控工具+JVM常用参数和命令

    根据服务部署和项目架构,从如下几个方面排查: (1)运用服务器:排查内存,cpu,请求数等; (2)文件图片服务器:排查内存,cpu,请求数等; (3)计时器服务器:排查内存,cpu,请求数等; (4)redis服务器:排查内存,cpu,连接数等; (5)db服务器:排查内存,cpu,连接数

    2024年02月07日
    浏览(61)
  • JVM实战(18)——模拟Full GC

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

    2024年01月18日
    浏览(46)
  • JVM实战(19)——JVM调优工具概述

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

    2024年01月18日
    浏览(49)
  • JVM调优实战

    用top命令,看看是哪个进程CPU占用率高,获取它的进程ID,再根据具体的进程id,执行 top -HP 进程id号  命令,看看哪个线程的CPU占用率高,如果是业务线程出现问题,则根据线程ID去检查业务代码;如果是GC线程占用率高,去看看日志再确定具体问题(有可能发生内存泄漏)。

    2024年02月07日
    浏览(30)
  • 11-JVM调优实战-1

    上一篇:10-JVM调优工具详解 jstat -gc pid 最常用,可以评估程序内存使用及GC压力整体情况 S0C:第一个幸存区的大小,单位KB S1C:第二个幸存区的大小 S0U:第一个幸存区的使用大小 S1U:第二个幸存区的使用大小 EC:伊甸园区的大小 EU:伊甸园区的使用大小 OC:老年代大小 OU:

    2024年02月09日
    浏览(34)
  • 13-JVM调优实战-3

    上一篇:12-JVM调优实战-2 今天来介绍一款阿里巴巴的调优工具。 Arthas详解 Arthas 是 Alibaba 在 2018 年 9 月开源的 Java 诊断工具。支持 JDK6+, 采用命令行交互模式,可以方便的定位和诊断线上程序运行问题。Arthas 官方文档十分详细,详见:https://arthas.aliyun.com/ 得益于 Arthas 强大且

    2024年02月09日
    浏览(35)
  • 【Java虚拟机】JVM调优和分析案例综合实战

    1.什么是JVM性能优化 jvm性能优化涉及到两个很重要的概念:吞吐量和响应时间。jvm调优主要是针对他们进行调整优化,达到一个理想的目标,根据业务确定目标是吞吐量优先还是响应时间优先。 吞吐量:用户代码执行时间/(用户代码执行时间+GC执行时间)。 响应时间:整个接

    2024年02月03日
    浏览(39)
  • 深度剖析JVM调优法则,神器Arthas从CPU/内存出发轻松掌握调优实战技巧

    场景一、CPU过高 CPU占用过高排查思路: step1:进行arthas step2:输入deashboard 如何不记得命令可以在控制台输入help step3:查看线程栈信息 从线程栈信息中定位到具体的java代码。 场景二、内存占用过高 内存占用过高排查思路: step1:进行arthas step2:输入deashboard 在dashboard页面中

    2024年02月06日
    浏览(44)
  • JVM监控和调优常用命令jps|jstat|jinfo|jmap|jhat|jstack实战

    性能优化 :通过JVM调优,可以提高Java应用程序的性能,减少响应时间,提高吞吐量,以更好地满足用户需求。性能优化可以加快应用程序的执行速度,减少延迟,提高用户体验。 内存管理 :JVM负责管理Java应用程序的内存。正确的内存管理可以避免内存泄漏和内存溢出等问

    2024年02月09日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包