记一次不太成功的频繁 full gc 排查过程

一次频繁Full GC的排查过程 问题描述最近公司的线上监控系统给我推送了一些kafka lag持续增长的消息,我上生产环境去看了相应的consumer的情况,发现几台机器虽然还在处理消息,但是速度明显慢了很多。问题猜测与验证我猜测是JVM频繁做Full GC,导致进程也跟着频繁卡顿,处理消息的速度自然就慢了。为了验证这个想法,先用jstat看看内存使用情况: jstat -gcutil 1 1000 #1是进程号 结果如我所 阅读详情

上周自己负责的一个应用出现频繁full gc的问题,不得不尝试优化一下。第一次做这种事只能先看看网上的文章,然后亲自尝试怎么去完成减少full gc的频率,降低young gc的频率这一目标。虽然最终只是勉强解决了,但还是希望记录下来给下一次积攒经验。

选取了上周优化前后的两个典型工作日上午9:00到晚上9:00的GC情况。优化前一天要发生高达上10次的full gc,young gc也非常频繁。优化后的图已经没有出现full gc,young gc的频率也大大降低了,所以说基本完成目标。

接下来说明排查过程

1.jps命令查看进程id

jps是java后自带的查看虚拟机进程状态命令工具,用如下命令就可以看到虚拟机执行主类和进程ID.
jps -l

2. jmap命令导出堆转储文件

jmap是java自带的内存映像工具,能将当前应用运行内存的情况导出为文件。注意格式,file后面是导出路径,最后的数字为上一步得到的进程id。一般导出来的文件都比较大,我导出的有2.1G,而且进行分析也很耗性能,所以导出后都要传输到其它机器上进行分析,并且为了避免占用磁盘空间删除本地文件。
jmap -dump:format=b,file=kfwebHeap1016.hprof 35073

3.mat工具分析堆转储文件

mat是eclipse提供的堆转储文件分析工具,用mat打开mat上一步导出的文件,如下图所示,可以看到总体内存占用情况的扇形图,哪个文件占用内存最多就可以一目了然了。

点击histogram就可以看出各个对象的内存占用情况,如下所示

点击Leak Suspects就可以给出最有可能发生内存泄漏的几种情况。能很好的帮助用户进行内存分析,这也是mat强大的重要体现,如下:

到这里应该是最关键的环节了,可能因为没有经验,看来看去也没看出哪里不对,所以只能作罢,这条路已经走不下去了,所以说这次分析不太成功。

4.G1来了

后来向一个老同事说明了我的情况,他问我用的什么垃圾回收器,我说用的是默认的,年经代用Parallel Scavenge,老年代用Parallel Old,他说让我先换到G1试试吧。然后我查了一下,发现G1果然比较牛逼,虽然保留了以前的新生代Eden,Survivor和老年代的概念,但新生代和老年代不再物理隔离,而且它将内存分为很多等大的region,每个region根据需要都有可能成为S(Surviror),E(Eden), O(Old)的一种,所以G1既能回收新生代也能回收老年代,它以垃圾回收为第一(这也是它名字的由来:Garbage First,G1)目标,励志于取决CMS, 并且在java9是已经是jdk默认的垃圾回收器了。说了这么多,暂时没有多时间深入研究,不管怎么样还是值得一试的。于是在应用的jvm启动参数加了如下一行:
-XX:+UseG1GC
当然只是在一台机器上作了处理,也便于与其它机器作对比。

5.MetaSpace调整

通过调整后的这台机器与其它机器对比,gc情况还是改善了不少,但是在查看gc日志时发现了这么这个频繁出现的问题:
Metadata GC Threshold
由于元数据空间不足导致的GC.原来在G1中设置PermSize(永久代大小)已经没用了,取而代之的是MetaSpace参数,虽然这个用的是并非堆内存而是机器的物理内存并且最大大小没有限制,但是默认初始大小只有20m,所以要作出调整:
-XX:MetaspaceSize=128m
加了之后果然就没有出现这个问题了

6. 解决Humongous Allocation

在gc日志中还发现频繁出现:
G1 Humongous Allocation
这个是由于大型对象分配导致的问题,大型(Humongous)对象是指超过G1的Region 50%的内存对象,频繁大型对象内存内存分配会导致性能问题,而且如果一个region中大型对象过多的话则最后一个大型对内象边界和该region的边界之间的空间将不会被使用,如果有多个这样的region将会导致堆内存的碎片化,在jdk1.8u40之前这些大型对象的清理在full gc期间进行完成。较新的jvm也是把大型对象放在清理阶段,要解决上面的问题有两种方法。
1.增加region的大小(注意要在1到32m之间并且为2的整数次幂)
2.增加堆内存大小

总结:其实这一次只是引进了G1垃圾回收器并且对相关参数进行调整,但是促使我去了解jvm相关的知识和工具使用,还是有很很大收获的


作者:Acamy
链接:https://www.jianshu.com/p/900d7376b8b1

—————END—————

更多精彩:Java实战项目视频,给需要的读者,收藏!
SpringBoot 如何上传大文件?
微信支付的软件架构到底有多牛?
Java常用的几个Json库,性能强势对比!
求求你们了,别再写满屏的 if/ else 了!
基于Spring+SpringMVC+Mybatis的分布式敏捷开发系统架构(附源码)

关注公众号,查看更多优质文章
最近,整理一份Java资料《Java从0到1》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。获取方式:关注公众号并回复 Java 领取,更多Java内容陆续奉上。
明天见(。・ω・。)ノ♡
线上问题——频繁 Full GC 问题的排查思路 启用 GC 日志分析 GC 日志内容选择合适的垃圾回收器调整垃圾回收器参数实时监控内存使用情况分析监控数据 阅读详情

相关推荐

频繁full GC排查

场景:通过prometheus去拉取通过actuator组件暴露的端点中的JVM相关指标。通过告警规则,检测线上服务出现频繁full gc。

小太阳DENGJIE的博客 2635

full gc过于频繁该怎么解决

full gc过于频繁该怎么解决

泡^泡 5390

Full GC 排查的方式有哪些?

Full GC(Full Garbage Collection) 是 Java 虚拟机(JVM)中的一种垃圾回收机制,它会清理整个堆内存(包括新生代和老年代),通常会导致应用程序暂停(Stop-The-World)。Full GC 的频繁发生会严重影响系统性能,因此需要及时排查和优化。以下是排查 Full GC 的常见方式:使用监控工具可以实时观察 JVM 的内存使用情况和 GC 行为。jstat: 关键指标: :Full GC 次数。 :Full GC 总耗时。 :GC 总耗时。 jmap:

qq_36929638的博客 1367

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

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

新手学堂 4821

gitlab远程子仓库配置SSH - 保姆级教程

在网上搜索了一些方法,但是不够详细,走了好多弯路,所以记录下配置SSH的详细过程吧。

是菠萝的博客 1万+

小程序结合Three.js与gsap:打造流畅3D动画的完整指南

本文详细介绍了如何在小程序中整合Three.js与GSAP动画库,打造流畅的3D动画效果。通过从环境搭建、基础场景创建到模型加载与复杂动画编排的完整指南,帮助开发者克服小程序性能限制,实现如商品360度展示等沉浸式交互体验,提升产品视觉吸引力。

python9snake的博客 546

严重Full GC问题

综上所述,针对Full GC导致系统卡死的问题,需要综合考虑堆内存大小、内存泄漏、大对象处理、Finalizer的使用以及并发线程数等因素,通过优化配置和代码改进,来降低Full GC的频率和影响,提高系统的稳定性和性能。内存泄漏:Full GC通常是在老年代进行的,如果应用程序存在内存泄漏问题,老年代的对象会持续增加,导致Full GC的时间越来越长,最终引发系统卡死。优化大对象的处理:对于频繁创建的大对象,可以考虑使用对象池或者重用对象,以减少Full GC的负担。

kankan_s的专栏 1739

闲鱼客户端三重动态签名机制解析:x-sign、x-mini-wua与x-umt

在移动客户端安全通信中,设备级动态签名已成为主流App防范自动化攻击的核心手段。其原理是将设备指纹、运行时行为与可信硬件标识深度融合,生成不可复用、不可跨端、不可静态伪造的请求凭证。这类机制超越传统Token或Session鉴权,具备强上下文绑定性与实时熵值校验能力,广泛应用于电商、社交及开放平台等高风险接口场景。技术价值体现在有效识别模拟器、无头浏览器与集群化爬虫,同时保障多端一致性与合规数据对接。本文聚焦闲鱼客户端实际落地的x-sign(带设备上下文的混合签名)、x-mini-wua(小程序行为水印)与

weixin_35732273的博客 495

记一次JVM生产OOM及后续调优

上线后使用jstat大致监控一下JVM的gc状况,jstat命令使用。 查看到服务有过2次full gc,这是不应该发生的,因为这是个网关服务,绝大多数对象都是请求级别的生命周期,基本不会有长期对象产生,也不会有持续的大对象产生,所以不应该发生full gc才对。 服务启动时有加上-XX:+PrintGCDetails,找到gc日志,找到第一次full gc的位置: 非常清晰的标出了是Metasp...

qq_22606825的博客 851

Comsol单层焊缝焊接数值模拟:温度场与应力场全流程解析

在工程制造领域,有限元模拟是研究焊接热-力行为、优化工艺参数的重要工具。焊接过程涉及强烈的局部加热和快速冷却,材料经历复杂的非线性和相变,必须通过瞬态分析和热-力顺序耦合,才能准确捕捉移动热源作用下的温度演化与应力塑性积累。这一技术广泛应用于压力容器、船舶结构、车辆制造等场景,用以预测残余应力与变形、评估冷裂纹风险,并为工艺设计提供定量支撑。焊接数值模拟能否真正指导实践,关键在于热源校核、随温度变化的材料参数、合理的边界条件与网格策略。单层焊缝作为焊接模拟的基础模型,涵盖了移动热源加载、熔池形成、高温软化与

weixin_30444111的博客 221

浮点数加法器设计

一.设计内容及其要求 内容 根据浮点数的运算规则和IEEE754标准,实现浮点数的加法运算器。 要求: 浮点数格式:符号位1位,阶码8位,尾数23位 要求该实验能完整的体现浮点数的运算的五个步骤:对阶、尾数求和、规格化、舍入(要求使用对偶舍入)、溢出判断。 二.基本要素 浮点数 浮点数即实数,实数是所有有理数和无理数的集合。它之所以被称作浮点数,是因为小数点在数中的位置并不是固定的。一个浮点数值分为两部分存储:数值以及小数点在数值中的位置。 计算机中的浮点运算的计算结果一般是不确定的,一块芯片的浮点运算

Phoenix_ZengHao的博客 1万+

JVM-参数篇

JVM参数类型 标配参数:-version;-help等 jdk一出生基本就有的 X参数:-Xint(解释执行);-Xcomp(首次使用就编译成本地代码);-mixed(先编译再执行的混合型) XX参数:在日常参数调优中最多使用的,下文我们也主要分析这个类型 XX参数 XX参数分为两中类型: boolean型 kv设值型 ...

一颗旋转的螺丝钉 514

OpenCV视频防抖算法实现与优化指南

本文详细解析了如何使用OpenCV实现视频防抖算法。通过特征点检测与光流跟踪估算帧间运动,利用滑动平均平滑运动轨迹,并应用仿射变换重塑视频帧。文章提供了完整的代码实现、参数调优指南及黑边处理等优化技巧,帮助开发者高效处理手持拍摄等场景下的视频抖动问题。

weixin_29062823的博客 339

full gc频繁有什么问题_记一次不太成功的频繁 full gc 排查过程

上周自己负责的一个应用出现频繁full gc的问题,不得不尝试优化一下。第一次做这种事只能先看看网上的文章,然后亲自尝试怎么去完成减少full gc的频率,降低young gc的频率这一目标。虽然最终只是勉强解决了,但还是希望记录下来给下一次积攒经验。选取了上周优化前后的两个典型工作日上午9:00到晚上9:00的GC情况。优化前一天要发生高达上10次的full gc,young gc也非...

weixin_31845811的博客 1519

xtop:multi_driven_net与incomplete_timing_cell fail reason 分析

man multi_driven_net”可以得知,这个问题是multi driven结构引起的,使用命令“get_failed_pins -reason multi_driven_net”,获取violation pin。“man incomplete_timing_cell”可以得知,这个fail reason的原因是缺少timing library cell,检查并补全后这个错误就显示了。这里选择的解决方法是修改lib文件,把inout改成input,重新lib2idb。通过这种方法解决了问题。

m0_61544122的博客 566

eNSP常见故障处理

eNSP无法启动设备一直停在#井号的问题的解决方案?

lvshiliang123的博客 2万+

full gc频繁有什么问题_记一次不太成功的频繁full gc排查过程

上周自己负责的一个应用出现频繁full gc的问题,不得不尝试优化一下。第一次做这种事只能先看看网上的文章,然后亲自尝试怎么去完成减少full gc的频率,降低young gc的频率这一目标。虽然最终只是勉强解决了,但还是希望记录下来给下一次积攒经验。选取了上周优化前后的两个典型工作日上午9:00到晚上9:00的GC情况。优化前一天要发生高达上10次的full gc,young gc也非...

weixin_42395740的博客 348

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

内存很空却频繁gc_记一次不太成功的频繁full gc排查过程

上周自己负责的一个应用出现频繁full gc的问题,不得不尝试优化一下。第一次做这种事只能先看看网上的文章,然后亲自尝试怎么去完成减少full gc的频率,降低young gc的频率这一目标。虽然最终只是勉强解决了,但还是希望记录下来给下一次积攒经验。选取了上周优化前后的两个典型工作日上午9:00到晚上9:00的GC情况。优化前一天要发生高达上10次的full gc,young gc也非...

weixin_39747075的博客 275

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

内存很空却频繁gc_记一次不太成功的频繁 full gc 排查过程

上周自己负责的一个应用出现频繁full gc的问题,不得不尝试优化一下。第一次做这种事只能先看看网上的文章,然后亲自尝试怎么去完成减少full gc的频率,降低young gc的频率这一目标。虽然最终只是勉强解决了,但还是希望记录下来给下一次积攒经验。选取了上周优化前后的两个典型工作日上午9:00到晚上9:00的GC情况。优化前一天要发生高达上10次的full gc,young gc也非...

weixin_39614228的博客 242

深入探究 JVM 频繁 Full GC 的排查过程

在当今软件开发领域,Java语言以其跨平台性、面向对象、高性能等特点成为了广泛应用的首选之一。而Java应用程序的核心执行环境就是Java虚拟机(JVM),它负责将Java字节码翻译成机器码并执行,是Java程序运行的基础。在JVM的内存管理机制中,垃圾回收(GC)是一个至关重要的部分,负责释放不再被引用的对象占用的内存空间,以确保应用程序的稳定性和性能。

fudaihb的博客 3565

JVM频繁Full GC问题的排查与解决方案

堆内存(Heap Memory):这是Java对象的主要存储区域,分为年轻代(Young Generation)和老年代(Old Generation)。栈内存(Stack Memory):每个线程的栈用于存储局部变量和方法调用的上下文。永久代(PermGen)/元空间(Metaspace):存储类的元数据。在JDK 8之前是永久代,之后被元空间取代。

lssffy的博客 4392

【故障排查】tomcat session堆积导致内存占满频繁Full GC

一、故障发生 从一周前开始陆续接到线上用户反馈说接口访问偶发延时过大,频率大概是10%,延时8s左右。通过查看日志发现,有时上游服务发出请求后七八秒钟后本服务才收到请求,有时是本服务发出请求后七八秒钟后下游服务才收到请求,加之本服务已经在线上4个月没修改过代码没重启了,猜测可能是网络原因。找运维看了好几天也没发现大问题。 二、问题排查 1. 发现线索 偶然翻看线上gc日志,发现隔几分钟就会...

luxiaoqiba的博客 4332

什么情况下会发生full Gc?如何排查频繁发生full Gc的原因?

GC就是Java的垃圾回收机制,要了解什么情况下会发生GC(即GC得触发条件),我们需要先了解JVM的内存模型结构,之前一篇文章已经详细讲解了Jvm的内存模型结构,而通常来说,GC主要针对的是堆(java heap)区。 而java heap是分代的(年轻代和老年代),为什么要分代?其实也不难理解,分代就是为了优化性能,如果不分代,那就会导致所有对象揉在一块,那样GC就会对堆区域进行全扫描。所以...

weixin_39309402的博客 3万+

一次频繁Full GC问题排查过程分享

问题描述 应用收到频繁Full GC告警 问题排查 登录到对应机器上去,查看GC日志,发现YGC一分钟已经达到了15次,比Full GC还要频繁一些,其中Full GC平均10分钟超过了4次,如下图 使用jstat -gcutil 5280 1000查看实时GC情况,年老代采用的是CMS收集器,发现触发Full GC的原因是年老代占用空间达到指定阈值70%(-XX:CMSInitiatin...

vwycm的博客 1638

记一次生产环境频繁 Full GC 的排查

这次事故折腾了整整三天,说起来都是些很基础的知识点,但真到了线上排查的时候,很容易被表面现象带偏,走很多弯路。做技术这么多年,见过太多线上事故,根源往往都不是什么高深的技术难题,就是一些不起眼的小细节,一些想当然的 “应该没问题”。比如默认公共组件是靠谱的,默认写代码的人会记得清理,默认定时任务和 web 请求走一样的链路。但线上环境从来不会跟你讲 “默认”,只要有一个地方没考虑到,它就会在你最意想不到的时候炸给你看。还有一点感触很深:线上排查千万不要急着下结论。

acd12009的博客 814
上一篇: ​LeetCode刷题实战98:验证二叉搜索树
下一篇: 阿里双11突遭断网断电!最惊险一幕刚刚曝光
编程IT圈
博客等级 码龄6年 1130粉丝 544原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值