쓰레드 덤프

de_sj_awa·2021년 4월 26일
0
post-custom-banner

1. 쓰레드의 상태

  • NEW : 쓰레드가 생성되었지만 아직 실행되지 않은 상태
  • RUNNABLE : 현재 CPU를 점유하고 작업을 수행 중인 상태. 운영체제의 자원 분배로 인해 WAITING 상태가 될 수 있다.
  • BLOCKED : Monitor를 획득하기 위해 다른 쓰레드가 락을 해제하기를 기다리는 상태
  • WAITING : wait() 메서드, join() 메서드, park() 메서드 등을 이용해 대기하는 상태
  • TIMED_WAITING : sleep() 메서드, wait() 메서드, join() 메서드, park() 메서드 등을 대기하고 있는 상태. WAITING 상태와의 차이점은 메서드의 인수로 최대 대기 시간을 명시할 수 있어 외부적인 변화 뿐만 아니라 시간에 의해서도 WAITING 상태가 해제될 수 잇다는 것이다.

2. 쓰레드를 통한 문제 해결

1. CPU 사용률이 비정상적으로 높을 때

CPU를 가장 많이 점유하는 쓰레드가 무엇인지 추출한다.

2. 수행 성능이 비정상적으로 느릴 때

애플리케이션의 수행 성능이 비정상적으로 느릴 때에는 BLOCKED 상태인 쓰레드가 원인인 경우가 많다. 이 때에는 쓰레드 덤프를 여러 번 얻은 다음 BLOCKED 상태인 쓰레드 목록을 찾고 BLOCKED 상태인 쓰레드가 획득하려는 락과 관련된 쓰레드를 추출해본다.

3. 쓰레드 덤프 생성 방법

jps -v		// 자바 애플리케이션 프로세스 PID 확인

jstack PID		//jps로 추출한 PID를 인수로 넣어 jstack을 하면 쓰레드 덤프를 획득한다.

4. 예제

예제 코드

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();
    }
}
  1. PID 확인

  2. 쓰레드 덤프 생성

  3. Thread 상세 확인

    https://fastthread.io/에 쓰레드 덤프 업로드

참고

profile
이것저것 관심많은 개발자.
post-custom-banner

0개의 댓글