实例:printf ‘%x\n’ 406 405 375 376,得到结果196、195、177、178;如下图所示:
查看堆栈,定位线程
命令:jstack 【进程PID】| grep 【线程转换后十六进制】-A10 , 使用jstack获取进程PID堆栈,利用grep定位线程id,打印后续10行信息。
实例:jstack 373 | grep ‘0x196’ -A10,如下图所示:
我们通过查看堆栈信息,发现了问题是TestWhile.whileTrue引起的;
而且发现有2个GC线程,看上图中的“GC task thread#0 (ParallelGC)”,代表垃圾回收线程,该线程会负责进行垃圾回收
存储堆栈,批量查看
查看堆栈信息,我们也可以换个方法查看,可以先将jstack堆栈信息存储起来。
命令:jstack 【进程PID】> 【文件】
实例:jstack 373 > demo.dump,存储373进程的堆栈信息。
再使用cat + grep查找看看后面几个高CPU线程的堆栈信息。
实例:cat -n demo.dump | grep -A10 ‘0x196’,如下图所示:
可以看到线程0x196【线程196】产生堆栈信息,直指方法whileTrue。
GC查看
我们看到上图中有4个线程中的2个线程没有看到java代码,而是GC task thread#0 (ParallelGC),这个是GC垃圾回收的线程,是不是死循环导致了GC太频繁,导致CPU使用率居高不下呢?
我们使用jstat看下jvm的GC信息看看。
命令&#x