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

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() {

			@Override
			public 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() {

			@Override
			public 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 -Lfp 2419  也可以,不过要看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

猜你喜欢

转载自blog.csdn.net/LOVE_sel/article/details/78121724
今日推荐