利用Jstack分析死循环、CPU占用高的问题

1,利用top命令,查看占用CPU资源最高的进程,注意是进程

如下:top

获取进程号

2,根据进程号获取占用资源最高的线程号

top -Hp pid

其中-H表示线程模式,-p表示pid监控,pid为进程号。

获取线程号

3,将十进制的线程号转化为16进制

利用printf命令将10进制转化为16进制

printf %x 4816

结果:12d0

4,查找问题代码位置

jstack 4806|grep 12d0

结果如下:

"test thread" #8 prio=5 os_prio=0 tid=0x00007f280819e000 nid=0x12d0 runnable [0x00007f280d9a4000]

也可以具体打印出jstack查找代码位置,如下所示:

"test thread" #8 prio=5 os_prio=0 tid=0x00007f280819e000 nid=0x12d0 runnable

.............................................................................

at com.sparker.SimpleApp.lambda$main$0(SimpleApp.java:31)

        at com.sparker.SimpleApp$$Lambda$1/250421012.run(Unknown Source)

        at java.lang.Thread.run(Thread.java:748)

5,查看源码,对应System.out.println("running");部分即为占用cpu资源的地方。

        Thread thread = new Thread(() -> {

            while (true) {

                System.out.println("running");

            }

        });

        thread.setName("test thread");

thread.start();

推荐阅读更多精彩内容