【Java】服务CPU占用率100%,教你用jstack排查定位

JavaDog程序狗
JavaDog程序狗
发布于 2024-07-18 / 131 阅读
0
0

【Java】服务CPU占用率100%,教你用jstack排查定位

前言

🍊缘由

我对你的爱都没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应用性能问题

  1. 定位问题:

    • 用top或jps -l找到高CPU的Java进程。
    • top -Hp 找出最耗CPU的线程。
    • 将线程ID转为十六进制。
  2. 获取堆栈:

    • jstack | grep ‘’ -C5获取线程堆栈信息。
  3. 分析修复:

    • 分析堆栈信息,定位并修复问题代码。

jstack是快速诊断Java应用性能瓶颈的关键工具,掌握其使用可有效提升应用稳定性

🍈猜你想问

如何与狗哥联系进行探讨

关注公众号【JavaDog程序狗】

公众号回复【入群】或者【加入】,便可成为【程序员学习交流摸鱼群】的一员,问题随便问,牛逼随便吹,目前群内已有超过290+个小伙伴啦!!!

2.踩踩狗哥博客

javadog.net

里面有狗哥的私密联系方式呦 😘

大家可以在里面留言,随意发挥,有问必答


🍯猜你喜欢

文章推荐

【规范】Git分支管理,看看我司是咋整的

【工具】珍藏免费宝藏工具,不好用你来捶我

【插件】IDEA这款插件,爱到无法自拔

【规范】看看人家Git提交描述,那叫一个规矩

【工具】用nvm管理nodejs版本切换,真香!

【项目实战】SpringBoot+uniapp+uview2打造H5+小程序+APP入门学习的聊天小项目

【项目实战】SpringBoot+uniapp+uview2打造一个企业黑红名单吐槽小程序

【模块分层】还不会SpringBoot项目模块分层?来这手把手教你!


评论