系统CPU飙高和频繁GC问题查询思路

JAVA CPU飚高排查方案和思路? 当Java程序CPU使用率异常飙高时,排查问题的方案和思路通常包括以下几个步骤: 阅读详情

处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次数过多的问题。当然,这些问题的最终导致的直观现象就是系统运行缓慢,并且有大量的报警。本文主要针对系统运行缓慢这一问题,提供该问题的排查思路,从而定位出问题的代码点,进而提供解决该问题的思路。

对于线上系统突然产生的运行缓慢问题,如果该问题导致线上系统不可用,那么首先需要做的就是,导出jstack和内存信息,然后重启系统,尽快保证系统的可用性。这种情况可能的原因主要有两种:

  • 代码中某个位置读取数据量较大,导致系统内存耗尽,从而导致Full GC次数过多,系统缓慢;
  • 代码中有比较耗CPU的操作,导致CPU过高,系统运行缓慢;

相对来说,这是出现频率最高的两种线上问题,而且它们会直接导致系统不可用。另外有几种情况也会导致某个功能运行缓慢,但是不至于导致系统不可用:

  • 代码某个位置有阻塞性的操作,导致该功能调用整体比较耗时,但出现是比较随机的;
  • 某个线程由于某种原因而进入WAITING状态,此时该功能整体不可用,但是无法复现;
  • 由于锁使用不当,导致多个线程进入死锁状态,从而导致系统整体比较缓慢。

对于这三种情况,通过查看CPU和系统内存情况是无法查看出具体问题的,因为它们相对来说都是具有一定阻塞性操作,CPU和系统内存使用情况都不高,但是功能却很慢。下面我们就通过查看系统日志来一步一步甄别上述几种问题。

1. 服务器CPU占用率高

 

首先我们可以使用top命令查看系统CPU的占用情况,如下是系统CPU较高的一个示例:

top 命令

 

可以看到,有一个Java程序此时CPU占用量达到了101.0%,此时我们可以复制该进程id 10241,并且使用如下命令查看呢该进程的各个线程运行情况:

 

top -Hp 10241

该进程下的各个线程运行情况如下

 

可以看到,在进程为10241的Java程序中各个线程的CPU占用情况,接下来我们可以通过jstack命令查看线程id为10362的线程为什么耗费CPU最高。需要注意的是,在jsatck命令展示的结果中,线程id都转换成了十六进制形式。可以用如下命令查看转换结果,也可以找一个科学计算器进行转换:

 

printf "%x\n" 10362

这里打印结果说明该线程在jstack中的展现形式为287a,通过jstack命令我们可以看到如下信息:

那么我们得到的就是一个线程的具体堆栈信息。如下是一个代码中有比较耗时的计算,导致CPU过高的线程信息:

 

这里可以看到,在请求ShippingTemplatesController的时候,由于该Controller进行了一个比较耗时的调用,导致该线程的CPU一直处于100%。我们可以根据堆栈信息,直接定位到ShippingTemplatesController的97行,查看代码中具体是什么原因导致计算量如此之高。

 

 

总结 

  以上,展示了一次比较完成的线上问题定位过程。主要用到的命令有: top 、printf 和 jstack

·

2:线上服务器频繁发生Full GC如何排查

相对来说,这种情况是最容易出现的,尤其是新功能上线时。对于Full GC较多的情况,其主要有如下两个特征:

  • 线上多个线程的CPU都超过了100%,通过jstack命令可以看到这些线程主要是垃圾回收线程
  • 通过jstat命令监控GC情况,可以看到Full GC次数非常多,并且次数在不断增加。

1:查看JVM堆配置参数

     jinfo -flag <name> PID   

     jinfo -flag ThreadStackSize 18348,得到结果-XX:ThreadStackSize=256,即Xss为256K

2:linux下查看java虚拟机(JVM)GC情况

jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

如下表示分析进程id为31736 的gc情况,每隔1000ms打印一次记录,打印10次停止,每3行后打印指标头部

jstat -gc -h3 31736 1000 10

3:导出堆栈的dump信息分析 

1,使用 jmap 命令生成 dump 文件,命令 jmap -dump:live,format=b,file=c:\dump\heap.hprof <pid>

  比如:jmap -dump:format=b,file=before.hprof 28679和jmap -dump:live,format=b,file=after.hprof 28679来dump堆快照文件也是可以的,加上live表示只保存存活对象。

2,使用 JVM 参数获取 dump 文件

      -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/base

      当OutOfMemoryError发生时自动生成 Heap Dump 文件。这可是一个非常有用的参数,因为当你需要分析Java内存使用情况时,往往是在OOM(OutOfMemoryError)发生时。

3,使用 jcmd 命令生成 dump 文件

     jcmd <pid> GC.heap_dump c:\dump\heap.hprof

 

4: 使用Eclipse MAT工具分析对快照

很显然可以看到堆内存被对象DoctorInvitePictureManagerImpl占用了811.8M,就是它导致了内存泄漏。剩下的就需要业务同学排查代码了。

cpu飙高的原因有哪些,什么思路去排查 CPU飙高不用慌,三步排查记心上:第一步,top看进程,确认Java是元凶;第二步,top -Hp看线程,找到吃CPU的凶;第三步,jstack转栈帧,定位代码看行踪。GC高用jstat看,锁竞争jstack多采样;火焰图用Arthas,内存泄漏jmap查。 阅读详情

相关推荐

Java生产环境CPU飙高排查实战:从快速定位到长效治理

在Java应用性能优化领域,CPU使用率异常飙高是常见的生产环境问题,其背后往往涉及线程调度、垃圾回收机制、锁竞争原理等JVM核心概念。理解CPU问题的本质,需要从操作系统进程管理、JVM线程模型与GC工作原理切入。通过系统监控工具(如top、vmstat)结合JVM诊断工具(如jstack、jstat)进行关联分析,可以快速定位热点线程与资源瓶颈。这种排查能力对于保障高并发服务的稳定性具有重要技术价值,广泛应用于电商、金融、云计算等对响应时间敏感的场景。本文基于实战经验,系统梳理了从快速止血到根因分析的全

weixin_30797199的博客 439

一次线上频繁FullGC的排查

背景 一日,线上的某个服务的某个节点突然告警,频繁地FullGC,这个服务已经有半个月没有进行过发布和容器重启了。 处理步骤 首先将告警的容器隔离,从网关上摘掉这个节点,让流量不再进入到这个节点。 通过jmap将节点的内存快照dump下来。 通过jprofiler分析hprof文件。 分析原因 有很多工具可以方便地分析hprof文件,如MAT、JProfiler。 我们通过JProfiler分析,在JProfiler的启动中心打开单个快照。 选择下载到本地的hprof文件,等待一会解析,然后直奔“最大

码农无双的博客 4571

先别急着怪GC:Java GC问题的性能标尺、触发原因解码与根因判定解析

接口毛刺出现时,GC常被第一个怀疑,却未必是元凶。本文先用单次停顿不超过TP9999、GC吞吐不低于99.99%两条约束,把SLA换算成每分钟6毫秒的停顿预算;再对照JDK 8到25的HotSpot源码解读GCCause,并在JDK 8上实测13种触发场景,发现禁用显式GC会连带屏蔽jcmd GC.run,JNI临界区可引发462次Full GC;又用一小时仿真比较时序、概率、实验、反证四种判因方法,揭示混杂与时长偏倚陷阱;最后按Mutator类型、九类问题和排查难度给出定位思路与适用范围。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 17万+

JVM 查看配置 jinfo 及使用 jstat,查看堆栈jstack及GC

JVM 查看配置 jinfo 及使用 jstat,查看堆栈jstack及GC

Du939的博客 1723

UE5实战:如何用Georeference插件搞定百度地图坐标转换(附完整代码)

本文详细解析了在UE5中使用Georeference插件实现百度地图坐标转换的全流程,包括BD-09到UE内部坐标的转换算法、UTM投影配置及性能优化技巧。通过完整代码示例和实战案例,帮助开发者高效解决数字孪生项目中的地理坐标转换难题。

weixin_30955617的博客 94

QGIS基于快鸟(QuickBird)影像统计小麦种植面积

​01数据情况 本次选用某地4月份快鸟(QuickBird)影像为例,使用QGIS演示提取小麦播种情况,并按照200米*200米分区计算种植面积的过程。 注:本文对应的操作视频作为今天第二篇推送同时发布,习惯看视频的朋友可以点击观看。 附数据压缩包: 链接:https://pan.baidu.com/s/1JVUS8uAOR61RxC1n9Or9_w 提取码:qgis 含快鸟影像QB_subset.tif和200*200米分区矢量图层200Mgrid.shp。 ...

QGISClass的博客 1979

JVM性能调优监控工具专题三:VisualVM基本篇之快照分析、监控GC、Eclipse集成

一、概述 上一个专题专门举例说明了使用VisualVM进行远程监控以及对Tomcat的远程监控,如果有兴趣,可以查看: http://josh-persistence.iteye.com/blog/2233459 该专题将讲解如何使用VisualVM生成快照、以及如何对JVM的GC进行监控,最后举例说明如何将VisualVM和eclipse进行集成。   二、快照功能 我们可以使用...

Josh_Persistence 945

物体检测之非极大值抑制:NMS、softNMS、softerNMS、IoU-Net

当前的物体检测算法为了保证召回率,对于同一个真实物体往往会有多个的候选框输出。由于多余的候选框会影响检测精度,因此需要利用NMS过滤掉重叠的候选框,得到最佳的预测输出。当前有如下几种较为常见的NMS方法, 1.基本NMS 非极大值抑制, 顾名思义就是抑制不是极大值的边框,这里的抑制通常是直接去掉冗余的边框。 这个过程涉及以下两个量化指标: 1.预测得分:NMS假设一个边框的预测得分越高,这个框...

LeoLee 1941

Go进程的HeapReleased上升,但是RSS不下降造成内存泄漏?

事情是这样的,线上一个服务,启动后RSS随任务数增加而持续上升,但是过了业务高峰期后,任务数已经下降,RSS却没有下降,而是维持在高位水平。 那内存到底被谁持有了呢?为了定位问题,我把进程的各项Go runtime内存指标,以及进程的RSS等指标持续采集下来,并以时间维度绘制成了折线图: 内存折线图 本着DRY原则,我把采集和绘制部分专门制作成了一个开源库,业务方代码可以十分方便的接入,绘制出如上样式的折线图,并通过网页实时查看。git地址:https://github.com/q191201771/p

猛犸象 1721

【深度学习】肺结节分割项目实战一:处理数据集

一、LIDC-IDRI数据集简介 官方网站 肺图像数据库协会的图像收集(LIDC-IDRI)包括诊断和带有病变注释标记的肺癌筛查胸部CT。这是一个网络公开的国际资源,用于肺癌检测和诊断的计算机辅助诊断(CAD)方法的开发、培训和评估。 数据集包含1018个病例,每个病例包括来自临床胸部CT扫描的图像和一个相关的XML文件,该文件记录了由四名经验丰富的胸部放射科医生进行的两阶段图像注释过程的结果。在最初的盲读阶段,每个放射科医生独立审查每个CT扫描,并标记出属于三种类型之一的病变(“结节>= 3mm”,

weixin_42182906的博客 1万+

实测避坑:用SGM61720做BUCK电路,SW引脚电压尖峰怎么压下去?

本文针对SGM61720在BUCK电路中SW引脚电压尖峰问题,提供实测避坑指南。通过分析电压尖峰、过冲等核心问题,详细讲解自举电阻调整、RC缓冲电路计算和PCB走线优化三大解决方案,帮助工程师有效降低SW引脚电压尖峰,提升系统稳定性和EMI性能。

weixin_42634811的博客 213

JVM频繁FullGC以及CPU占用过高问题

最近线上某个服务所有接口突然响应很慢,并且超时,一开始以为是网络的问题,分时段测试了一下,发现并没有太大问题,于是把问题聚焦到了服务本身,用top命令简单看下,CPU直接飙升到了800+%,好家伙,应该是存在明显问题了,经过一阵分析,问题解决,故记录一下排查过程,截图已经是解决后的效果,懒得再把代码换回去了,说明下思路即可。运气好的话,一般到这里,基本就能看出来出了问题的代码,如果没看出来,多查看几个线程的状态,对比分析一下,这里的截图只是做演示,所以是RUNNABLE状态,如果是wait,就要注意了;

weixin_45000157的博客 1876

21天学会基于 Linux 的 NPU 固件开发--2.2 固件加载流程:request_firmware() 深度解析

本文深度解析Linux内核中NPU固件加载流程,重点剖析request_firmware()机制。内容涵盖:1)内核态与用户态的交互机制,包括同步/异步加载方式;2)NPU固件的特殊格式与加载逻辑;3)调试技巧与安全验证方案;4)提供最小化固件加载器实验。文章揭示了从文件系统到硬件初始化的完整链路,探讨了大模型时代面临的性能挑战与优化方案,如零拷贝加载技术,并提出了版本兼容性、断电恢复等关键问题的思考方向。

amy_mhd的博客 59

线上问题——CPU、load过高

使用 arthas 排查(推荐) 这个要先装下开源的 arthas,更大的好处是直接可以在线上调试,见我的文章 线上排查问题利器——arthas 最繁忙的top 线程,根据堆栈去分析代码 thread -n 3 当前最忙的前N个线程并打印堆栈 原生方法 先确定是不是java进程 看进程里使用最高的线程 top -H -p pid 记录线程pid, 把线程的pid转成十六进制:printf "%x\n" threadPid, 转后线程pid是 newThreadPid 打印线程的堆栈信息:jstack

学习印记 Learning imprint 3383

SAP Fiori 从技术上而言到底包含哪些组件?

SAP Fiori是企业级UX设计的系统化解决方案,基于五大原则构建:角色导向(Role-based)、自适应(Adaptive)、简洁(Simple)、一致(Coherent)和愉悦(Delightful)。其技术实现包含SAPUI5开发框架、Fiori Launchpad统一入口、OData服务网关等核心组件,通过标准化设计模式与开发工具链,显著提升企业应用的用户体验和开发效率。典型案例显示,遵循Fiori原则可缩短30%以上的操作时长,降低50%的培训成本。该体系既保持跨设备一致性,又支持业务场景的深

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 223

升级最新IDEA版本(2022.1.1)

升级最新IDEA版本(2022.1.1)

软件老王 3万+

如何排查java应用中CPU使用率高或内存占用高的问题

如何排查java应用中CPU使用率高或内存占用高的问题?这类问题的排查步骤基本通用的。现在通过一个具体的例子来说明。

bobo哥写字的地方 3598

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Java线上项目cpu过高的排查思路

项目介绍 是给银行做的一个征信系统项目,业务如图 代码如下 问题 项目在linux运行一段时间后,发现cpu占用率越来越高,最终达到100% 排查步骤 1.top命令找到cpu占用高的进程号 发现进程号为2732 2.查看进程的所有线程信息,记下占用最高的线程 执行命令,单独监控该进程 top -p 2732 在界面按下H,获取当前进程下所有线程信息 占用cpu最高的线程为2734 **3.将第2步得到的线程号转化为十六进制 ** 将2734转化为十六进制数 **4.查看进程堆栈信息 ** 根据第1

cyh的博客 7496

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Linux服务器突发CPU飙高?一键定位脚本与排查思路

本脚本自动化了CPU飙高问题排查的数据收集过程,但最终的分析判断仍需你的智慧。找到谁在忙(进程、线程)。弄清楚它在忙什么(堆栈、火焰图)。采取正确的措施(修复、优化、扩容)。建议在日常就将此脚本部署到关键服务器上,或在镜像中打包,真正做到“一键定位”,为稳定护航。

Linlichaoblms的博客 938

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

JAVA应用频繁GC问题排查

本文记录了一次线上系统频繁GC问题的排查过程。通过分析GC告警和慢接口告警,发现商品应用product-dubbo存在74次/分钟的GC问题,同时伴随接口响应时间超过1秒的严重性能问题。排查思路包括:线程转储分析未发现CPU消耗或死锁线程,但Dubbo线程占比高达90%;进一步追踪发现MySQL异常和Druid连接池超时;通过Arthas工具定位到慢接口/api/product/client/list存在慢SQL,导致数据库连接池耗尽,进而阻塞Dubbo线程并引发频繁GC。最终解决方案包括:优化慢SQL、异

weixin_39723859的博客 1157

JVM调优实战:从Full GC频繁到CPU飙高的排查与优化

Java虚拟机(JVM)作为Java应用的核心运行时环境,其内存管理与垃圾回收机制直接影响着应用的性能与稳定性。理解JVM内存模型与垃圾回收原理,是进行性能优化的基础。通过建立可观测性体系,监控堆内存使用率、GC频率与耗时等关键指标,结合GC日志与线程快照分析,可以精准定位性能瓶颈。在工程实践中,针对Full GC频繁、内存泄漏、CPU负载高等常见问题,采取假设驱动的分析流程,能够有效提升系统吞吐量与响应速度。本文聚焦于JVM调优实战,深入探讨了如何通过参数调整与工具使用,解决线上环境中的性能问题,其中涉及

482

生产环境CPU100%、FGC频繁、服务OOM排查思路总结

生产环境CPU100%、FGC频繁、服务OOM排查思路与具体实现

自律使我自由 1564

jvm问题排查案例-cpu飙高

jvm问题排查一直没有自己的思路体系,这次测试环境发现了一个cpu飙高的问题,刚好用来实践一次,纸上得来终觉浅,绝知此事要躬行。最后捋一下思路和过程,记录 定位java进程 linux, top 命令,发现 23071进程cpu,内存均占比很高 排查cpu问题,对于jvm如何排查cpu占用?当然是要找到具体的内部线程 查看进程内的线程资源占用 使用命令,top -Hp 23071, 发现这些线程cpu占用很高,想要知道这些线程的信息,则必须借助jstack命令,而jstack中的线程号是

u010933982的博客 882

JVM 调优实战:内存溢出、GC 频繁问题定位思路

JVM 调优不是一劳永逸的,它是一个**“监控 -> 分析 -> 调整 -> 验证”**的持续循环过程。先软后硬:先优化代码(消除泄漏、减少对象创建),再调整参数,最后才考虑加机器。数据驱动:永远不要凭感觉调参,一切以 GC 日志和监控图表为准。灰度验证:任何参数变更,必须在预发环境充分压测,确认无误后再上线。拥抱新版本:JDK 17/21 的 GC 算法(ZGC/G1)已经非常智能,很多时候默认配置就是最好的配置,过度调优反而适得其反。🚀行动建议是否开启了 GC 日志?

2603_94941239的博客 548

记录线上服务频繁full gc问题排查

排查gc思路、方法论、过程 由于1-4的步骤通常可以让运维去执行,目前公司生产则一律由运维管理,所以直接找运维dump堆内存文件即可 1、检查JVM配置 2、观察监控信息中老年代内存变化 3、通过jmap命令查看堆内存中的对象 通过命令 jmap -histo 7276 | head -n20 图片是借助网图,因生产没权限只有运维来执行

刘子帆的博客 2407

Java性能调优——线上问题排查

预备知识 top命令 top命令使我们最常用的Linux命令之一,它可以实时的显示当前正在执行的进程的CPU使用率,内存使用率等系统信息。top -Hp pid 可以查看线程的系统资源使用情况。 jstack命令 jstack是JDK工具命令,它是一种线程堆栈分析工具,最常用的功能就是使用 jstack pid 命令查看线程的堆栈信息,也经常用来排除死锁情况。 mat内存工具 MAT(Memory Analyzer Tool)工具是eclipse的一个插件(MAT也可以单独使用),它分析大内存的dump文件

架构始于理论,终于落地 806
上一篇: 消息队列(基础篇)-5 如何确保消息不会丢失?
下一篇: 消息队列(基础篇)-6 如何处理消费过程中的重复消息
木木那年
博客等级 码龄12年 37粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值