基本思路是找到线程占用CPU过高的那个线程ID,然后通过dump的线程栈来搜索想要的线程。

  • jstack -l 10086 > 10086.stack
  • 使用top -H -p PID 命令查看对应进程是哪个线程占用CPU过高。如果有htop,也可以通过htop查询占有CPU高的线程id
  • 将线程的pid 转成16进制,比如8618 = 0x21aa
  • 到第一步dump出来的 10086.stack 里面找 0x21aa 就可以定位到具体是什么现场。

这里提到一点就是,在启动线程的时候,最好手动给线程起上名字。

如果是线程池,也是一样起好名字。

Guava中提供了,

1
2
ThreadFactory nameThreadFactory = new ThreadFactoryBuilder().setNameFormat("thread - pool-%d").build();
ExecutorService executorService = Executors.newSingleThreadExecutor(namedThreadFactory);