分析占用了大量 CPU 处理时间的是Java 进程中哪个线程
在Linux上运行下面程序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| import java.time.LocalDateTime; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger;
public class Test {
public static void main(String[] args) throws InterruptedException { AtomicInteger atomicLong = new AtomicInteger();
Thread adder = new Thread(() -> { while (true) atomicLong.addAndGet(1); });
Thread printer = new Thread(() -> { while (true) { System.out.println(LocalDateTime.now() + " : " + atomicLong.get()); try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { throw new RuntimeException(e); } } });
adder.start(); printer.start(); adder.join(); printer.join(); } }
|
然后执行下面的命令
整个查找过程很简单,就是通过top -H -p tid
这个命令找到最繁忙的线程id, 然后用jstack
命令导出该进程所有的线程信息,然后用top找到的线程id从jstack导出的文件里进行过滤查找。