Java程序定位CPU占用过高(windows server版)

举报
云叔记 发表于 2021/08/04 16:09:18 2021/08/04
【摘要】 Java程序CPU居高不下或抖动,我们应该如何定位到程序的问题点,本例模拟了一个cpu占用的场景,并对其进行定位

现象:Java程序CPU使用率过高( 抖动或居高不下 )

CPU占用过高.png

排查思路:

1、找到cpu高占用的进程,并通过Process Explorer进一步定位对应的线程
2、利用jstack分析堆栈状态,定位到cpu高占用线程的堆栈状态,根据相关信息定位到具体的代码。

模拟问题程序:

public class JavaThreadUseDemo {
	public static void main(String[] args) {
		
		Thread thread = new Thread(new Runnable() {
			@Override
			public void run() {
				int i= 0;
				while (true) {
					System.out.println("Thread :" + Thread.currentThread().getName() + "-" + (i++));
				}
			}
		});
		
		thread.start();
	}
}
cmd命令行执行下面代码:
javac JavaThreadUseDemo.java     #编译java问题模拟程序
java JavaThreadUseDemo           #执行java问题模拟程序

开始定位

第一步:找到PID(进程id)

资源管理器 -- 找到问题程序,点右键 -- 转到详细信息 -- 找到PID

2.png

第二步:找到TID(线程id)

下载Process Explorer -- 打开后点击CPU标题(让其倒序排序) -- 找到问题程序后双击打开进程的properties -- 选择 Threads 选项卡 -- 找到cpu占用高的线程

1.png

注:
1)Process Explorer下载地址:https://docs.microsoft.com/zh-cn/sysinternals/downloads/process-explorer
2)TID(本例中的3444是一个十进制,后续我们需要的是一个16进制,所以需要做一下转换,在线转换工具:https://tool.oschina.net/hexconvert )

在线转换.png

第三步:利用jstack定位问题

cmd命令行执行 jstack -l 2412 > jstack_2412.txt   --  打开jstack_2412.txt   --  搜索16进制文字(本例是d74)   --  找到并分析对应线程的信息  -- 定位到代码行

定位到.png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。