前言
🍊缘由
我对你的爱都没100%,你的服务却把我CPU沾满
🏀事情起因:
大家好,我是JavaDog程序狗
今天给大家来分享一下如何使用jstack排查定位CPU高占用问题
你想听的故事
🎯主要目标
实现2大重点
1. 什么是jstack
2. jstack排查定位方法步骤
🥦目标分析
一. 什么是jstack?
jstack 是一个用于诊断 Java 应用程序线程问题的工具,它主要用来生成 Java 虚拟机(JVM)在某一时刻的线程堆栈快照。
这个快照包含了JVM 内所有线程的信息,包括它们正在执行的方法、调用堆栈以及可能的阻塞点。
👽人话解释
jstack 就像是给你的Java 程序做的一次“体检”,特别是检查程序里的“线程”是否健康。
想象一下,你的程序就像是一个繁忙的工厂,有很多工人(线程)在同时工作,有的在搬运货物(执行任务),有的在等待机器(等待资源),还有的可能因为某些原因卡住了(死锁或挂起)。
当你发现程序运行变慢或者卡住时,jstack 就能派上用场了。它会告诉你每个工人(线程)当前在做什么,他们在哪里停下了手头的工作,或者是否在等待其他工人的帮助。这样,你就可以找出是谁在捣乱,为什么程序会变慢,然后采取措施解决问题。
二. jstack排查定位方法步骤?
1. 使用top命令
top
服务器使用top命令,查看占用cpu过高的java进程pid
如果java进程少,还可以通过jps -l 拿到java进程pid
jps -l
2. top -Hp pid
top -Hp 31411
使用top -Hp 31411,31411就是上方占用最高的java进程pid。
可以查看该进程下,各个线程的cpu使用情况,找到对应的最高占用率的pid,也就是31413
3. printf '%x\n' pid
printf '%x\n' 3141
使用printf '%x\n' 31413将线程号转化为16进制显示
4.jstack pid | grep '转化后16进制线程id' -C5 --color
jstack 31411 | grep '7ab5' -C5 --color
通过jstack打印进程31413的堆栈信息,并只过滤出线程7ab5的堆栈信息
最后查看报错提示行数,找到源码,成功定位
总结
高效利用jstack诊断Java应用性能问题
定位问题:
- 用top或jps -l找到高CPU的Java进程。
- top -Hp 找出最耗CPU的线程。
- 将线程ID转为十六进制。
获取堆栈:
- jstack | grep '' -C5获取线程堆栈信息。
分析修复:
- 分析堆栈信息,定位并修复问题代码。
jstack是快速诊断Java应用性能瓶颈的关键工具,掌握其使用可有效提升应用稳定性
🍯猜你喜欢
文章推荐
【项目实战】SpringBoot+uniapp+uview2打造H5+小程序+APP入门学习的聊天小项目