【故障处理】java程序cpu飙高如何排查

2023-11-08

使用传统jstack手法来排查

如何使用原生top命令、jstack命令来做定位具体代码的位置处理

简单步骤有下面几步

  1.  执行top命令,查看CPU占用情况,找到进程的pid(12002)
  2. 使用 top -Hp <pid> 命令(为Java进程的id号)查看该Java进程内所有线程的资源占用情况
  3. 找出负载高的线程,记录tid(26917);
  4. printf “%x\n” 命令(tid指线程的id号 26917)将以上10进制的线程号转换为16进制nid(6925);
  5. jstack -l  <pid>(12002) > ./jstack_result.log  【采用jstack命令导出线程快照 ,通过使用jdk自带命令jstack获取该java进程的线程快照并输入到文件中: jstack -l  进程id号 > ./jstack_result.txt 命令(为Java进程的id号)来获取线程快照结果并输入到指定文件。】
  6. cat jstack_result.log  | grep -A 200 <nid>(6925)【根据线程号定位具体代码 cat jstack_result.log  | grep -A 100 6925】

实践

以下案例是java应用docker容器部署排查的,jar方式部署的话排查步骤是一样的

使用top命令查看

top

 查看cpu使用率比较高的线程

top -Hp 1

然后将占用最高的 pid 转换为 16 进制 printf '%x\n' pid 得到 nid:

printf '%x\n' 106

 接着直接使用 jstack 导出进程1的堆栈信息

 jstack -l 1 > ./jstack_result.log

接着直接导出的堆栈文件里面中找到相应的16进制转换后的线程堆栈信息 

cat jstack_result.log |grep  -A 200 'nid=0x6a'

可以看到我们已经找到了 nid 为 0x6a的堆栈信息,接着只要仔细分析一番即可。

当然更常见的是我们对整个 jstack 文件进行分析,通常我们会比较关注 WAITING 和 TIMED_WAITING 的部分,BLOCKED 就不用说了。

既然我们比较关注这三种状态,我们就回顾下线程的基本知识

先从网上找了一个图

从图上就可以得知

WAITING:进入等待状态,

使用方式:wait/join/park方法进入无限等待,通过notify/notifyAll/unpark唤醒;

TIMED_WAITING:与WAITING类似,

使用方式:

a. 给定等待时间的wait/join/park方法;

b. sleep方法;

BLOCKED:被动进入等待状态,使用方式进入Synchronized块;
 

顺便补下之前关于线程等待两种方式的区别

Object.wait()和Thread.sleep()

区别:

  • wait() 方法必须在同步代码块中调用,否则会抛出异常IllegalMonitorStateException; 而sleep()则不会
  • sleep不会释放锁,它也不需要占用锁,到指定时间过期会自动唤醒。wait会释放锁,但调用它的前提是当前线程占有锁(即代码要在synchronized中)等到唤醒条件满足之后,线程进入锁池,获取锁之后进入READY状态;
  • 它们都可以被interrupted方法中断。
  • wait()与wait(0)同义,无限等待,如果没设置超时时间的wait方法必须等待其他线程执行notify来唤醒;sleep(0)的意思是不等待,并且触发操作系统立刻重新进行一次CPU竞争

我们可以使用命令 cat jstack_result.log  | grep "java.lang.Thread.State" | sort -nr | uniq -c 来对 jstack 的状态有一个整体的把握,如果 WAITING 之类的特别多,那么多半是有问题啦。

cat jstack_result.log | grep "java.lang.Thread.State" | sort -nr | uniq -c

使用arthas利器来排查

执行下面命令下载arthas包,敲下回车键就可以下载对应jar包

curl -O https://arthas.aliyun.com/arthas-boot.jar
 
java -jar arthas-boot.jar

使用thread命令查看那个线程cpu最高

thread 线程id 即可排查定位到异常代码来分析,简直不能太easy

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【故障处理】java程序cpu飙高如何排查 的相关文章

随机推荐

  • 用频谱仪测量晶体频率的方法

    摘要 用频谱仪测量晶体的时钟频率 查看时钟的频偏 关键字 频谱仪晶体频率频偏 一 背景与现象 怎样精确的测量晶体的时钟频率 是每一个硬件工程师所面临测量问题 用频率计测试晶体频率 又担心探头本身的寄生电容会影响晶体本身的负载电容 造成测试的
  • PGSQL 导出数据库表结构

    之前要将数据库的表结构给做成markdow来写开发设计文档或是接口文档 去找各种开源工具 组件 整理了一个SQL语句可以查询出表结构 样式如下 SQL语句 里面的jiahui表示数据库的schema 默认是public SELECT CAS
  • R语言学习笔记6

    13 初级统计学 描述原始数据 数值型变量 数字型变量 是将观测值以数值形式存储的变量 连续型变量 可以在某个区间取任何值 任何位数 离散型变量 只能取离散型数据 在取值范围里 取得是有限个数 分类变量 两类 名义变量 不能按照逻辑顺序排列
  • js数据结构之栈

    1 栈数据结构 栈是一种遵从后进先出 LIFO 原则的有序集合 新添加或待删除的元素都保存在栈的同一端 称作栈顶 另一端就叫栈底 在栈里 新元素都靠近栈顶 旧元素都接近栈底 在现实生活中也能发现许多栈的例子 例如 下图中的一摞书 栈也被用在
  • springcloud-gateway网关聚合swagger实现多个服务接口切换

    正经学徒 佛系记录 不搞事情 springcloud是由多个不同的springboot服务组成的 微服务使用swagger有两种方法 如下 方法一 不推荐 但是是方法二的前置条件 对每个需要生成接口的项目集成swagger 具体方法点击查看
  • VM下ubuntu14.04安装编译linux-2.6.34内核

    Linux2 6所有内核下载地址 http www kernel org pub linux kernel v2 6 选择 1 解压 gf ubuntu ls Desktop Downloads linux 2 6 34 tar bz2 P
  • was配置mysql数据源另一种方式

    1 添加JDBC驱动程序 打开was控制台 资源 JDBC提供程序 新建 2 配置JDBC参数 选择数据库类型为 用户自定义 数据库类型 com mysql jdbc jdbc2 optional MysqlXADataSource 名称
  • nRF52832 — 1.44寸 TFT屏

    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XX 作 者 文化人 XX 联系方式 XX 版权声明 原创文章 欢迎评论和转载 转载时能告诉我一声就最好了 XX 要说的
  • 关于:(.text+0x21): undefined reference to `shm_open'问题

    C programming in the UNIX environment的编程手册 一般都会为进程间用共享内存的方法通信提供两组方法 1 POSIX定义的 int shm open const char name int oflag mo
  • 开源数据集分类汇总(医学,卫星,分割,分类,人脸,农业,姿势等)

    本文汇总了医学图像 卫星图像 语义分割 自动驾驶 图像分类 人脸 农业 打架识别等多个方向的数据集资源 均附有下载链接 该文章仅用于学习记录 禁止商业使用 1 医学图像 疟疾细胞图像数据集 下载链接 http suo nz 2VQTUt 皮
  • Sqoop 使用详解

    Sqoop 概述 Sqoop 是Apache 旗下的一款开源工具 用于Hadoop与关系型数据库之间传送数据 其核心功能有两个 导入数据和导出数据 导入数据是指将MySQL Oracle等关系型数据库导入Hadoop的HDFS Hive H
  • C#(Unity3D)数值分析-牛顿(迭代)法

    最近需要用此方法解决一元五次方程求解问题 所以学习了下 在此记录一下 此方法的产生 是由于很多方程没有通解公式 所以求解只能通过数值方法 方法有很多 参见 数值分析 类似书有很多 牛顿法 这里引用书籍上所述 设方程 f x 0 其中有近似根
  • 多线程:线程安全与同步

    线程安全问题 线程安全问题产生的三个必要条件 多线程环境中 有共享数据 成员变量 而非局部变量 栈中是线程独立的 多个线程操作 增删改 了共享数据 单线程 以及 多线程在没有访问共享数据的情况下 是不会产生线程安全问题的 一旦多线程访问了共
  • 【Revit二次开发学习笔记】选取元素之先选择元素后执行命令

    第一步 写代码 using System using System Collections Generic using System Linq using System Text using System Threading Tasks u
  • TOWARDS A UNIFIED VIEW OF PARAMETER-EFFICIENT TRANSFER LEARNING

    本文也是属于LLM系列的文章 针对 TOWARDS A UNIFIED VIEW OF PARAMETER EFFICIENT TRANSFER LEARNING 的翻译 关于参数有效迁移学习的统一观点 摘要 1 引言 2 前言 2 1 T
  • xxx.app已损坏,打不开。 您应该将它移到废纸篓。

    Mac最新的系统打开网上下载的应用程序时 会提示 xxx app已损坏 打不开 您应该将它移到废纸篓 解决方式 1 系统偏好设置 gt 安全性与隐私 gt 修改为任何来源 2 serria里面没有 任何来源 这一项 需要打开终端执行sudo
  • 【数据结构】 二叉树面试题讲解->贰

    文章目录 引言 二叉树遍历 https www nowcoder com practice 4b91205483694f449f94c179883c1fef tpId 60 tqId 29483 rp 1 ru activity oj qr
  • 关于链表的三个常用算法

    找到环的第一个入口点 static public SinglyLinkedListNode
  • (s2-048)Struts2 反序列化漏洞

    Struts2 Struts2是一个基于MVC设计模式 java 的Web应用框架 它本质上相当于一个servlet 在MVC设计模式中 Struts2作为控制器 Controller 来建立模型与视图的数据交互 Struts2 是 Apa
  • 【故障处理】java程序cpu飙高如何排查

    使用传统jstack手法来排查 如何使用原生top命令 jstack命令来做定位具体代码的位置处理 简单步骤有下面几步 执行top命令 查看CPU占用情况 找到进程的pid 12002 使用 top Hp