CPU使用率过高

编写代码

package com;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicLong;

public class TestCpuHighUsage {
public static void main(String[] args) {

int num = args[0].toString() == null ? 1 : Integer.parseInt(args[0].toString());
System.out.println("args[0] is " + num);
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(num);

final AtomicLong atomic = new AtomicLong(0);
for (int i = 0; i < num; i++) {

fixedThreadPool.execute(() -> {
while (true) {
String str = Thread.currentThread().getName();
atomic.incrementAndGet();
if (atomic.get() > 999999) {
System.out.println("============>" + str);
atomic.set(0);
}
}
});
}

}
}

在idea中打成jar包
在命令行运行 java -jar jar包名称.jar

1、可以用任务管理器或者top命令查出进程的CPU过高
2、查看是哪个线程引起的
win: https://blog.csdn.net/qq_42764468/article/details/105091938
在windows下只能查看进程的cpu占用率,要查看线程的cpu占用率要借助其他的工具,微软提供的 Process Explorer v15.3 
下载地址http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx

linux:ps -mp pid号 -o THREAD,tid,time
3、把CPU占用过高的java进程PID导出快照:jstack -l 10564 > c:/10564.stack
4、把线程TID转换成16进制,因为用jstack导出的信息里线程对应的TID是16进制的。而我们得到的线程编号TID是十进制的:
在这里插入图片描述
在这里插入图片描述
5、在 c盘的10654.stack文件中查找2C68,定位到问题代码的源码行号:
在这里插入图片描述在这里插入图片描述


posted @ 2021-05-12 16:46  minxiaofeng10  阅读(96)  评论(0编辑  收藏  举报