一、需求分析
经常听到朋友说他们线上CPU有时候突然飙升,想找到是哪个线程导致的,我相信他们肯定有自己的定位方法,今天我要分享的也仅仅是其中一种而已。
二、如何定位
为了模拟这种现象,写一个程序,先看代码
public static void main(String[] args) {
for(int i=1;i<=3;i++) {
new Thread() {
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
}
Thread thread = new Thread() {
@Override
public void run() {
while(true) {
System.out.println("start foreach");
}
}
};
thread.setName("线程1");
thread.start();
}
有几个线程,其中,有3个线程什么都没干,仅仅是sleep了,而另外一个单独的线程我让它while(true)一直不停的输出 "start foreach",很明显,这个线程名叫做"线程1"的线程肯定会大量占用CPU,那么在我们事先不知道的情况下,如何把它找出来呢?
首先将上面代码打成一个jar包,然后直接启动即可,会看看源源不断的输出 start foreach,
第一步:先jps看一下进程号
[root@slave ~]# jps
2942 Jps
2910 jar
第二步:使用top -Hp 进程号 查看该进程下各个线程占用CPU情况
root@slave ~]# top -Hp 2910
top - 01:09:25 up 13 min, 2 users, load average: 0.11, 0.13, 0.09
Tasks: 14 total, 0 running, 14 sleeping, 0 stopped, 0 zombie
Cpu(s): 5.1%us, 9.1%sy, 0.0%ni, 85.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 3907472k total, 1282472k used, 262