at com.test.Test.main(Test.java:12)
…忽略其他堆栈信息我们只关注main线程的堆栈
第一行各个单词的解析,
-
“main”:线程名称 。
-
prio:线程优先级
-
tid:指Java Thread id。
-
nid:指native线程的id。。
-
[0x00007000085aa000]:线程栈起始地址。
-l打印锁的附加信息
这里我们使用2个窗口,分别使用以下2个命令来测试
第一个窗口执行
jstack -l 12771
第二个窗口中执行
jstack 12771
通过2个窗口对比可以看到,加了-l的命令多打印了锁的信息;
导出堆栈文件
一般情况下,如果程序出错了, 都不会直接在生产环境的服务器上找错误,这个时候就可以用到一个非常实用的功能,将堆栈快照导出来,然后copy到别的电脑上看,命令如下
jstack -l 2289 > jstackDump.txt
执行后,就可以看到文件已经导出来了
通过cat命令可以看到,里面的内容和我们在命令行输出的内容是一样的
实战一 、 找出cpu占用最高的线程(linux系统)
首先我们准备好一个死循环的线程,在线程内定一个while的死循环,并且给这个线程起个名字为:yexindogn,阿里巴巴的开发规范里面有一个规定,就是每个线程必须起一个名字,起名字就是为了 以后程序出问题的时候好找错误;
public static void main(String[] args) throws InterruptedException {
new Thread(new Runnable() {
@Override
public void run() {
while(true){
System.out.println(112);
}
}
},“yexindong”).start();
System.out.println(“我执行了”);
}
接着我们将此代码打成jar包扔到linux服务器上运行,直接输入 java -jar Test.jar 命令即可运行,运行后我们可以看到控制台一直在输出112这个字符,这就代表程序已经在运行了;
接着在看下CPU的运行情况,使用top命令查看cpu占用情况,排在第一位的是进程号为30328的进程,占用了6.6%的cpu; 这边我使用了2个命令行连到同一台服务器,一个窗口用来运行刚刚的jar包,另一个窗口用来查找错误;