前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Java】服务CPU占用率100%,教你用jstack排查定位

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

原创
作者头像
JavaDog程序狗
发布2024-09-24 10:05:38
1290
发布2024-09-24 10:05:38
举报
文章被收录于专栏:后端

前言

🍊缘由

我对你的爱都没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 <PID>找出最耗CPU的线程。
    • 将线程ID转为十六进制。
  2. 获取堆栈:
    • jstack <PID> | grep '<Hex ID>' -C5获取线程堆栈信息。
  3. 分析修复:
    • 分析堆栈信息,定位并修复问题代码。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
    • 🍊缘由
      • 我对你的爱都没100%,你的服务却把我CPU沾满
    • 🎯主要目标
      • 实现2大重点
    • 🥦目标分析
      • 一. 什么是jstack?
      • 二. jstack排查定位方法步骤?
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档