JVM飙高排查脚本-结构分析

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

该文章来自于阿里巴巴技术协会(ATA)精选文章。
大家都有过遇到线上程序LOAD突然狂飙的场景,要排查到为何狂飙,我们当务之急就是要找到导致CPU飙升的原因。如果是进程级的应用,如Nginx、Apache等都还比较容易排查,但如果是JVM中的某个线程导致的,估计有人就要开始抓瞎了。

很多人都或多或少的知道有这么一个脚本,能帮你大致定位到现场导致LOAD飙升的JVM线程,脚本大概如下。

#!/bin/ksh

# write by    : oldmanpushcart@gmail.com
# date        : 2014-01-16
# version     : 0.07

typeset top=${1:-10}
typeset pid=${2:-$(pgrep -u $USER java)}
typeset tmp_file=/tmp/java_${pid}_$$.trace

$JAVA_HOME/bin/jstack $pid > $tmp_file
ps H -eo user,pid,ppid,tid,time,%cpu --sort=%cpu --no-headers\
        | tail -$top\
        | awk -v "pid=$pid" '$2==pid{print $4"\t"$6}'\
        | while read line;
do
        typeset nid=$(echo "$line"|awk '{printf("0x%x",$1)}')
        typeset cpu=$(echo "$line"|awk '{print $2}')
        awk -v "cpu=$cpu" '/nid='"$nid"'/,/^$/{print $0"\t"(isF++?"":"cpu="cpu"%");}' $tmp_file
done

rm -f $tmp_file

现在我们就来拆解其中的原理,以及说明下类似脚本的适用范围。

步骤1:dump当前JVM线程,保存现场
JAVAHOME/bin/jstack pid > $tmp_file
​保存现场是相当的重要,因为问题转瞬之间就会从手中溜走(但其实LOAD的统计机制也决定了,事实也并不是那么严格)

​步骤2:找到当前CPU使用占比高的线程
ps H -eo user,pid,ppid,tid,time,%cpu –sort=%cpu

alt

列说明

USER:进程归属用户

PID:进程号

PPID:父进程号

TID:线程号

%CPU:线程使用CPU占比(这里要提醒下各位,这个CPU占比是通过/proc计算得到,存在时间差)

步骤3:合并相关信息
我们需要关注的大概是3列:PID、TID、%CPU,我们通过PS拿到了TID,可以通过进制换算10-16得到jstack出来的JVM线程号​

typeset nid=”0x” (echo" line”|awk ‘{print $1}’|xargs -I{} echo “obase=16;{}”|bc|tr ‘A-Z’ ‘a-z’)
最后再将ps和jstack出来的信息进行一个匹配与合并。终于,得到我们最想要的信息

alt

适用范围说明
看似这个脚本很牛X的样子,能直接定位到最耗费CPU的线程,开发再也不用担心找不到线上最有问题的代码~但,且慢,姑且注意下输出的结果,State: WAITING 这是这个啥节奏~

alt

这是因为ps中的%CPU数据统计来自于/proc/stat,这个份数据并非实时的,而是取决于OS对其更新的频率,一般为1S。所以你看到的数据统计会和jstack出来的信息不一致也就是这个原因~但这份信息对持续LOAD由少数几个线程导致的问题排查还是非常给力的,因为这些固定少数几个线程会持续消耗CPU的资源,即使存在时间差,反正也都是这几个线程所导致。

这里分享下淘宝内部经常排查到的几个有问题线程,大家如果用到了又遇到LOAD突然飙高,可以优先怀疑他们。

Forest、CatServer、Notify

转自:http://yq.aliyun.com/articles/55

【java】JVM中Perm区持续上涨问题 1.概述 转载:JVM中Perm区持续上涨问题 Java应用Perm区一直呈上涨趋势的原因可以用一个简单的办法排查,就是用btrace去跟踪下是什么地方在调用ClassLoader.defineClass,在大多数情况下这招都是管用的。 Perm区存放的啥信息? Perm叫做持久代,存放了类的信息、类的静态变量、类中final类型的变量、类的方法信息,Perm是全局共享的,在一定条件下会被GC掉,方所要承载的数据超过内存区域后,就会出现OOM异常。可以通过-XX:PermSize和-XX:MaxPermS. 阅读详情

相关推荐

手把手教你配置RK3588的FFmpeg+RKmpp:从解码到RGA转换的完整避坑指南

本文详细介绍了在RK3588平台上配置FFmpeg+RKmpp进行硬件解码和RGA图像处理的完整流程,包括环境准备、DRM Prime解码输出实战、RGA硬件加速转换技巧以及全链路性能调优。通过具体代码示例和问题排查指南,帮助开发者高效实现视频处理流水线,显著提升性能并降低CPU占用率。

weixin_28366475的博客 475

jvm 收集故障现场脚本

有时候监控系统显示XXX-java应用出现高cup、高io、高内存,该怎样去定位及解决呢,解决思路在《故障诊断》,以下是收集现场证据,便于定位问题 JAVA_HOME=/usr/java OUTPUT_HOME=~/output DEPLOY_HOME=`dirname$0` HOST_NAME=`hostname` DUMP_PIDS=`ps --no-h...

布道 2601

fpga的希尔伯特变换实现

fpga的希尔伯特变换实现零.实现背景一.希尔伯特实现的基本原理2.实现1)matlab仿真1)fpga滤波器实现实现成本:fpga实现采用VIvado的FIR的IP核, 零.实现背景 因为今明工作项目需要使用到希尔伯特变换来处理问题,所以顺便就把设计流程和代码都整理下来,以便供他人使用。选用Xilinx的7系列板子,Vivado平台。 一.希尔伯特实现的基本原理 希尔伯特变换的物理意义十分简单:...

weixin_42219690的博客 1万+

Java平常中用到的一些脚本(收集)

脚本使用及配置

weixin_47181095的博客 1048

别再手动配电脑了!手把手教你用Windows Server 2022搭建企业AD域(附DNS配置避坑指南)

本文详细介绍了如何使用Windows Server 2022搭建企业AD域,提升20+终端的管理效率。通过实战案例和避坑指南,解析AD域的核心价值、部署步骤及DNS配置技巧,帮助企业实现集中权限管理、安全策略统一部署,显著降低IT运维成本。

weixin_30652897的博客 351

ZLMediaKit在Windows下启用WebRtc编译(64位)

准备软件 cmake-gui vs2017 已经编译好的windows版本openssl(下载地址) 当然,你完全可以自己按照openssl的官网教程自己编译windows版本的openssl libsrtp编译安装 首先,需要将下载好的openssl解压并添加到环境变量。如下图,将下图路径添加到环境变量 其次,下载libsrtp(下载地址) 下载后解压并新建build文件夹,如下图: 在合适位置新建文件夹放置install后的srtp文件,如"D:\develop20..

byna11sina11的博客 1万+

线程池踩坑记 --load飙高的原因

去年处理过一个美图的问题,最近又碰到类似问题了,发现跟美图那个案例原因是一样的,在这里拿出来给大家分享一下。 应该是去年6月底,我们私有化发布了新版本,然后就拿去给美图客户安装部署了,美图的美拍应用访问量较大,新版本部署后问题不断,后来我接手去处理,在这之已出过不少问题,客户也不怎么配合了; 问题现象:美图客户的运维说,听云应用kafka积压消息,backend不工作了,重启后不久服务器loa...

zqz_zqz的博客 5258

告别付费!手把手教你用DataV.GeoAtlas获取全国街道级GeoJSON数据(附完整避坑指南)

本文详细介绍了如何免费使用阿里云DataV.GeoAtlas工具获取全国街道级GeoJSON数据。通过可视化选取、格式转换、数据校验等步骤,提供了一套完整的避坑指南和工作流,帮助前端和可视化开发者高效解决高精度地图数据获取难题,节省成本并提升开发效率。

weixin_29085865的博客 905

JVM 之 线上诊断神器Arthas实战【内部原理?常用命令?如何使用Arthas排查cpu飙高、类加载问题、死锁、慢接口等线上问题?】

JVM 之 线上诊断神器Arthas【常用命令?如何使用Arthas排查cpu飙高、类加载问题、死锁、慢接口等问题?】 Arthas 是什么?解决了什么问题?怎么解决的这些问题?有哪些常用命令? 线上cpu飙高、死锁、慢接口、类加载问题等场景通过Arthas排查定位的思路及具体实施步骤? cpu: thread - n 3 -> jad -> profiler 死锁: thread -b 慢接口: trace -> watch 类加载问题:sc -> jad ->classloader

人生快意事,读的好书,觅得良友 1118

工程伦理ppt

工程伦理学 第一章 工程与伦理 1.1 如何理解工程 一、技术与工程的区别 二、技术与工程的联系 三、工程的定义 五、工程具有不确定性和探索性 六、理解工程活动的7个维度 1.2 如何理解伦理 一、道德与伦理 二、不同的伦理立场 三、伦理困境与伦理选择 1.3 工程实践中的伦理问题 一、工程活动中的行动者网络(具有动态性和网络性) 二、主要的工程伦理问题 三、工程伦理问题的特点 1.4 如何处理工程实践中的伦理问题 一、工程实践中伦理问题的辨识 二、处理工程伦理问题的基本原则 三、应对工程伦理问题的基本思路

weixin_51656605的博客 7万+

FLAC3D数值三轴测试

本文介绍了使用FLAC3D进行数值三轴测试的命令流程。通过建立圆柱体模型,设置Mohr-Coulomb本构模型及材料参数,施加边界条件和荷载,并定义Fish函数监测应变和应力。命令包括模型创建、网格划分、材料属性定义、边界约束、荷载施加以及结果监测等步骤。该流程可用于模拟岩土材料在三轴条件下的力学响应,为数值分析提供参考。完整代码可从指定链接下载获取。

qq_36980284的博客 99

使用shell脚本快速定位Linux服务器CPU突然飙高问题

CPU飙高问题分析脚本

weixin_44798288的博客 2170

基于LSTM GRU RNN的交通流量预测-完整数据代码

基于LSTM GRU RNN的交通流量预测-完整数据代码

923

线上CPU飙高排查

修复死循环、简化密集计算、优化对象创建避免内存泄漏、合理配置线程池与锁、错峰执行定时任务。导出堆文件用MAT分析内存问题,同时结合监控、日志、定时任务综合排查,先止损再修复代码。第二类是GC异常:内存泄漏、频繁Full GC/YGC,GC线程占用大量CPU;看线程栈,业务线程卡在业务代码就是死循环/计算;第一类是业务代码问题:死循环、递归无退出、密集计算、频繁创建对象;查看进程内线程,找到CPU最高的线程ID,转为十六进制;第三类是并发问题:锁竞争、线程池不合理、线程空转;看到GC频繁,就是GC问题。

手写ArrayList 271

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

JVM 调优与线上排障:参数工具内存泄漏和CPU飙高

JVM调优的核心是建立闭环排查机制,而非盲目调整参数。文章系统介绍了JVM调优的关键要点:参数设置位置(不同部署方式)、常见调优参数(堆内存、GC等)、容器环境注意事项(内存边界控制)、GC日志分析方法和内存泄漏/CPU飙高的排查思路。重点强调调优应基于证据链(监控数据+日志分析),通过工具链(jstack/jmap等)定位问题根源,并提供了典型场景的排查流程图和实用命令集。

风雨未有归期的博客 443

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

JVM 线上调优与排查指南

提高吞吐量:减少 GC 时间,提高应用处理能力降低延迟:减少 GC 停顿时间,提高响应速度减少内存占用:优化内存使用,避免内存泄漏提高稳定性:避免 OOM,提高系统稳定性监控先行:先监控再调优,基于数据做决策参数调优:合理设置内存、GC 等参数问题排查:掌握各种排查工具和方法持续优化:持续监控和优化性能# 生产环境推荐配置 -Xms4g -Xmx4g -Xmn2gjps:查看 Java 进程jstat:监控 JVM 统计信息jmap:生成堆转储文件jstack:生成线程转储文件。

先度过菜鸟阶段 530

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

服务器异常排查实战:从CPU飙高到揪出元凶的完整指南

在运维工作中,服务器性能下降和资源异常是常见挑战,尤其是CPU飙高、内存耗尽或磁盘IO瓶颈等问题,往往让工程师手忙脚乱。面对这类故障,盲目重启或删除文件不仅无法根治,还可能丢失关键取证信息。正确的做法是建立一套系统化的排查流程:从整体负载、进程状态、网络连接、系统日志到登录记录,逐层分析,快速定位资源型、入侵型或配置型元凶。掌握Linux核心命令如top、ps、ss、lsof等,并借助快照脚本固化现场,是高效故障排查的基础。这些方法不仅适用于云服务器和自建机房,也能显著提升运维人员的应急响应能力。通过合理的

weixin_30984001的博客 282

JVM线上故障排查的基本操作

线上经常会遇到各种各样的问题,CPU 飚高,内存溢出,频繁 GC。总的来说,基本上就是cpu、磁盘、内存以及网络等相关问题,所以进行排查时候尽量四个方面依次排查一遍。同时例如jstack、jmap等工具也是不囿于一个方面的问题的,基本上出问题就是df、free、top 三连,然后依次jstack、jmap伺候,具体问题具体分析即可。

weixin_43994761的博客 382

【JVM】元空间内存溢出导致频繁FullGC,CPU飙高

页面卡住,查看服务器资源,CPU飙高,top -H看到线程多是GC Thread,而内存占用并不高,没有触发OOM。服务重启后,CPU降到14%,页面恢复正常。

weixin_44823875的博客 229

CPU 飙高定位,jstack 实战完整流程

业务死循环:while (true) 没有退出条件、循环逻辑 bug,RUNNABLE 线程持续跑。大数据集合遍历、嵌套循环、复杂计算;正则表达式回溯卡死 CPU。大对象序列化 / 反序列化,JSON 解析超大报文。频繁 GC:内存泄漏、大对象,GC 线程吃满 CPU。第三方组件 bug,如解析组件、RPC 框架死循环。并发线程太多,大量线程上下文切换(CPU 高,但每个线程 CPU 占比不突出)。

weixin_48309090的博客 321

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

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

482
上一篇: 不错的linux下通用的java程序启动脚本(转载)
zljjava
博客等级 码龄15年 155粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值