JVM|记一次生产环境 CPU 占用飙高问题解决

目录

1 问题发现与背景

2 运维报警

3 问题定位与解决

(1)第一步,jps 查看 java pid 

(2)第二步,显示线程列表 ps -mp 42 -o THREAD,tid,time

(3)第三步,选择自己要看的线程 id ,即 tid,将其转换成16进制格式

(4)第四步,打印堆栈信息

(5)第五步 从堆栈信息中定位问题代码

4 涉及命令梳理

(1)jps 命令

(2)jstack 命令

(3)Linux ps 和 printf 命令


1 问题发现与背景

问题背景,项目对外提供查询接口,其核心逻辑对一些报文做正则解析返回。由于起初对正则不熟悉,对报文格式规律不清楚,导致写了大量的长正则表达式,生产环境并发量上来(200/s),直接导致 CPU 使用率峰值徘徊在 100%,运维报警反馈。

2 运维报警

3 问题定位与解决

(1)第一步,jps 查看 java pid 

(2)第二步,显示线程列表 ps -mp 42 -o THREAD,tid,time

可以看到 CPU 占用率很高线程,如下面显示标红的线程。

   

(3)第三步,选择自己要看的线程 id ,即 tid,将其转换成16进制格式

当时选择的是 tid 为211。

(4)第四步,打印堆栈信息

(5)第五步 从堆栈信息中定位问题代码

定位到问题代码在 AvQueryClientImpl 的 319 行。具体是由于长正则匹配,吃 CPU 引起,并发量上来扛不住。根据业务情景,把正则精简到了原来1/20的长度。CPU 占用恢复正常,峰值在10%左右。

4 涉及命令梳理

(1)jps 命令

jps(Java Virtual MachineProcess Status Tool)是 JDK 1.5 提供的一个显示当前所有 java 进程 pid 的命令。

  • jps # 列出 pid
  • jps -l # 列出 pid 和 java主 类全称
  • jps -v # 列出 pid 和 JVM 参数


(2)jstack 命令

jstack 是 java 虚拟机自带的一种堆栈跟踪工具。jstack 用于生成 java 虚拟机当前时刻的线程快照。线程快照是当前 java 虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。 线程出现停顿的时候通过 jstack 来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。 

Usage:
    jstack [-l] <pid>
    jstack -F [-m] [-l] <pid>


Options:
    -F  强制 dump 线程堆栈信息. 用于进程 hang 住, jstack <pid> 命令没有响应的情况
    -m  同时打印 java 和本地(native)线程栈信息,m 是 mixed mode 的简写
    -l  打印锁的额外信息

(3)Linux ps 和 printf 命令

(1)ps指令报告系统进程状态。http://man.linuxde.net/ps
(2)printf命令格式化并输出结果到标准输出。 http://man.linuxde.net/printf
(3)附录:cpu 占用过高:https://blog.csdn.net/u013066244/article/details/53503530

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不甩锅的码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值