CPU가 가장 많이 소모되는 스레드를 어떻게 포지셔닝합니까
33563 단어 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
를 통해 이 프로세스의 모든 라인의 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 cached
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
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
의 출력을 통해 각 스레드 창고를 볼 수 있다.$ 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: RUNNABLE
at 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라는 것을 알아차렸다. 이것은 16진법이다. 우리는 cpu에서 가장 높은 스레드
18250
를 소모하고 16진법0x474a
으로 전환한 다음에 위의 스레드 창고에서 nid=0x474a
의 스레드를 찾을 것이다. 그 창고는 다음과 같다.
"Busiest Thread" #28 prio=5 os_prio=0 tid=0x00007fb91498d000 nid=0x474a runnable [0x00007fb9065fe000]
java.lang.Thread.State: RUNNABLE
at Test$2.run(Test.java:18)
곧 가장 소모되는 cpu의 라인을 찾았습니다.
Businest Thread
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바 문자열 풀우리는 Java에서 문자열이 힙 메모리 영역에 저장된다는 것을 알고 있습니다. 이 힙 메모리 내부에는 String Pool이라는 특정 메모리 영역이 있습니다. 문자열 프리미티브를 생성하면 자바 문자열의 불변성 덕분에...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.