Java程序定位CPU占用过高(windows server版)
【摘要】 Java程序CPU居高不下或抖动,我们应该如何定位到程序的问题点,本例模拟了一个cpu占用的场景,并对其进行定位
现象:Java程序CPU使用率过高( 抖动或居高不下 )
排查思路:
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
第二步:找到TID(线程id)
下载Process Explorer -- 打开后点击CPU标题(让其倒序排序) -- 找到问题程序后双击打开进程的properties -- 选择 Threads 选项卡 -- 找到cpu占用高的线程
注:
1)Process Explorer下载地址:https://docs.microsoft.com/zh-cn/sysinternals/downloads/process-explorer
2)TID(本例中的3444是一个十进制,后续我们需要的是一个16进制,所以需要做一下转换,在线转换工具:https://tool.oschina.net/hexconvert )
第三步:利用jstack定位问题
cmd命令行执行 jstack -l 2412 > jstack_2412.txt -- 打开jstack_2412.txt -- 搜索16进制文字(本例是d74) -- 找到并分析对应线程的信息 -- 定位到代码行
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)