JAVA & JVM

Java Thread

샤워하다돌면워싱턴 2022. 8. 30. 20:10
반응형
Thread? 하나의 프로세스 내부에서 독립적으로 실행되는 하나의 작업 단위를 말한다.
두개 이상의 스레드가 같은 자원을 이용할 때는 필연적으로 경합이 발생하고 경우에 따라서 DEADLOCK이 발생할 수도 있다.

스레드 상태
NEW: 스레드가 생성되었지만 아직 실행되지 않은 상태
RUNNABLE: 현재 CPU를 점유하고 작업을 수행 중인 상태. 운영체제의 자원 분배로 인해 WAITING 상태가 될 수도 있다.
BLOCKED: CPU를 점유하기 위해 다른 스레드가 락을 해제하기를 기다리는 상태
WAITING: wait() 메서드, join() 메서드, park() 메서드 등를 이용해 대기하고 있는 상태
TIMED_WAITING: sleep() 메서드, wait() 메서드, join() 메서드, park() 메서드 등을 이용해 대기하고 있는 상태. 
  • WAITING 상태와의 차이점
    : 메서드의 인수로 최대 대기 시간을 명시할 수 있어 외부적인 변화뿐만 아니라 시간에 의해서도 WAITING 상태가 해제될 수 있다는 것.
Thread Dump ??
  • 서비스 진행 중 자바는 스레드를 이용해서 사용하게 되는데 사용자의 요청에 따른 스레드들을 파일형태로 생성되어 그 내용을 볼 수 있음.
  • java was에 문제가 있을때 사용. 
  • Java 어플리케이션의 각 Thread의 CPU 사용율을 확인 방법|
 
Thread Dump를 생성하는 방법
  • ps -ef | grep java ( 자바가 사용하는 프로세스 ID (PID)를 확인 )
  • kill -3 [PID] ( 덤프를 생성하는 명령어 3초간격 3번)
  • jps -v (현재 JVM이 사용하는 PID를 확인)
  • jstack [PID] (덤프를 생성하여 해당 PID의 덤프를 확인 할 수 있다.)
 
Thread Dump 분석이 필요한 경우
1. Hang
  • Java 어플리케이션의 Thread들이 멈춰있는 상황
  • 스레드 덤프를 통해 Thread들이 현재 수행하고 있는 상태를 확인 하여 원인을 파악 할 수 있다.
  • Hang 상태가 발생하는 경우는 다양하며 주요한 원인으로 Object locking, Heap locking등이 있다.
2. Java 어플리케이션의 처리가 늦을 경우(wait for I/O)
  • SQL문 수행의 지연으로 DB에서 데이터를 불러오기 위해 대기하는 상태.
     
  • 어느 stack에서 지연되는지를 확인 가능.
  • Thread들이 sleep단계에서 모두 대기하는 상태.
3. Java 어플리케이션의 CPU 사용률이 높을 경우(특정 Thread가 높을 경우)
  • Thread의 수행 상태와 stack을 확인.
  • Java 어플리케이션의 각 Thread
     
 
스레드 3가지 유형
경합
 : 여러 스레드들을 참조할때 특정 스레드가 큰 점유율을 가지면 나머지 스레드는 웨이팅됨. 
이렇게되면 사용자의 요청을 지연시키게됨. 공용 스레드에 대한 로직 변경이나 소스 수정 필요
 
deadlock 
: 특정 스레드 하나가 문제가 발생되면 나머지 스레드들도 영향을 받는 상황.
데드락 스레드에 대한 내용 스레드 덤프를 실행 - > 데드락이라고 명시되어있음. 
원인은 코딩, was 클래스가 문제일수도 있음. 발생 시 모니터링툴 사용해서 해당요청을 줄일수 있다면 상관없다.
그렇지않으면 재기동해야함
 
wait for I/O : db쪽에 대용량 데이터를 요청할 시 시간이 길어지는 상황. 
공용 스레드가 문제일수도, 데드락 상황 발생 가능, 자주 발생함 소켓 리드에 걸릴수도 있고. 
해결 시 
1.모니터링툴을 이용.
2. 덤프파일 확인후 수행한 클래스 찾아가서 어떤 쿼리를 사용했는지 튜닝필요.
반응형