记一次排查线上频繁FullGC 过程

2023-10-13 20:30

本文主要是介绍记一次排查线上频繁FullGC 过程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

记一次排查线上频繁FullGC 过程

    • 一、一段艰辛的排查过程
      • 1.突发告警
        • 1.1 新生代老年代情况:
        • 1.2 老年代GC情况
      • 2.紧急处理
      • 3.问题定位
        • 3.1 dump文件过大:
        • 3.2 如何分析:
        • 3.3 排查原因
        • 3.4 水落石出
      • 4.修复上线
    • 二、收获

一、一段艰辛的排查过程

记录一次生产环境频繁FullGC的排查过程,艰辛但收获满满;

1.突发告警

这是一个风和日丽的下午,已经疲惫不堪的我正日常码代码,突然收到JVM监控告警,进入监控大盘查看JVM情况:

1.1 新生代老年代情况:

在这里插入图片描述
图片截了一张最简化的出来,因为公司数据安全限制;

蓝色:新生代
棕黄色:老年代
从图线中可以看出,新生代是在某一时刻突然被打满的,这种情况猜测可能是产生了死循环、批量导出等问题;

1.2 老年代GC情况

在这里插入图片描述

图线呈阶梯递增趋势,表明频繁 FullGC,但问题就在,频繁FullGC而GC不掉对象,说明这些对象还存在Roots;

2.紧急处理

在公司的一条军规:先恢复,再定位;先恢复服务的可用,再来定位问题的原因;
我的服务是多节点部署,通过公司网关做负载均衡:

  1. 周知 PM下线 XX节点;
  2. 网关下线XX节点服务;
  3. 生成dump文件 jmap -dump:live,format=b,file=dump.hprof 进程号;
  4. 重启服务,恢复可用;

3.问题定位

登录服务器查看生成的 dump文件,大小有29G,面对的第一个问题来了;

3.1 dump文件过大:

分析dump文件,是需要内存来支撑的,而29G的内存就算拿到本地电脑也无法分析,所以我找运维同学申请了一台新服务器(130G内存),将29G的dump压缩,压缩zip包之后大概5G,发送到新服务器;

3.2 如何分析:

1.下载Linux版本的MAT
2.下载后解压,进到MAT目录中,执行:

修改MAT JVM参数
MemoryAnalyzer.ini 调整堆大小可以容纳你的dump文件的大小
./ParseHeapDump.sh jmap.info org.eclipse.mat.api:suspects org.eclipse.mat.api:overview org.eclipse.mat.api:top_components

3.上述命令我大概等了2个小时,生成了三个压缩包文件:

jmap_Leak_Suspects.zip
jmap_System_Overview.zip
jmap_Top_Components.zip

在生成报告的这2个小时的时间里,排查链路追踪日志、查看网关请求日志、都没有查到可疑问题;将所有的希望都寄托在了报告上;

3.3 排查原因

终于生成了报告:
在这里插入图片描述

报告中提示有一个问题,占用了23.4G内存,下面的问题怀疑也没有给也直接的原因,点击See stacktrace:

在这里插入图片描述

栈信息中可以看出,是调用系统中的一个Excel转PDF的工具导致的;aspose是一个专门做文档转换的一个工具

3.4 水落石出

既然是Excel转换PDF导致的,那就查下当前时间段系统中记录的上传日志,有一个时间点比较符合的Excel,拿到上传到OSS的链接,下载到本地(文件非秘密文档)跑单测,本地运行报OOM,果然是这个文件的问题;
原因: 用户上传的Excel对多行整列加了底色,比如这种:
在这里插入图片描述
然后导致aspose解析时,认为有底色的列就有数据,造成一直FullGC;

4.修复上线

问题定位到了,和PM确认后,下线了Excel转换PDF的功能;
本来打算限制行和列的个数,后来看系统上传的Excel格式乱七八糟,竟然也有几万行的;

二、收获

我的系统上游对接了很多的业务系统,出现问题后收到各方反馈,一方面顶住压力,另一方面及时向各级领导反馈原因;
整个排查过程,艰辛,未接触过 JVM导致的生产问题,但整个过程下来,也学到了非常多的知识;也感谢同事的相助;

这篇关于记一次排查线上频繁FullGC 过程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/205691

相关文章

最新版IDEA配置 Tomcat的详细过程

《最新版IDEA配置Tomcat的详细过程》本文介绍如何在IDEA中配置Tomcat服务器,并创建Web项目,首先检查Tomcat是否安装完成,然后在IDEA中创建Web项目并添加Web结构,接着,... 目录配置tomcat第一步,先给项目添加Web结构查看端口号配置tomcat    先检查自己的to

SpringBoot集成SOL链的详细过程

《SpringBoot集成SOL链的详细过程》Solanaj是一个用于与Solana区块链交互的Java库,它为Java开发者提供了一套功能丰富的API,使得在Java环境中可以轻松构建与Solana... 目录一、什么是solanaj?二、Pom依赖三、主要类3.1 RpcClient3.2 Public

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

SpringBoot整合kaptcha验证码过程(复制粘贴即可用)

《SpringBoot整合kaptcha验证码过程(复制粘贴即可用)》本文介绍了如何在SpringBoot项目中整合Kaptcha验证码实现,通过配置和编写相应的Controller、工具类以及前端页... 目录SpringBoot整合kaptcha验证码程序目录参考有两种方式在springboot中使用k

电脑多久清理一次灰尘合? 合理清理电脑上灰尘的科普文

《电脑多久清理一次灰尘合?合理清理电脑上灰尘的科普文》聊起电脑清理灰尘这个话题,我可有不少话要说,你知道吗,电脑就像个勤劳的工人,每天不停地为我们服务,但时间一长,它也会“出汗”——也就是积累灰尘,... 灰尘的堆积几乎是所有电脑用户面临的问题。无论你的房间有多干净,或者你的电脑是否安装了灰尘过滤器,灰尘都

SpringBoot整合InfluxDB的详细过程

《SpringBoot整合InfluxDB的详细过程》InfluxDB是一个开源的时间序列数据库,由Go语言编写,适用于存储和查询按时间顺序产生的数据,它具有高效的数据存储和查询机制,支持高并发写入和... 目录一、简单介绍InfluxDB是什么?1、主要特点2、应用场景二、使用步骤1、集成原生的Influ

SpringBoot实现websocket服务端及客户端的详细过程

《SpringBoot实现websocket服务端及客户端的详细过程》文章介绍了WebSocket通信过程、服务端和客户端的实现,以及可能遇到的问题及解决方案,感兴趣的朋友一起看看吧... 目录一、WebSocket通信过程二、服务端实现1.pom文件添加依赖2.启用Springboot对WebSocket

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

作业提交过程之HDFSMapReduce

作业提交全过程详解 (1)作业提交 第1步:Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。 第2步:Client向RM申请一个作业id。 第3步:RM给Client返回该job资源的提交路径和作业id。 第4步:Client提交jar包、切片信息和配置文件到指定的资源提交路径。 第5步:Client提交完资源后,向RM申请运行MrAp

如何解决线上平台抽佣高 线下门店客流少的痛点!

目前,许多传统零售店铺正遭遇客源下降的难题。尽管广告推广能带来一定的客流,但其费用昂贵。鉴于此,众多零售商纷纷选择加入像美团、饿了么和抖音这样的大型在线平台,但这些平台的高佣金率导致了利润的大幅缩水。在这样的市场环境下,商家之间的合作网络逐渐成为一种有效的解决方案,通过资源和客户基础的共享,实现共同的利益增长。 以最近在上海兴起的一个跨行业合作平台为例,该平台融合了环保消费积分系统,在短