记一次排查线上频繁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

相关文章

PyInstaller打包selenium-wire过程中常见问题和解决指南

《PyInstaller打包selenium-wire过程中常见问题和解决指南》常用的打包工具PyInstaller能将Python项目打包成单个可执行文件,但也会因为兼容性问题和路径管理而出现各种运... 目录前言1. 背景2. 可能遇到的问题概述3. PyInstaller 打包步骤及参数配置4. 依赖

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable

将Mybatis升级为Mybatis-Plus的详细过程

《将Mybatis升级为Mybatis-Plus的详细过程》本文详细介绍了在若依管理系统(v3.8.8)中将MyBatis升级为MyBatis-Plus的过程,旨在提升开发效率,通过本文,开发者可实现... 目录说明流程增加依赖修改配置文件注释掉MyBATisConfig里面的Bean代码生成使用IDEA生

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

JSON Web Token在登陆中的使用过程

《JSONWebToken在登陆中的使用过程》:本文主要介绍JSONWebToken在登陆中的使用过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录JWT 介绍微服务架构中的 JWT 使用结合微服务网关的 JWT 验证1. 用户登录,生成 JWT2. 自定义过滤

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

SpringCloud之LoadBalancer负载均衡服务调用过程

《SpringCloud之LoadBalancer负载均衡服务调用过程》:本文主要介绍SpringCloud之LoadBalancer负载均衡服务调用过程,具有很好的参考价值,希望对大家有所帮助,... 目录前言一、LoadBalancer是什么?二、使用步骤1、启动consul2、客户端加入依赖3、以服务

Oracle存储过程里操作BLOB的字节数据的办法

《Oracle存储过程里操作BLOB的字节数据的办法》该篇文章介绍了如何在Oracle存储过程中操作BLOB的字节数据,作者研究了如何获取BLOB的字节长度、如何使用DBMS_LOB包进行BLOB操作... 目录一、缘由二、办法2.1 基本操作2.2 DBMS_LOB包2.3 字节级操作与RAW数据类型2.