CPU를 가장 많이 점유하는 쓰레드가 무엇인지 추출한다.
애플리케이션의 수행 성능이 비정상적으로 느릴 때에는 BLOCKED 상태인 쓰레드가 원인인 경우가 많다. 이 때에는 쓰레드 덤프를 여러 번 얻은 다음 BLOCKED 상태인 쓰레드 목록을 찾고 BLOCKED 상태인 쓰레드가 획득하려는 락과 관련된 쓰레드를 추출해본다.
jps -v // 자바 애플리케이션 프로세스 PID 확인
jstack PID //jps로 추출한 PID를 인수로 넣어 jstack을 하면 쓰레드 덤프를 획득한다.
예제 코드
ThreadTest.java
package thread;
public class ThreadTest implements Runnable {
private long depositeMoney = 10000;
public void run() {
synchronized (this) {
for (int i = 0; i < 10; i++) {
notify();
try {
wait();
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
} if (getDepositeMoney() <= 0)
break; withDraw(1000);
}
}
}
public void withDraw(long howMuch) {
if (getDepositeMoney() > 0) {
depositeMoney -= howMuch;
System.out.print(Thread.currentThread().getName() + " , ");
} else { System.out.print(Thread.currentThread().getName() + " , ");
System.out.println("잔액이 부족합니다.");
}
}
public long getDepositeMoney() {
return depositeMoney;
}
}
ThreadMain.java
package thread;
public class ThreadMain {
public static void main(String[] args) {
ThreadTest atm = new ThreadTest();
Thread mother = new Thread(atm, "mother");
Thread son = new Thread(atm, "son");
mother.start();
son.start();
}
}
PID 확인
쓰레드 덤프 생성
Thread 상세 확인
https://fastthread.io/에 쓰레드 덤프 업로드
참고