之前有朋友反馈说发的内容希望有个梯度,逐步加深,前面发了几篇关于jvm源码分析的文章,可能我觉得我已经把内容写得浅显易懂了,但是对于某些没怎么接触的同学来说还是比较难理解,这个我以后慢慢改进吧,今天发篇轻松点的文章,可能大家在工作过程中也会可能碰到类似的问题,或许有经验的同学看到这个题目就知道我要说什么了,也有自己的定位方法。

话不多说了,先来看代码吧

public class Test{public static void main(String args[]){for(int i=0;i<10;i++){new Thread(){public void run(){try{Thread.sleep(100000);}catch(Exception e){}}}.start();}Thread t=new Thread(){public void run(){int i=0;while(true){i=(i++)/100;}}};t.setName("Busiest Thread");t.start();}
}

这个例子里新创建了11个线程,其中10个线程没干什么事,主要是sleep,另外有一个线程在循环里一直跑着,可以想象这个线程是这个进程里最耗cpu的线程了,那怎么把这个线程给抓出来呢?

首先我们可以通过top -Hp <pid>来看这个进程里所有线程的cpu消耗情况,得到类似下面的数据

$ top -Hp 18207
top - 19:11:43 up 573 days,  2:43,  2 users,  load average: 3.03, 3.03, 3.02
Tasks:  44 total,   1 running,  43 sleeping,   0 stopped,   0 zombie
Cpu(s): 18.8%us,  0.0%sy,  0.0%ni, 81.1%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  99191752k total, 98683576k used,   508176k free,   128248k buffers
Swap:  1999864k total,   191064k used,  1808800k free, 17413760k cachedPID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
18250 admin     20   0 26.1g  28m  10m R 99.9  0.0   0:19.50 java Test
18207 admin     20   0 26.1g  28m  10m S  0.0  0.0   0:00.00 java Test
18208 admin     20   0 26.1g  28m  10m S  0.0  0.0   0:00.09 java Test
18209 admin     20   0 26.1g  28m  10m S  0.0  0.0   0:00.00 java Test
18210 admin     20   0 26.1g  28m  10m S  0.0  0.0   0:00.00 java Test
18211 admin     20   0 26.1g  28m  10m S  0.0  0.0   0:00.00 java Test
18212 admin     20   0 26.1g  28m  10m S  0.0  0.0   0:00.00 java Test
18213 admin     20   0 26.1g  28m  10m S  0.0  0.0   0:00.00 java Test
18214 admin     20   0 26.1g  28m  10m S  0.0  0.0   0:00.00 java Test
18215 admin     20   0 26.1g  28m  10m S  0.0  0.0   0:00.00 java Test
18216 admin     20   0 26.1g  28m  10m S  0.0  0.0   0:00.00 java Test
18217 admin     20   0 26.1g  28m  10m S  0.0  0.0   0:00.00 java Test
18218 admin     20   0 26.1g  28m  10m S  0.0  0.0   0:00.00 java Test
18219 admin     20   0 26.1g  28m  10m S  0.0  0.0   0:00.00 java Test
18220 admin     20   0 26.1g  28m  10m S  0.0  0.0   0:00.00 java Test
18221 admin     20   0 26.1g  28m  10m S  0.0  0.0   0:00.00 java Test
18222 admin     20   0 26.1g  28m  10m S  0.0  0.0   0:00.00 java Test
18223 admin     20   0 26.1g  28m  10m S  0.0  0.0   0:00.00 java Test
18224 admin     20   0 26.1g  28m  10m S  0.0  0.0   0:00.00 java Test
18225 admin     20   0 26.1g  28m  10m S  0.0  0.0   0:00.00 java Test
18226 admin     20   0 26.1g  28m  10m S  0.0  0.0   0:00.00 java Test
18227 admin     20   0 26.1g  28m  10m S  0.0  0.0   0:00.00 java Test

拿到这个结果之后,我们可以看到cpu最高的线程是pid为18250的线程,占了99.9%:

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
18250 admin     20   0 26.1g  28m  10m R 99.9  0.0   0:19.50 java Test

接着我们可以通过jstack <pid>的输出来看各个线程栈:

$ jstack 18207
2016-03-30 19:12:23
Full thread dump OpenJDK 64-Bit Server VM (25.66-b60 mixed mode):"Attach Listener" #30 daemon prio=9 os_prio=0 tid=0x00007fb90be13000 nid=0x47d7 waiting on condition [0x0000000000000000]java.lang.Thread.State: RUNNABLE"DestroyJavaVM" #29 prio=5 os_prio=0 tid=0x00007fb96245b800 nid=0x4720 waiting on condition [0x0000000000000000]java.lang.Thread.State: RUNNABLE"Busiest Thread" #28 prio=5 os_prio=0 tid=0x00007fb91498d000 nid=0x474a runnable [0x00007fb9065fe000]java.lang.Thread.State: RUNNABLEat Test$2.run(Test.java:18)"Thread-9" #27 prio=5 os_prio=0 tid=0x00007fb91498c800 nid=0x4749 waiting on condition [0x00007fb906bfe000]java.lang.Thread.State: TIMED_WAITING (sleeping)at java.lang.Thread.sleep(Native Method)at Test$1.run(Test.java:9)"Thread-8" #26 prio=5 os_prio=0 tid=0x00007fb91498b800 nid=0x4748 waiting on condition [0x00007fb906ffe000]java.lang.Thread.State: TIMED_WAITING (sleeping)at java.lang.Thread.sleep(Native Method)at Test$1.run(Test.java:9)"Thread-7" #25 prio=5 os_prio=0 tid=0x00007fb91498b000 nid=0x4747 waiting on condition [0x00007fb9073fe000]java.lang.Thread.State: TIMED_WAITING (sleeping)at java.lang.Thread.sleep(Native Method)at Test$1.run(Test.java:9)"Thread-6" #24 prio=5 os_prio=0 tid=0x00007fb91498a000 nid=0x4746 waiting on condition [0x00007fb9077fe000]java.lang.Thread.State: TIMED_WAITING (sleeping)at java.lang.Thread.sleep(Native Method)at Test$1.run(Test.java:9)
...

上面的线程栈我们注意到nid的值其实就是线程ID,它是十六进制的,我们将消耗cpu最高的线程18250,转成十六进制0X474A,然后从上面的线程栈里找到nid=0X474A的线程,其栈为:

"Busiest Thread" #28 prio=5 os_prio=0 tid=0x00007fb91498d000 nid=0x474a runnable [0x00007fb9065fe000]java.lang.Thread.State: RUNNABLEat Test$2.run(Test.java:18)

即将最耗cpu的线程找出来了,是Busiest Thread

如何定位消耗CPU最多的线程相关推荐

  1. 快速定位JVM中消耗CPU最多的线程

    项目中突然就CPU 100%以上,导致服务不可用.解决办法如下: 1.先定位CPU高的进程: top 命令: 通过以上这个结果,我们可以看到 cpu 最高的线程是 pid 为 10515的线程,占了C ...

  2. Java 性能优化实战记录(1)---定位并分析耗cpu最多的线程

    1) jps     列出相关的java进程, 以及对应的pid     也可以使用如下命令来尝试     ps aux | grep java --color 2) top -Hp <pid& ...

  3. 线上频繁发生Full GC 如何调优?如何快速定位OOM、cpu飙升、线程死锁等问题

    文章目录 1. jvm调优命令.工具介绍 ①:jps ②:jmap 查看应用中各实例生成情况 快速定位内存突然飙升导致的OOM异常 查看堆内存使用情况 ③:Jstack 检测线程死锁 快速定位导致cp ...

  4. 性能诊断定位之CPU问题排查(一):win10环境1

    目录 1. 通用排查思路 2. 环境工具 3. 示例演示 3.1 准备工作:为模拟有占用CPU高的进程,这里编写一个java程序,无限循环,运行 3.2 通过 Process Explorer软件(p ...

  5. 如何快速定位当前数据库消耗CPU最高的sql语句?

    以下文章来源方志朋的博客,回复"666"获面试宝典 概述 如果是Oracle数据库我们可以很容易通过sql来定位到当前数据库中哪些消耗CPU高的语句,而mysql数据库可以怎么定位 ...

  6. mysql如何定位到数据_如何快速定位当前数据库消耗CPU最高的sql语句?

    概述 如果是Oracle数据库我们可以很容易通过sql来定位到当前数据库中哪些消耗CPU高的语句,而mysql数据库可以怎么定位呢?这里用一个简单例子说明下... 主要是了解如何定位的思路,具体看官网 ...

  7. 【JVM性能调优】使用jstack找出最耗CPU的java线程

    jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体的代码,所以它在JVM性能调优中很常见.下面我们在找出某个java进程中最耗CPU的线程,并定位堆栈信息,使用到的命令有:ps.top.p ...

  8. 找出Java进程中大量消耗CPU

    问题分析: 1,程序属于CPU密集型,和开发沟通过,排除此类情况. 2,程序代码有问题,出现死循环,可能性极大. Java程序很耗CPU是比较好分析的,有这么几步: 1.通过top命令(top之后再按 ...

  9. 使用jstack定位应用服务器CPU使用率高的过程记录

    1.使用top查看CPU使用情况,发现用户为app的java进程CPU使用率近400%(4核CPU),记录下PID.(说明:系统恢复正常后的截图) 2.查看该进程中线程CPU使用率,使用top -Hp ...

最新文章

  1. linux 生成dll文件,Linux和Windows平台 动态库.so和.dll文件的生成
  2. vue2.0 + vux (五)api接口封装 及 首页 轮播图制作
  3. w7计算机屏幕保护设置方法,W7屏保怎么设置
  4. python 字典循环_Python字典遍历操作实例小结
  5. hdu4642博弈(矩阵)
  6. 有奖调研 | 致云通信短信服务用户的一封信
  7. 二叉树的遍历 (递归和非递归实现)
  8. Python中包(package)的调用方式
  9. 分布式版本控制系统之Git
  10. 钱放在支付宝好,还是微信好,还是存在银行好?
  11. Oracle 声明常量
  12. php手术多久就不疼了,自己腹部刚开刀口没几天,却站了5小时为患者手术
  13. python复盘之windows环境的安装
  14. 抗渗等级p6是什么意思_混凝土抗渗等级w4是什么意思?
  15. https证书中比较便宜的证书
  16. 程序员开发指南!金三银四Android面试的一些感受,这原因我服了
  17. 教程 | 用安卓手机搭建 web 服务器(三)—— 内网穿透
  18. .browser的解释
  19. Word论文格式-页眉页脚页码
  20. [js高手之路] dom常用API【appendChild,insertBefore,removeChild,replaceChild,cloneNode】详解与应用

热门文章

  1. 提供openssl -aes-256-cbc兼容加密/解密的简单python函数
  2. 差分约束 4416 FFF 团卧底的后宫
  3. IOS学习之多线程(9)--NSOperation简单介绍
  4. Skype for Business Server 2015-10-ADFS-2-配置
  5. linux系统学习之vi编辑
  6. HTML 学习 第一步内容
  7. 一个不错的CSS DIV布局,DIV高度自适应
  8. 【C/C++】“std::basic_ios _Elem,_Traits:无法访问private变量在类中的声明”错误原因与解决办法
  9. 基于fabric框架区块链实现科学数据出版系统
  10. MATLAB:图像的与、或、非、异或逻辑运算(、|、~、xor)