一次GC暂停时间过长的排查与优化

news2024/11/15 11:08:28

告警

在这里插入图片描述
在这里插入图片描述

GC日志分析

日志

2022-11-17T14:28:40.315+0800: 1956232.826: [GC (Allocation Failure) 2022-11-17T14:28:40.315+0800: 1956232.826: [ParNew:
1576103K->2817K(1769472K), 0.0241066 secs] 4197176K->2624616K(5046272K), 0.0243910 secs] [Times: user=0.04 sys=0.00, rea
l=0.03 secs]
2022-11-17T14:28:40.347+0800: 1956232.859: [GC (CMS Initial Mark) [1 CMS-initial-mark: 2621798K(3276800K)] 2648559K(5046
272K), 0.0110744 secs] [Times: user=0.01 sys=0.00, real=0.02 secs]
2022-11-17T14:28:40.359+0800: 1956232.870: [CMS-concurrent-mark-start]
2022-11-17T14:28:45.647+0800: 1956238.159: [CMS-concurrent-mark: 5.282/5.289 secs] [Times: user=1.63 sys=0.41, real=5.28
 secs]
2022-11-17T14:28:45.648+0800: 1956238.159: [CMS-concurrent-preclean-start]
2022-11-17T14:28:45.671+0800: 1956238.182: [CMS-concurrent-preclean: 0.023/0.023 secs] [Times: user=0.03 sys=0.00, real=
0.03 secs]
2022-11-17T14:28:45.671+0800: 1956238.182: [CMS-concurrent-abortable-preclean-start]
2022-11-17T14:28:50.526+0800: 1956243.037: [GC (Allocation Failure) 2022-11-17T14:28:50.526+0800: 1956243.037: [ParNew2022-11-17T14:28:50.548+0800: 1956243.060: [CMS-concurrent-abortable-preclean: 1.472/4.877 secs] [Times: user=2.33 sys=0.03, real=4.87 secs]
: 1575681K->33553K(1769472K), 0.0281517 secs] 4197480K->2655355K(5046272K), 0.0284249 secs] [Times: user=0.05 sys=0.01, real=0.03 secs]
2022-11-17T14:28:50.572+0800: 1956243.083: [GC (CMS Final Remark) [YG occupancy: 78279 K (1769472 K)]2022-11-17T14:28:50.572+0800: 1956243.083: [Rescan (parallel) , 0.0115711 secs]2022-11-17T14:28:50.584+0800: 1956243.095: [weak refs processing, 0.8799103 secs]2022-11-17T14:28:51.464+0800: 1956243.975: [class unloading, 3.4124151 secs]2022-11-17T14:28:54.876+0800: 1956247.387: [scrub symbol table, 0.6587619 secs]2022-11-17T14:28:55.535+0800: 1956248.046: [scrub string table, 0.0028382 secs][1 CMS-remark: 2621801K(3276800K)] 2700081K(5046272K), 4.9762131 secs] [Times: user=0.29 sys=0.13, real=4.97 secs]
2022-11-17T14:28:55.550+0800: 1956248.061: [CMS-concurrent-sweep-start]
2022-11-17T14:28:57.959+0800: 1956250.470: [CMS-concurrent-sweep: 2.396/2.409 secs] [Times: user=2.31 sys=0.27, real=2.4
1 secs]
2022-11-17T14:28:57.959+0800: 1956250.470: [CMS-concurrent-reset-start]
2022-11-17T14:28:57.970+0800: 1956250.481: [CMS-concurrent-reset: 0.011/0.011 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]

CMS过程耗时分析

  • 初始标记Initial-Mark:此阶段的目标就是标记 GC Root 能直接关联到的对象,或者年轻代对老年代对象的引用,速度很快,但是会停止用户线程,耗时0.02s
2022-11-17T14:28:40.347+0800: 1956232.859: [GC (CMS Initial Mark) [1 CMS-initial-mark: 2621798K(3276800K)] 2648559K(5046
272K), 0.0110744 secs] [Times: user=0.01 sys=0.00, real=0.02 secs]
  • 并发标记Concurrent-mark:从上个阶段找到的 GC Roots 开始遍历整个对象图的过程,一般这个阶段耗时比较长,但是不需要停顿用户线程,那也就是说在标记的过程中对象图还在动态变化,因为用户线程还在执行。耗时5.28s
2022-11-17T14:28:40.359+0800: 1956232.870: [CMS-concurrent-mark-start]
2022-11-17T14:28:45.647+0800: 1956238.159: [CMS-concurrent-mark: 5.282/5.289 secs] [Times: user=1.63 sys=0.41, real=5.28
 secs]
  • 并发预清理Concurrent pre clean:这也是与用户线程并发的一个阶段,前一个标记阶段中与用户线程并发执行,一些对象的引用发生了更改,每当这种情况发生,JVM 都会将变化对象的对区域(称为“卡”)标记为“脏卡”,这个阶段会将“脏卡”标记,并将它们可达的对象也标记,完成后清洁“脏卡”。耗时0.03s
2022-11-17T14:28:45.648+0800: 1956238.159: [CMS-concurrent-preclean-start]
2022-11-17T14:28:45.671+0800: 1956238.182: [CMS-concurrent-preclean: 0.023/0.023 secs] [Times: user=0.03 sys=0.00, real=
0.03 secs]
  • 并发可中断的预清理Concurrent abortable pre clean:这个阶段尝试着去承担下一个阶段Final Remark阶段足够多的工作。这个阶段持续的时间依赖很多的因素,由于这个阶段是重复的做相同的事情直到发生aboart的条件(比如:重复的次数、多少量的工作、持续的时间等等)之一才会停止。此阶段最大持续时间为5秒,之所以可以持续5秒,另外一个原因也是为了期待这5秒内能够发生一次ygc,清理年轻带的引用,是的下个阶段的重新标记阶段,扫描年轻带指向老年代的引用的时间减少。耗时0.03s
2022-11-17T14:28:45.671+0800: 1956238.182: [CMS-concurrent-abortable-preclean-start]
2022-11-17T14:28:50.526+0800: 1956243.037: [GC (Allocation Failure) 2022-11-17T14:28:50.526+0800: 1956243.037: [ParNew2022-11-17T14:28:50.548+0800: 1956243.060: [CMS-concurrent-abortable-preclean: 1.472/4.877 secs] [Times: user=2.33 sys=0.03, real=4.87 secs]
: 1575681K->33553K(1769472K), 0.0281517 secs] 4197480K->2655355K(5046272K), 0.0284249 secs] [Times: user=0.05 sys=0.01, real=0.03 secs]
  • 重新标记Final remark:该阶段为了修正并发标记期间,因用户程序持续运行导致的对象变化。会停止用户线程。耗时4.97s
2022-11-17T14:28:50.572+0800: 1956243.083: [GC (CMS Final Remark) [YG occupancy: 78279 K (1769472 K)]2022-11-17T14:28:50.572+0800: 1956243.083: [Rescan (parallel) , 0.0115711 secs]2022-11-17T14:28:50.584+0800: 1956243.095: [weak refs processing, 0.8799103 secs]2022-11-17T14:28:51.464+0800: 1956243.975: [class unloading, 3.4124151 secs]2022-11-17T14:28:54.876+0800: 1956247.387: [scrub symbol table, 0.6587619 secs]2022-11-17T14:28:55.535+0800: 1956248.046: [scrub string table, 0.0028382 secs][1 CMS-remark: 2621801K(3276800K)] 2700081K(5046272K), 4.9762131 secs] [Times: user=0.29 sys=0.13, real=4.97 secs]
  • 并发清除Concurrent sweep:这个阶段的目的就是移除那些不用的对象,回收他们占用的空间并且为将来使用。耗时2.41s
2022-11-17T14:28:55.550+0800: 1956248.061: [CMS-concurrent-sweep-start]
2022-11-17T14:28:57.959+0800: 1956250.470: [CMS-concurrent-sweep: 2.396/2.409 secs] [Times: user=2.31 sys=0.27, real=2.4
1 secs]
  • 并发重置Concurrent reset:这个阶段并发执行,重新设置CMS算法内部的数据结构,准备下一个CMS生命周期的使用。耗时0.01s
2022-11-17T14:28:57.959+0800: 1956250.470: [CMS-concurrent-reset-start]
2022-11-17T14:28:57.970+0800: 1956250.481: [CMS-concurrent-reset: 0.011/0.011 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]

从日志中发现class-unloading也太久了??

GC过程中,长暂停主要是在【重新标记】阶段,日志为

2022-11-17T14:28:50.572+0800: 1956243.083: [GC (CMS Final Remark) [YG occupancy: 78279 K (1769472 K)]2022-11-17T14:28:50.572+0800: 1956243.083: [Rescan (parallel) , 0.0115711 secs]2022-11-17T14:28:50.584+0800: 1956243.095: [weak refs processing, 0.8799103 secs]2022-11-17T14:28:51.464+0800: 1956243.975: [class unloading, 3.4124151 secs]2022-11-17T14:28:54.876+0800: 1956247.387: [scrub symbol table, 0.6587619 secs]2022-11-17T14:28:55.535+0800: 1956248.046: [scrub string table, 0.0028382 secs][1 CMS-remark: 2621801K(3276800K)] 2700081K(5046272K), 4.9762131 secs] [Times: user=0.29 sys=0.13, real=4.97 secs]

发现,class unloading耗时较久为3.412s![image.png](https://img-blog.csdnimg.cn/img_convert/f45bcf0da1699c238c7b792a8a919d65.png#averageHue=#e5e5e5&clientId=u6880d548-dd21-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=25&id=u7631848b&margin=[object Object]&name=image.png&originHeight=50&originWidth=582&originalType=binary&ratio=1&rotation=0&showTitle=false&size=8927&status=done&style=stroke&taskId=ua0f06c69-0e35-44c8-a545-21fd4847d9a&title=&width=291)
查资料,发现类卸载阶段产生了很多的页活动,导致把cpu时间从GC线程抢走,内存页交换没有单独的监控,只能从实例io监控看了
![image.png](https://img-blog.csdnimg.cn/img_convert/7c70810ce5c41a38278e1c9699569384.png#averageHue=#fafafa&clientId=u6880d548-dd21-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=133&id=ub95b4666&margin=[object Object]&name=image.png&originHeight=265&originWidth=538&originalType=binary&ratio=1&rotation=0&showTitle=false&size=33100&status=done&style=stroke&taskId=u776a3268-83d3-449e-84f8-80201f332d9&title=&width=269)
从上面可以看到,发生GC时,实例io确实有突增

内存页交换机制在生产环境一般是禁用的,因此优化手段是关闭内存交换机制

参考资料:

解决方案

  • 关闭搜索服务的swap机制,2022-11-17日晚执行

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

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

相关文章

nginx配置详解

nginx 是一个高性能的HTTP 和反向代理服务器,特点是占有内存少,并发能力强 用途: 可以作为静态页面的 web 服务器正向代理(通过nginx代理 访问外部资源,比如fanqiang)反向代理 (隐藏真实服务器地址&…

创建vite项目

前提:Vite需要Node.js版本> 12.0.0 1. 创建文件夹,文件夹下打开cmd,输入 yarn create vite C:\Users\admin\Desktop\new>yarn create vite 2. 进行选择 3. vite.config.js 配置 (注意按目录创建global.scss) import …

关于射频测试电缆 这些知识你知道吗?

射频电缆组件的正确选择除了频率范围,驻波比,插入损耗等因素外,还应考虑电缆的机械特性,使用环境和应用要求,另外,成本也是一个永远不变的因素。以下带大家了解射频电缆相关知识。 射频电缆组件的基本选择原…

【附源码】Python计算机毕业设计网上宠物商店系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

Android 天气APP(三十六)运行到本地AS、更新项目版本依赖、去掉ButterKnife

运行到本地AS、更新项目版本依赖、去掉ButterKnife前言正文一、新版Android Studio编译运行① 升级项目gradle版本② 切换JDK版本③ BuildConfig报错二、百度的SDK使用① 开发版SHA1的作用是什么?② 什么时候需要更换开发版SHA1?③ 怎么获取开发版SHA1&a…

STM8S系列基于STVD开发,ADC不同精度采样示例

STM8S系列基于STVD开发,ADC不同精度采样示例📌相关篇《STM8S系列基于STVD开发,自定义printf函数TIM5精确延时函数模块化工程示例》 ✨本工程以上面一篇的工程为模板,在此基础上实现ADC电压采样。 🎬📽&…

java 读取resource下的文件

目录一、普通main代码里使用1.假设有如下结构的代码(1)、main方法里复制resource下的文件(2)、main方法里读取resource下的文件2.假设有如下结构的代码二、对于springboot项目读取resource下的资源文件一、普通main代码里使用 1.…

虚拟主播是什么,有什么技术原理?- 沉睡者IT

虚拟主播是什么?虚拟形象人物是通过人工智能技术的研究和积累,在克服了计算机图形学和AI核心技术的各个学科的智能化、平台化、虚拟人、虚拟内容在各个维度的技术难题后,提供给用户的核心资产。虚拟主播指的是在视频网站上使用虚拟图片进行投…

C. Bargain(数学贡献法)

Problem - 1422C - Codeforces 有时,要在讨价还价中达成协议并不容易。现在,萨沙和沃瓦就无法达成协议。萨沙说出了一个尽可能高的价格,然后沃瓦想从这个价格中删除尽可能多的数字。更详细地说,Sasha说出某个整数的价格n&#xff…

[R]第二节 练习一关于数值向量

1.产生一个等差数列(1,3,5,7,……,99)赋值给向量x x <- array(seq(from1, to99, by2)) seq函数解析 seq(from,to,length)该函数的意思是生成一组数字&#xff0c;从from开始&#xff0c;到to结束&#xff0c;每两个数间的间隔是length,如: seq(2,10,2),会生成一组数&…

ROS1学习笔记:服务中的Service和Client(ubuntu20.04)

参考B站古月居ROS入门21讲&#xff1a; 客户端Client的编程实现 服务端Server的编程实现 基于VMware Ubuntu 20.04 Noetic版本的环境 文章目录一、小乌龟例程中的服务二、创建功能包三、创建Client代码3.1 以C为例3.1.1 配置Client代码编译规则3.1.2 编译整个工作空间3.1.3 配置…

12 张图看懂 CPU 缓存一致性与 MESI 协议,真的一致吗?

本文已收录到 GitHub AndroidFamily&#xff0c;有 Android 进阶知识体系&#xff0c;欢迎 Star。技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 进 Android 面试交流群。 前言 大家好&#xff0c;我是小彭。 在上一篇文章里&#xff0c;我们聊到了 CPU 的三级缓存结构…

测试工作3年还在基础岗?可能只是因为你的工作能力差

对于职场人而言&#xff0c;工作中升职加薪是每个人都梦寐以求的事情&#xff0c;但有些小伙伴表示&#xff0c;自己来到一个公司三年&#xff0c;却依旧停留在基础岗位上&#xff0c;究竟是什么原因呢&#xff1f; 其实从根本来说&#xff0c;很有可能只是因为&#xff1a;你…

Spring Boot日志配置及输出

1.日志框架有哪些&#xff1f; 常见的日志框架有log4j、logback、log4j2。 log4j这个日志框架显示是耳熟能详了&#xff0c;在Spring开发中是经常使用&#xff0c;但是据说log4j官方已经不再更新了&#xff0c;而且在性能上比logback、log4j2差了很多。 logback是由log4j创始…

WebRTC系列<四> 全面了解客户端-服务器网页游戏的WebRTC

转载&#xff1a;https://blog.brkho.com/2017/03/15/dive-into-client-server-web-games-webrtc/ 多人游戏很有趣。对于他们在单人沉浸感方面所缺乏的东西&#xff0c;在线游戏弥补了与朋友一起探索、在线结识陌生人以及与有能力的同龄人正面交锋的独特奖励体验。人们只需要看…

C# Control.DoubleBuffered 属性的使用

C# Control.DoubleBuffered 属性的使用 在我们开发的过程中,经常需要对界面进行美化,而美化的过程,一般来说就是添加图片, 让界面更加清新脱俗,更加耳目一新。 有一次有一个软件发送到客户那里试用,客户对功能是非常满意的,但是对界面的布局和颜色,就大为不满。 原来…

【Hack The Box】windows练习-- Resolute

HTB 学习笔记 【Hack The Box】windows练习-- Resolute &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年9月7日&#x1f334; &#x1…

uniapp picker 的使用,这玩意做的真不怎么样

uniapp picker 的使用&#xff0c;这玩意做的真不怎么样 最近要做小程序&#xff0c;考虑到需要多平台都用一套东西&#xff0c;就选用了 uniapp。 在写表单的时候用到它的 picker 组件&#xff0c;看官方文档楞是没看明白怎么用&#xff0c;试了半天没试出来&#xff0c;还是…

每日一题 —— LC. 790 多米诺和托米诺

有两种形状的瓷砖&#xff1a;一种是 2 x 1 的多米诺形&#xff0c;另一种是形如 “L” 的托米诺形。两种形状都可以旋转。 给定整数 n &#xff0c;返回可以平铺 2 x n 的面板的方法的数量。返回对 10^9 7 取模 的值。 平铺指的是每个正方形都必须有瓷砖覆盖。两个平铺不同&…

数据集成平台关于【源平台调度任务生命周期】

任务调度者 调度事件生产任务调度任务池-异步
AsynDispatcher --source 实例化适配器执行 消费任务实例化集成应用 DataHub Instance
handleSourceDispatch()依赖注入集成方案适配器调度条件检查执行适配器调度方法联动其它方案调度任务 SourceEvent 适配器调度周期 初始化…