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,定位到问题代码的源码行号: