반응형
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. 덤프파일 확인후 수행한 클래스 찾아가서 어떤 쿼리를 사용했는지 튜닝필요.
반응형
'JAVA & JVM' 카테고리의 다른 글
Class Loader (0) | 2022.08.30 |
---|---|
JAVA Memory Option (0) | 2022.08.30 |
ParallelGCThreads, ParallelCMSThreads 계산법 (0) | 2022.08.30 |
Garbage Collection Algorithm(가비지 컬렉션 알고리즘) (0) | 2022.08.30 |
JAVA란? (0) | 2022.08.30 |
댓글