JVM系统优化实践(16):线上GC案例(一)

news2024/10/5 2:24:15

您好,我是湘王,这是我的CSDN博客,欢迎您来,欢迎您再来~


列举几个实际使用案例说一下GC的问题。一个高峰期每秒10万QPS的社交APP,个人主页模块是流量最大的那个,而一次个人主页的查询,大概会加载5M的数据。

由于并发量太高,导致高峰期年轻代的Eden区被迅速填满,且频繁触发Young GC,每次Young GC后存活对象较多,Survivor中放不下。大量的对象快速进入老年代,由于老年代满而频繁触发Full GC。

优化JVM参数为:

-XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=5

CMS会导致大量的内存碎片,可以在5次GC之后,做一次Compaction压缩操作。

所以,在Full GC频率升高时,需要将如上参数调整为:

-XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0

避免越来越频繁的GC。

一般新手工程师在部署生产环境时基本不会对JVM进行设置,基本跟上也都是使用JVM的默认设置,这是一个很大的隐患。例如,如果不设置-Xmx或者-Xms的话,可能初始的年轻代和老年代就几百M大小。Full GC一般在正常情况下,都是按天为单位来发生的,比如每天一次,或几天一次Full GC。

下面是一个公司级别的JVM模板:

Full GC不仅会因为老年代占满而触发,也会因为Metaspace区域被占满而触发。Java中的反射会将产生的类放在Metaspace中,而SoftReference软引用对象的回收公式是:

1、clock - timestamp ≤ freespace * SoftRefLRUPolicyMSPerMB;

2、clock – timestamp:表示软引用对象多久没被访问过;

3、freespace:JVM的空闲内存空间;

4、SoftRefLRUPolicyMSPerMB:每一MB空闲空间允许SoftReference对象存活多久。

5、如果freespace=3000MB,SoftReference=1000毫秒,则软引用对象可以存活freespace * SoftReference = 3000秒 = 50分钟。

如果-XX:SoftRefLRUPolicyMSPerMB=0,会导致可能刚创建出来的反射类迅速被Young GC回收掉。程序执行会继续执行反射以弥补不足,如此反复循环,造成Metaspace被占满。一般可将SoftRefLRUPolicyMSPerMB设为1000~5000毫秒,让JVM创建的软引用不会被立即回收,Metaspace的占用是比较稳定的,不会大幅波动,因为没有必要专门设置SoftRefLRUPolicyMSPerMB这个值。

通常,一个比较良好的JVM性能,应该是Full GC几天才触发一次,或者最多一天几次而已。未优化前的JVM参数:

-Xms1536M -Xmx1536M -Xmn512M -Xss256K -XX:SurvivorRatio=5 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=68 -XX:+CMSParallelRemarkEnabled -XX:+UseCMSInitiatingOccupancyOnly -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC

导致的结果是:

1、6天内,Young GC总次数2.6万次,总耗时1400秒

2、6天内,Full GC总次数250次,总耗时70秒

可以看出:

1、老年代1024M,年轻代512M,且Eden:S0:S1 = 5:1:1

2、-XX:CMSInitiatingOccupancyFraction=68,即老年代空间达到680M时触发Full GC

可由上述GC日志倒推JVM的内存模型:

每分钟3次Young GC,说明每20秒会让Eden满,则每秒产生365/20 ≈ 15~20M对象:

每30分钟1次Full GC,说明每30分钟可能产生680M对象,或者每次Young GC后存活对象太多,老年代放不下年轻代转过来的对象:

通过jstat得知:每次Young GC后,升入老年代的对象很少,因为S0/S1太小,经常触发动态年龄判定规则:

再次通过jstat得知:老年代总会突然有几百M对象占据着:

因此,答案很明显:大对象。一定是系统运行时,突然产生几百M大对象,而年轻代放不下这些大对象,它们就直接进入老年代,频繁触发Full GC:

然后再定位产生大对象的原因:

1、通过jmap,导出一份dump内存快照,接着用jhat或者Visual VM之类的工具分析dump文件;

2、通过分析dump,得知那个几百M的大对象,是从数据库中查出的数据,存放在Map中;

3、进一步排查出问题SQL语句。

故障解决和优化:

1、首先要解决代码中的bug;

2、年轻代明显太小,S0/S1区太小,因此需要调整JVM参数为:

-Xms1536M -Xmx1536M -Xmn1024M -Xss256K -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M -XX:SurvivorRatio=5 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=92 -XX:+CMSParallelRemarkEnabled -XX:+UseCMSInitiatingOccupancyOnly -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC

通过查看jstat,发现每秒都有Full GC,每次几百毫秒,年轻代增长不快,老年代才使用10%空间,元空间也才20%。怀疑人为原因:代码中写了System.gc()!

System.gc()不能随便写,它让JVM执行一次全空间的Full GC!

在系统负载量低时,这段代码可能没什么问题,但当系统负载量很高时,这段代码会频繁触发Full GC,导致系统直接卡死!为预防此类问题,可以通过加入-XX:+DisableExplicitGC避免显示触发GC。


感谢您的大驾光临!咨询技术、产品、运营和管理相关问题,请关注后留言。欢迎骚扰,不胜荣幸~

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

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

相关文章

python文本自动伪原创-ai一键伪原创

chatgpt批量伪原创的优势 ChatGPT是一个由OpenAI开发的强大的自然语言处理模型,它具有批量伪原创的优势,以下是这些优势: 模型能够处理大量的数据:ChatGPT通过训练大规模的语言模型来生成伪原创文本。这个模型拥有一个庞大的语料…

MySQL:varchar与date类型互转,对接java数据类型String和Date

目录 问题现象: 问题分析: varchar 转 date : date 转 varchar: 解决方法: varchar 转 date : date 转 varchar: 问题现象: 今天在项目中遇到一个问题: 现象&…

将DataTable中的数据保存到Excel (二) 使用NPOI

文章目录 背景1 NPOI 简介2 使用NPOI2.1 创建一个简单的工作簿2.2 简单的读取内容2.3 将DataTable数据导出到Excel(NPOI)2.4 Excel(NPOI)导入到DataTable 3 NPOI 总结 背景 前面写过一篇DataTable导出到Excel的文章,使用的是Office COM组件进行导入导出&#xff0c…

第五章 法律规范

目录 第一节 法律规则 一、法律规范与法律规则的概念辨析二、法律规则的逻辑结构 (一)假定:(二)行为模式:(三)法律后果: 三、法律规则与法律条文的关系 (想法…

【vue2】使用vue-admin-template动态添加路由的思路/addRoutes的使用

😉博主:初映CY的前说(前端领域) ,📒本文核心:用原生js实现省市区联动 【前言】在通用的后台管理项目的开发中,不仅仅是会涉及到对表单数据等的增删改查操作还会涉及到一些关于权限管理的问题。我们将基于一个RBAC的思维…

FPGA设计实战演练.高级技巧篇-----读书笔记

第一章 从PCB开始研究FPGA设计问题 一、PCB布线 1、要求 对所有器件进行电源滤波,均匀分配电源,降低系统噪声。 匹配信号线,减小信号反射。 降低并行走线之间的串扰。 减小地反弹效应。 进行阻抗匹配。 2、微带传输布局,走…

全景丨0基础学习VR全景制作,平台篇第六章:全局功能-开场提示

大家好欢迎观看蛙色平台使用教程 编辑器功能位置 1、功能说明 开场提示是指VR漫游作品加载好以后,进入到全景里面时,优先展示的图像。 PC端/移动端,均可设置起到指引用户的作用。 2、功能要用在哪? (1)场…

无人机影像处理流程

无人机由于其方便快捷,精度高等特点已经广泛应用于农田尺度的作物生长监测。尤其是近年来大疆推出了两个多光谱无人机,价格也相较便宜。但目前无人机的使用实际上需要进一步处理才能获取得到农田的基本信息,主要包括影像的校正和图像拼接&…

FME教程:GIS建筑面转CAD格式JMD,还原房屋建筑结构、层数、地物样式,shp转CAD,GIS转dwg

GIS数据转CAD数据,是经常遇到的需求,但是CAD数据形式与GIS相差甚远,因此GIS转CAD后,要还原图形样式和地物属性便成为了一个难点。 今天介绍使用FME进行shp格式房屋面数据转dwg格式的JMD图层的方法。实现房屋的地物样式、结构、层…

Android studio Activity启动模式

1.四种启动模式: 1).standard(标准模式) 特点:1.Activity的默认启动模式 2.每启动一个Activity就会在栈顶创建一个新的实例。例如:闹钟程序 缺点:当Activity已经位于栈顶时…

C#模拟实现输出进销存管理系统中的每月销售明细(实验五)

实验五:模拟实现输出进销存管理系统中的每月销售明细 任务要求: 运行程序,输入要查询的月份,如果输入的月份正确,则显示本月商品销售明细;如果输入的月份不存在,则提示“该月没有销售数据或者…

什么是企业数智化的创新加速器?

数智商业创新,使得企业的发展模式有了一个更大的跃升。在数智化转型热潮中,打造数据驱动的智慧企业,实现商业创新与转型升级,构建企业新的竞争优势成为这一阶段企业管理者的核心诉求。围绕这一核心诉求,企业关键要考虑…

javascript通过canvas实现不同时区的时钟绘制

这里使用Javascript的class和canvas技术实现时钟的绘制,并且通过类实例来实现不同时区的时间显示,增强复用性。 如下图: 一、基本知识 在绘制前,我们先熟悉下本次使用到的Canvas相关基础知识,以便后面更好理解并使用。…

Bill Gates 和 Linus Torvalds 同时推崇的编程语言,不可复制的经典

1 缘起 “我们为什么没有这样的东西?!” -- Bill Gates 1988年春天,Alan Copper坐在微软的大会议室中,给Bill Gates和微软的十几名员工做了一次著名的演示。 这是个叫做Tripod的开发工具,控制面板上面是一些按钮&…

电视剧是大众文化娱乐的载体,情感、喜剧、悬疑,你钟爱哪种题材?

电视剧作为一种重要的文化娱乐产品,一直以来都受到了人们的热爱和关注。它们通过故事情节、角色塑造、美术设计等方面的表现,向观众展现了生活中的各种情感和经历,同时也传递了一些价值观和思想观念 做为低成本的的娱乐方式,能够为…

1. 数据结构与算法概述

1. 数据结构与算法概述 1.1 什么是数据结构? 官方解释: 数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及他们之间的关系和操作等相关问题的学科。 大白话: 数据结构就是把数据元素按照一定的关系组织起来的集合…

讲真的,我哭死,搞了一个画图软件

文章目录 👵回来咯👴一起画图吧👱画图软件👼项目地址 专栏Python零基础入门篇🔥Python网络蜘蛛🔥Python数据分析Django基础入门宝典🔥小玩意儿🔥Web前端学习tkinter学习笔记Excel自动…

数据结构——堆和优先队列

文章目录 前言堆堆的引入堆的定义堆的储存结构 优先队列优先队列简介优先队列的基础操作入队出队 优先队列的实现 堆的应用堆排序TOP-K问题什么是TOP-K问题TOP-K问题的排序解法TOP-K问题的堆解法 总结 前言 堆是一个比较基础,且实现起来难度也不算太大的一个数据结…

高性能RPC框架:TARS简介、设计思想、架构、特性学习

文章目录 一、TARS简介二、设计思想三、整体架构3.1 架构拓扑3.2 服务交互流程3.3 Web管理系统3.4 服务结构 四、Tars特性4.1 Tars协议4.2 调用方式4.3 负载均衡4.4 容错保护4.5 过载保护4.6 消息染色4.7 IDC分组4.8 SET分组4.9 数据监控4.10 集中配置 声明:以下内容…

文心一言 vs GPT-4 —— 全面横向比较

文心一言 vs GPT-4 —— 全面横向比较 3月15日凌晨,OpenAI发布“迄今为止功能最强大的模型”——GPT-4。我第一时间为大家奉上了体验报告《OpenAI 发布GPT-4——全网抢先体验》。 时隔一日,3月16日下午百度发布大语言模型——文心一言。发布会上&#…