JAVA进程CPU占用过高快速定位

问题描述

系统正式上线后,运行一段时间,经常会出现cpu过高问题,导致服务器性能急剧下降,可能是高并发,外部攻击,代码缺陷所致

问题定位

编写测试类HighCPUTest.java , 编译运行

public class HighCPUTest {
    public static void main(String[] args) {
        while (true) {          
        }
    }
}

查看进程运行状态

Linux

使用top命令
top命令
PID:进程号(3610)
%CPU: 进程CPU使用率(99.8)

Windows

打开任务管理器 查看PID CPU使用率信息


查看线程运行状态

Linux

使用top -Hp命令
这里写图片描述
PID:线程号(3611)
%CPU:线程CPU使用率(99.9)
可以看到JAVA进程3610所有线程信息,通过CPU使用率定位到线程3611可能存在问题

Windows

Windows系统没有自带线程查看工具,需要下载安装,可视化工具推荐 ProcessExplorer
这里写图片描述
进程 PID[316] CPU使用率过高
查看线程信息 右键 > Properties... > Threads
这里写图片描述
线程TID[3816] CPU使用率过高


jstack命令输出运行栈信息

命令简介:
jstack是JDK自带的一种堆栈跟踪工具,如果线上环境使用JRE,需要安装JDK

Linux

jstack PID 输出代码运行栈信息,保存到文件中
$ jstack 3610 > jstack.3610

10进制线程号3611转换为16进制 elb

$ printf "%x\n" 3611
e1b

打开文件 jstack.3610,找到线程号elb运行代码栈

"main" prio=10 tid=0x00007fe504007800 nid=0xe1b runnable [0x00007fe50a1ef000]
   java.lang.Thread.State: RUNNABLE
    at HighCPUTest.main(HighCPUTest.java:3)

可以看到 HighCPUTest.java:3 可能存在问题,接下来就可以阅读代码分析了

Windows

jstack PID 输出代码运行栈信息,保存到文件中
$ jstack 361 > jstack.361

使用windows计算器[程序员] 将10进制线程号3816转换为16进制 ee8

打开文件 jstack.361,找到线程号ee8运行代码栈

"main" #1 prio=5 os_prio=0 tid=0x02614400 nid=0xee8 runnable [0x00cdf000]
   java.lang.Thread.State: RUNNABLE
    at HighCPUTest.main(HighCPUTest.java:3)

可以看到 HighCPUTest.java:3 可能存在问题,接下来就可以阅读代码分析了

EOF

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值