如何找到占用CPU和内存最高的线程

title: 如何找到占用CPU和内存最高的线程

date: 2017-03-01

tags: java


一、如何找到CPU和内存占用最高的线程

  1. 代码示例

    我们先来写一段代码

    
       @Test
       public void testLinuxTop() throws  Exception{
           boolean b=true;
           System.out.println("start the cpu Thread");
           while (b){
               int i=(int)Math.random()*1000;
               if (i%3==1){
    
               }
               if (i==1000){
                   System.out.println("stop");
                   b=false;
               }
           }
    
       }

    随便写了个死循环,然后怎么看下CPU占用情况呢?

    TOP命令

    先用ps -ef|grep tomcat查看一下你当前tomcat的进程号,比如我看出来我的进程号是8545

    然后用TOP命令查看当前所有进程

    top -p 8545
    top -p 8545 -H //这样也可以

    使用地址中,进入了下面这个界面之后就要按H了

    于是你就会看到下面这张图片

    这里写图片描述

    CPU占用接近满了,内存占用30M,怎么会占用这么多?OK,我们记住PID 8545

  2. jstack命令

    OK,我们在栈里面来找出这段代码,可以直接用jstack把栈里面的东西打出来

    直接使用下面的就可以

    jstack 8545 > stack.log 在你的当前目录下面就会出现一个stack.log文件,这是包括所有的栈信息的,这里的8545是tomcat的进程号tomcat的进程号tomcat的进程号,重要的事情强调一下

    如何找到有问题的代码呢?

    我们刚才拿到了一个CPU最高的进程号8545,OK,转化为16进制,使用下面命令

    printf "%x\n" 8545
    //或者
    printf 0x%x 8545 

    上面两种都可以拿到16进制的8545,或者你自己去用计算器拿去,这里我们得到的是0x2162或者2161(上面一种可以直接拿到2161,没有0x),我们要的就是2161

    可以直接到jstack.log文件里面去搜索,就看到出问题的代码了

  3. 想直接看

    下面提供一种直接看的方法

    jstack 8545|grep -A 30 2162

    得到线程堆栈信息中2162这个线程所在行的后面30行

  4. question

    4.1 我使用jstack pid报错了怎么办?

    使用jstack pid可能会出现8545 operation permitted之类的错误,解决办法,请切换至root用户执行命令

  5. over

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值