记一次频繁YoungGC生产问题排查思路及解决方案

记录一次sharingjdbc引起的fullgc频繁问题,总结一下fullgc频繁解决的方案 背景:最近做了个需求,为了优化效率所以做了本地缓存和redis缓存,这个跟实际问题没有很大关系,但在排查问题时造成了一定的干扰,导致排查时间变长了,这个问题的现象是上线后cpu急剧增高,fullgc次数比younggc次数多,而且每次fullgc回收的内存很少,fullgc频繁。 1.问题现象图: 2.分析:通过gc的情况可以看出一直在进行fullgc而没有进行younggc,这种情况猜测是有大对象执行进入了老年代,而且在老年代回收时没有被回收掉,正好代码里也使用的本地缓存,在上之前是有计算本地缓存会占 阅读详情
AI摘要

本文讲述了在新功能上线后,系统遭遇YoungGC时间过长告警,通过GC日志和堆内存分析发现是第三方SDK导致的内存占用过多。定位问题后,通过代码审查和jstack找到了问题源头,并采取了暂停SDK和清理文件的解决方案。

1、问题背景

系统开发了新功能上线,本来上完之后功能验收正常,就在大家都松了一口气安心听技术分享时,晚上6.56分突然收到了系统告警:
在这里插入图片描述

YoungGC时间过长,说实话一开始看到这个告警心里是毫无波澜的,一是因为一次YoungGC时间过长影响不大,二是因为这是内部系统,虽然处理的数据量比较大,但是YoungGC不会影响功能正常运行。

当时心里的第一想法是:应该是刚启动导致系统有些不平稳,过一会儿就好了。

然而过了几分后,第二台主机也开始告警,意识到问题严重性的我赶紧跑上来排查问题。

2、GC日志分析

首先找运维拿到GC日志之后,通过在线分析网站:https://gceasy.io/把日志文件载入分析:

在这里插入图片描述

很明显,基本上都是Allocation Failure引起的GC,表明本次引起GC的原因是因为在年轻代中没有足够的空间能够存储新的数据了。

3、Dump文件分析

大概知道了原因,但还是得定位到具体问题,再找运维拿了dump文件之后,本地通过jvusalvm装入dump文件进行分析,发现堆里面有89万个File对象(尴尬的是,这个问题是后来大佬发现的,自己当时看的时候没注意到这里……)
在这里插入图片描述
这时候离真相已经很近了,只要知道是什么地方有大量创建对象这个操作就行了,这时候有两个方法:

  1. 看代码
  2. 通过jstack看看线程的堆栈信息

通过第二种方式很容易就定位到了具体问题
在这里插入图片描述

4、解决方案

既然知道是第三方SDK引起的问题,直接把用到这个SDK地方先给停了,然后把89W个文件rm -rf一把梭,之后系统就恢复平稳运行了。

5、小结

业务原因对接了第三方SDK,类似一个消息队列,由于SDK自身问题导致会把无法消费的消息通过文件的形式暂存在本地,然后通过一个定时任务每十分钟去重新消费这些消息,但是不知道为什么没有消费成功。

这些文件日积月累慢慢影响着GC的性能,最终到达性能监控的阈值,然后告警……

基于单片机控制双向可控硅灯光强度设计 *单片机设计介绍,基于单片机控制双向可控硅灯光强度设计。 阅读详情

相关推荐

树莓派c语言串口通讯程序

在网上搜了很多关于树莓派串口通讯的例子,但是都是用python写的,虽然python很有名,而且最近也在学习这门语言, 但是还是想用c语言实现一下,因为需要用到整套系统里,其他内容都是用c语言写的。但是网上没有找打现成的。 还好,之前做过天嵌2440开发板的串口程序(参照天嵌工程师提供的代码),发现串口程序其实是通用的, 驱动层屏蔽了硬件细节,个人猜测,几乎所有移植好的系统的串口,都可以用一

realank的专栏 1万+

Young GC过于频繁

YoungGC频繁一般是内存问题,在优化代码降低频率的同时,也需关注某个时间段的累计耗时。总的来说,在CPU Quota允许的范围内,GC总耗时越少越好,GC频率反倒不是那么重要。展开: JVM / 内存 / GC / ClassLoader这一行,找到监控面板:GC耗时 和 GC原因与频次。Young GC过于频繁,说明JVM内存分配压力大,可能是Young区比较小或者代码加载到内存的数据过多。Young GC频繁,通常不用立即处理,大多需要优化代码。可参考原因部分,优化代码,调整GC参数。

厚积薄发 7803

海康威视 2DC 系列球机手机直连实用教程

海康威视2DC系列球机手机直连教程:首先确认设备支持直连功能并下载官方"海康互联"App;通过网线连接球机与路由器,使用SADP软件调整IP至同一网段;在App中添加设备并激活,完成调试即可远程查看监控画面。常见问题包括部分型号需远程解锁、网络连接异常等,可通过检查网络环境、联系客服等方式解决。本教程提供从准备到连接的完整指引,助您轻松实现手机监控管理。

海康威视技术支持 5406

如何定位和解决频繁Young GC问题

如何来分析一个项目的gc情况: 首先通过命令: jstat -gc pid 1000 1000来执行 分析 然后具体需要看如下这些指标 1.新生代对象增长的速率: 看EU指标的变化情况(一般会大致成线性变化) 2.Young GC的触发频率: 通过eden区的总大小除以新生代对象增长的速率 3.Young GC的耗时:通过看YGCT指标 4.每次Young GC后的存活对象大小:通过看S1U指标再ygc前后的变化情况(即当EU突然由一个很大的值变成一个很小的值时,可以看对应变化前后S1U的值) 5.每

m0_37900506的博客 7384

国产SR8201F以太网PHY芯片调试避坑指南:从机贴失败到杜邦线救场的实战记录

本文详细介绍了国产SR8201F以太网PHY芯片的调试避坑指南,涵盖硬件设计、PCB布局、SMT贴片及软件驱动等关键环节。通过实战案例解析,帮助工程师解决MII/RMII接口配置、电源设计、信号完整性等典型问题,提升以太网通信稳定性与EMC性能。

c6d7e8f9g的博客 1216

大众点评商家及评分数据(2012-2025)

大众点评及商家评分数据库全面覆盖全国范围内多个城市的商户信息,涵盖餐饮、购物、休闲娱乐等多个消费领域,包含商家基础信息、地理坐标、分类体系、经营状态、用户评价、消费水平及服务设施等共计28个字段。

Sunny9qx的博客 2693

频繁youngGC排查

效果:young gc max 从27次/分钟,降低到11次/分钟,STW time 从560ms,下降到250ms,服务每秒停顿时间变短了。动态平衡:应用没有设置eden区域大小(从参数上来看没有设置 –xmn ),默认eden 最小值是 总堆栈的5%,最大值为60%有时候默认分配的非常小,导致youngGC频繁。G1NewSizePercent 这个不是随便设置的,而是根据hickwall 中eden 的平均使用大小来计算的。eden 大小分为动态平衡和固定大小,如果不设置,则默认为动态平衡。

Yuan_Su_的博客 999

ICM20948 DMP代码详解(69)

ICM20948 DMP代码详解(69)

phmatthaus的专栏 617

面试:频繁YoungGC如何排查?影响和原因

面试官问:Young GC过于频繁有没有问题?如果有问题应该怎么排查和解决?本文就来探讨一下这个问题。

qq_32139981的博客 2492

Aurix TC3xx系列MCU ResourceM模块配置(多核资源分配)

为减轻主核的负载率或者平衡各个核的资源分配,通常需要把一些MCU内部资源分配到从核上,在EB tresos工具中,通过ResourceM模块实现多核资源分配。

m0_38045338的博客 1388

基于 ESP32 的分布式光伏微电网智能监控系统设计与实现

设备 / 模块连接 ESP32 引脚备注I2C 总线(SDA)GPIO21所有 I2C 设备共用I2C 总线(SCL)GPIO22所有 I2C 设备共用DS18B20(单总线)GPIO18单总线通信,需外接 4.7K 上拉电阻有源蜂鸣器GPIO19低电平触发,串联 100Ω 限流电阻ESP32 供电5V/GND由 LM2596 输出 5V 供电,或直接 USB 供电(调试阶段)INA219(光伏)光伏阵列正负极接 INA219 的 VIN+/VIN-

weixin_42300449的博客 303

线上环境出现频繁的Young GC,如何优化?

在Java应用程序中,垃圾回收(GC)是一个不可避免的过程,但频繁的Young GC会对应用程序的性能产生负面影响。这通常表明Young区(新生代)的内存分配不当或者存在其他性能问题。因此,优化Young GC是提高Java应用程序性能的关键步骤。本文档提供了一个详细的解决方案,包括问题确认、工具准备、参数调整、代码审查,以及修复和测试的全过程。同时,文档还包括一个模拟频繁Young GC的Java Demo以及相应的修复Demo。

新手学堂 4821

Linux系统安装部署Redis完整教程(图文详解)

最近需要在Linux服务器安装部署Redis,参考了网上很多的文章,比较零碎,所以我自己写了一篇完整的Redis安装部署文档,在部署Redis之前重装了我的华为服务器,就是为了给大家一步步阐述我的操作过程,配合图文进行讲解更加通俗易懂!

黄团团的个人博客 6692

GC/OOM问题处理思路

反射、动态代理等导致动态生成大量类元数据(以反射为例,当同一个反射方法被短时间执行16次,jvm会进行优化,生成对应反射接口的实现类的类元数据并存放到metaspace)。一般可以从近期代码变更中是否涉及反射、动态代理进行正向排查。解决思路一般是增加反射缓存(比如频繁生成Method的场景,就将Method进行缓存,这样只会生成一次对应的类元数据)、开启类卸载(CMS垃圾回收器)等。大对象或短时间大量对象,通过分析堆转储文件中的类视图(包含类的实例数、自身大小和关联的所有实例大小),定位问题类。

weixin_44810016的博客 427

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

JVM调优实战和常量池深度解剖

文章目录前言一、JVM调优的思路二、实例总结 前言 这次用一个实际的案例来详细说明如何进行jvm调优。深度分析生产环境中出现的问题的排查以及解决思路。希望大家认真看完,对jvm调优一定会提升很多。 一、JVM调优的思路 JVM运行情况预估 用 jstat gc -pid 命令可以计算出如下一些关键数据,有了这些数据就可以采用之前介绍过的优化思路,先给自己的系统设置一些初始性的JVM参数,比如堆内存大小,年轻代大小,Eden和Survivor的比例,老年代的大小,大对象的阈值,大龄对象进入老年代的阈值等。 年

今晚打老虎的博客 458

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

每日问答java基础篇

学习笔记,自看

qq_42728408的博客 314

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

JVM回收算法

Serial 串行年轻代回收器:单线程执行复制算法,多cpu场景下吞吐量低,用户线程长时间等待,适用于Java客户端或硬件不足的场景。SerialOld 串行老年代回收器:标记整理算法,虚拟机参数设置为,开启串行回收器。ParNew 并行年轻代回收器:多cpu优化的Serial,使用参数,老年代仍用串行的SerialOld。CMS(并发标记清除 Concurrent Mark Sweep):减少STW,使用参数,有内存碎片,老年代内存不足时无法分配对象,会退化为串行。

写代码的小阿帆的博客 786

每周小记——JVM

本文剖析JVM核心机制:详述内存模型(堆、方法区、栈)及垃圾回收算法(标记-清除/复制/压缩)、分代策略与GC类型(Minor/Major/FullGC);解析类加载机制(双亲委派模型、加载/链接/初始化过程及三类加载器差异);阐述执行引擎(JIT编译、热点探测、逃逸分析);对比现代收集器(G1/ZGC/Shenandoah)及CMS优劣;探讨性能调优关键(吞吐量与延迟平衡、内存分配策略)。为Java性能优化提供理论支撑。

weixin_57655687的博客 1583

二、JVM相关

定义:JVM内存模型可以分为线程共享区域(堆、方法区)和线程私有区域(程序计数器、虚拟机栈以及本地方法区)以及直接内存三大块,其中线程共享区域和线程私有区域又被称作运行时数据区域(Runtime Data Area)示意图JVM内存模型和Java内存模型(JMM)的区别**扩展:**与操作系统相对于硬件类似,操作系统需要抽象出内存模型,那么 Java语言也需要抽象出相对于操作系统的内存模型,这就是Java内存模型(JMM)。

恁爹的博客 512

Java:104-JVM优化

我们可以选择在idea中查看对应的class文件: 但是要注意:随着idea或者说jdk版本的不同,可能并不会出现这些东西或者少些或者有些不同,所以这里以上面的说明为主即可(我修改并整理的) 比如我这里就是这样: Java 虚拟机采用基于栈的架构,其指令由操作码和操作数组成,这些 字节码指令 ,就叫作 opcode,其中,getstatic、ldc、invokevirtual、return 等,就是 opcode,可以看到是比较容易理解的,因为根据后面的说明就是一个完整的System.out.print

qq_59609098的博客 1135

服务频繁发生YoungGC的处理过程(合理压测)

问题描述 最近一直在做项目的GC优化,因为服务在运行过程中频繁发生GC问题,虽然不是FullGC,但Young频繁GC也会影响线上服务的性能,优化的方向有两个,1.修改JVM参数 ,2.优化代码逻辑。查看当前线上JVM配置调整年轻代的大小可以缓解因内存分配太小而发生频繁GC的问题。本次优化的重点在于代码逻辑的实现,主要原因是: 在目前架构内,系统并不能通过改变eden区大小得到有效解决,年轻代内存区域调大,GC频率改善,但时长会变长。反之,作用也是相反。 频繁的GC和pause清理耗时又引起jvm内

AlgoRain的博客 4290

GC(Allocation Failure)引发的一些JVM知识点梳理

日前查看某个程序的日志,发现一直在报GC相关的信息,不确定这样的信息是代表正确还是不正确,所以正好借此机会再复习下GC相关的内容: 以其中一行为例来解读下日志信息: [GC (Allocation Failure) [ParNew: 367523K->1293K(410432K), 0.0023988 secs] 522739K->156516K(1322496K), 0.0025...

淡定一生2333的博客 14万+

频繁GC (Allocation Failure)及young gc时间过长分析 

序 本文主要分析一个频繁GC (Allocation Failure)及young gc时间过长的case。 症状 gc throughput percent逐步下降,从一般的99.96%逐步下降,跌破99%,进入98%,最低点能到94% young gc time逐步增加,从一般的十几毫秒逐步上升,突破50,再突破100,150,200,250 在8.5天的时间内,发生了9000多次gc,其中full gc为4次,平均将近8秒,大部分是young gc(allocation f...

大JAVA解决方案 9599

频繁Young GC 问题记录

1、问题:连续gc 每10s左右发生“一组”gc,每组基本是三次,如果按组的gc频率来看还算正常,但这个“一组”连续三次gc属实不太正常。 2、查看gc统计:jstat -gc 进程id 100 100ms的gc统计信息:其中连续gc三次,第一次gc后,发现内存每次增加80M左右,而第一次gc时其实eden还剩余40M的内存,所以判断此时有大对象在不断的快速生成。 3、jmap -histo:live 进程id |grep "cn" |head -20 想通过手动查看对比对象的内存..

零点五度 7496

游戏引擎jvm频繁young gc问题分析

问题背景: 阿里云vpc部署的游戏引擎服务端集群中有一个节点相对于其他节点来说ygc的次数远远超出正常情况,不过fgc次数是正常的。一般来说出现这种问题,首先要看下jvm gc图,后来发现基本都是par new复制标记算法,cms未出现过。 #查看java进程pid jpc -v #根据pid 来查看s0 s1 e 区 的占用情况 jstat -gcutil 9777 S0C S1C S0U S1U EC EU OC OU

qq_21981287的博客 2414

JVM 君,你是不是过分了???

如果你还没意识到学 JVM 的必要性,或者不知道怎么学 JVM,那么看完这篇文章,你就能知道答案了。曾经的我很不屑于学 JVM,但是后来发现不学不行。这就像和媳妇吵架之后我不想道歉一样,不道歉那是不可能的,道歉是早晚的事儿,逃不掉。 后来我明白了: 认怂越晚,结局越惨。 但是我学的时候才知道:JVM,你太过分了,太难学了! 我的学习过程可以说非常坎坷,不过经历坎坷之后,我倒是发现学 JVM 的门道很多。 以我的经验加上和同行们的交流,我认为学 JVM 最好的方法是: 在程序员不同的水平段,做精准的学习。

西八老码 872
上一篇: win10与linux以太坊客户端Geth私链搭建教程
下一篇: layui解决table表格某项内容过长导致挤开变形问题
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值