jstack调试结果CPU使用过高的问题

来源:互联网 发布:部落冲突女王数据 编辑:程序博客网 时间:2024/06/03 15:57

jstack 可以定位到线程堆栈,根据堆栈信息我们可以确定到具体代码,所以JVM性能调优中用的非常多。下面我们将通过一个实例来找出java进程中最耗费CUP的线程,并定位堆栈信息。

1.将下面的代码打成可执行jar包

/** *  * 这个方法为了验证jstack 作用 * */public class FindJavaThreadInTaskManager {public static void main(String[] args) {FindJavaThreadInTaskManager.method1();FindJavaThreadInTaskManager.method2();}/** *  * 模拟多线程中cup低的方法 * */public static void method1() {Thread thread = new Thread(new Runnable() {@Overridepublic void run() {while (true) {System.out.println("当前线程名字为: " + Thread.currentThread().getName());}}});thread.setName("线程1");thread.start();}/** *  * 模拟多线程中cup低的方法 * */public static void method2() {Thread thread = new Thread(new Runnable() {@Overridepublic void run() {while (true) {System.out.println("当前线程名字为: " + Thread.currentThread().getName());try {Thread.currentThread().sleep(50L);} catch (InterruptedException e) {e.printStackTrace();}}}});thread.setName("线程2");thread.start();}}
2.在Linux上执行 该jar包


3.找到CPU利用率持续比较高的进程,获取进程号,此处PID为2419



4.找到上述进程中,CPU利用率比较高的线程号TID(十进制数),此处为3046

命令:

ps p 2419 -L -o pcpu,pid,tid,time,tname,cmd

//ps -Lfp2419  也可以,不过要看TIME列



5.将获取的线程号(十进制数)转换成十六进制,此处为97c

printf "%x\n"  2428


6.查看进程PID为2419中nid为0xb46的线程信息。

jstack 2419 |grep 97c


注:根据上面的信息可以确定具体哪个线程占用的CUP最多

另外也可以通过如下方法确认:

jstack -l 2419 | more

//上面‘-l’ 为‘-小写L’



备注:来源请参照 https://jingyan.baidu.com/album/4f34706e3ec075e387b56df2.html?picindex=6

原创粉丝点击