JVM实战(15)——Full GC调优

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

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

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

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

阶段1、深入多线程

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

阶段3、深入juc源码解析

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

阶段5、深入jvm源码解析

一、简介

本章将会讲解一个频繁Full GC的案例,示例来自于JVM基础篇中的亿级流量系统。我们先来回顾下案例。

1.1 案例背景

假设现在生产环境有一套“数据计算系统”,不停地从MySQL等各类数据源提取数据到内存中进行计算,系统是分布式的。

每个节点(机器)每分钟执行100次操作(提取数据并计算,每次操作耗时10s),每次操作1万条数据,每条数据大小为1KB左右,每次操作的数据大小就是10MB:

JVM实战(15)——Full GC调优,jvm专题,jvm

每台机器的配置是4核8G,JVM分配4G内存,其中新生代1.5G,老年代1.5G。

1.2 内存使用模型估算

每次操作会在Eden区分配10MB对象,以1分钟100次操作来算,那么Eden区1分钟内就会被占满:

JVM实战(15)——Full GC调优,jvm专题,jvm

二、Full GC调优

每个计算任务处理1万条数据耗时10s,假设此时80个计算任务都结束了,还有20个计算任务共计200MB正在计算中,那么此时200MB对象是存活的,不会被Young GC回收掉:

JVM实战(15)——Full GC调优,jvm专题,jvm

2.1 扩Survivor

由于任何一块Survivor区只有100MB,所以新生代中这存活的200MB对象会晋升到老年代,然后清空Eden:

JVM实战(15)——Full GC调优,jvm专题,jvm

如此反复,大约经过7分钟后,也就是经历了7次Young GC,此时大概有1.4G对象在老年代中:

JVM实战(15)——Full GC调优,jvm专题,jvm

再经过1分钟,也就是第8分钟结束时,新生代又满了,此时发现老年代可用空间已经不足(剩余100MB),比历代平均的晋升对象大小(200MB)要小,所以会直接触发一次Full GC。

Full GC会先把老年代的垃圾回收了(假设能全部回收),然后执行一次Young GC,此时Eden区存活的对象会进入老年代:

JVM实战(15)——Full GC调优,jvm专题,jvm

按照这种情况,每隔8分钟左右就会发生一次Full GC。Full GC的性能是很差的,所以必须进行优化,最基本的优化思路就是扩大Survivor区的内存,比如扩到200MB。这样基本就能避免对象频繁进入老年代,将Full GC频率降低到几个小时一次。

2.2 采用大内存

上述的示例,是假设系统每天的负载是1亿请求, 如果请求量再扩大十倍呢?

参照首节的内存使用模型来估算, 每秒中会有100MB左右的数据进入Eden,那么Eden会在10s内就被塞满,触发Young GC 。

计算任务本身就耗时10s左右,所以直接后果就是,即使进行了Young GC,可能也只能回收掉几百MB数据。那每隔10s,就有1G左右的数据进入老年代,那下一个10s又来1G数据,就会触发Full GC。最终的结果就是每分钟触发好几次Full GC,对于系统来说就是灾难。

所以,针对这个问题,首先要做的显然就是扩内存,比如换成16核32G的机器,Eden分配16G,Survivor各分配2G。那么按每秒加载100MB数据进内存来算,需要2分钟左右才会触发一次YoungGC,而每次Young GC的存活对象也就是几百MB,Survivor区足够容纳。这就避免了对象频繁进入老年代,触发Full GC。

那么,针对这种大内存的机器,我们是否需要用G1作为垃圾回收器呢?

对于本示例中的系统是不需要的,因为这种数据计算系统一般都是离线的,也就是说不和用户直接交互,所以哪怕每隔2分钟进行一次Young GC,每次Young GC耗时1s也没什么影响。文章来源地址https://www.toymoban.com/news/detail-798863.html

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

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

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

相关文章

  • PromQL实现Actuator获取的JVM指标的Full GC次数监控

    Spring Boot 版本需要2.0.0或更高版本。 添加Micrometer Prometheus registry依赖: 在application.properties中开启prometheus端点: 做完上述配置后,Actuator就可以通过Micrometer获取到JVM的GC指标,其中包括: jvm_gc_memory_promoted_bytes_total:记录New Generation晋升到Old Generation的内存大小总和。反映对象存活率。

    2024年02月13日
    浏览(61)
  • JVM——配置常用参数,GC调优策略

    Java内存区域常见配置参数概览 堆参数; 回收器参数; 项目中常用配置; 常用组合; Java内存区域常见配置参数概览 堆参数 回收器参数 如上表所示,目前 主要有串行、并行和并发三种 ,对于大内存的应用而言,串行的性能太低,因此使用到的主要是并行和并发两种。并行

    2024年02月12日
    浏览(29)
  • JVM调优笔记(一)--Nacos GC引发的服务批量下线问题

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

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

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

    2024年02月07日
    浏览(46)
  • JVM实战(16)——模拟Young GC

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

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

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

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

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

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

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

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

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

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

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

    2024年02月03日
    浏览(30)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包