Windows系统排查Java代码CPU占用过高的问题

为了演示,先写个死循环代码:

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

第一步:定位进程

跑起来之后打开Windows任务管理器,点击 “查看” -> “选择列” ->勾选"PID",这样“进程”界面就可以显示PID了。
在这里插入图片描述
如图,CPU占用排第一的java进程PID为9616.

第二步:定位线程

用Windows自带的pslist -dmx pid命令查看进程的线程信息,结合我们在第一步查询到的PID:

pslist -dmx 9616

返回如下结果:
在这里插入图片描述这里简单解释下各个字段的含义:

Pri: Priority
Tid: Number of Threads(线程编号)
Hnd: Number of Handles
VM: Virtual Memory
WS: Working Set
Priv: Private Virtual Memory
Priv Pk: Private Virtual Memory Peak
Faults: Page Faults
NonP: Non-Paged Pool
Page: Paged Pool
Cswtch: Context Switches(线程上下文切换次数)
State: 线程状态

如图可以看出编号为8244的线程上下文切换最频繁,说明它分配到的CPU时间片最多,所以CPU占用过高的罪魁祸首就是它了。

(PS:如果dos命令行提示找不到pslist命令,需要去微软官方下载,地址:https://docs.microsoft.com/zh-cn/sysinternals/downloads/pslist
下载完直接解压放到C:\Windows\System32就可以了)

第三步:定位代码

先通过Windows自带的计算器把TID转换成十六机制,8244转换成十六机制为2034。然后通过jstack -l PID 命令查看线程的详细信息,找到TID为2034的线程:
在这里插入图片描述
可以看到,死循环的那行代码被定位到了。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值