用了五年JAVA,学了一堆奇技淫巧,但好像一直没有涉足手动排查的技术。最近偶然看了一本《服务端开发:技术、方法与使用解决方案》,虽然这本书对于A公司员工没啥太大启发性,由于每天都在用书中所述的中间件、技术、稳定性组件、设计方案,因此就算是一个字一个字地看,也在一个下午看完了。不过其中有一段对JAVA线程问题排查部分还是我的技术空白,所以简单实践并记录一下。

第一步:top

能看到CPU使用率比较高的进程,一般需要dump的场景都是线上服务出现问题,所以排第一的就是JAVA进程。这里举例进程号为12200。

第二步:top -H -p 12200

即可看到进程为12200中,CPU使用率最高的线程,可以把线程号码记录下来。这里举例线程号码为3868。

第三步:printf “%x” 3868

将3868转换为16进制,得到f1c。

第四步:jstack 12200 | grep f1c

即可看到是哪个代码导致的问题,对应代码查看即可,这也是为什么线程池要使用有意义命名的原因。也可以用grep f1c -A 15来看后15行调用栈。