原来jdk自带了这么好玩的工具 —— 使用 jstack定位死循环

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的命令多打印了锁的信息;

v2-19ddd5f405efde8494cc437f29efe59f_b.jpg

导出堆栈文件


一般情况下,如果程序出错了, 都不会直接在生产环境的服务器上找错误,这个时候就可以用到一个非常实用的功能,将堆栈快照导出来,然后copy到别的电脑上看,命令如下

jstack -l 2289 > jstackDump.txt

执行后,就可以看到文件已经导出来了

v2-94841bc762a229948d6468dd34276fda_b.jpg

通过cat命令可以看到,里面的内容和我们在命令行输出的内容是一样的

v2-14294e8b8ea54b9387433dd639671b2e_b.jpg

实战一 、 找出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这个字符,这就代表程序已经在运行了;

v2-82a73d3845552e435295ac7a9b700987_b.jpg

接着在看下CPU的运行情况,使用top命令查看cpu占用情况,排在第一位的是进程号为30328的进程,占用了6.6%的cpu; 这边我使用了2个命令行连到同一台服务器,一个窗口用来运行刚刚的jar包,另一个窗口用来查找错误;

v2-abf51dc91438bd7bb2d79cc453579849_b.jpg

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值