참고:
https://brunch.co.kr/@springboot/126
https://brunch.co.kr/@springboot/98
https://imasoftwareengineer.tistory.com/4
jstack을 사용해서 Thread Dump를 뜰 수 있다.
$ ps -ef | grep java
$ jstack pid > output.txt
Thread의 Life cycle은 아래와 같다.
- NEW: Thread가 막 생성됨. start는 아직 안됨.
- RUNNABLE: start된 상태. run호출하면 RUNNING 된다.
- WAITING: 다른 Thread의 통지를 기다는 일시정지 상태.
- TIMED_WAITING: 주어진 시간동안 기다리는 상태.
- BLOCKED: 사용하려는 자원에 대해 락이 풀리길 기다림.
- TERMINATED: 종료됨.
다만 jstack으로 보는건 수월하지가 않아 툴을 사용하면 좋다
만약 어떠한 request에 대해 slow query가 존재한다고 가정해보자.
하나의 request에 대한 Thread가 빨리 끝나지 않는다.
클라이언트는 CLOSE를 하려고 하고 서버는 CLOSE_WAIT 상태가 된다.
$ netstat -tnop | grep CLOSE -c
Thread Dump를 확인해보면 TIMED_WAITING 상태인 Thread가 많이 쌓여 있는걸 확인해 볼 수 있다 .
또한 어디에서 문제가 일어나는지에 대해 흰트를 찾을 수 있다.
이제 Heap Dump에 대해 알아보자.
요런 에러 메세지를 볼 때가 종종 있을 거다.
java.lang.OutOfMemorryError: heap space
Heap 공간이 부족하다는 뜻인데, 메모리 릭 일수도 있지만 그냥 프로그램이 많은 메모리를 사용할 수도 있는거고 또는 Heap size가 작게 셋팅된 것일 수 있다.
이럴 때는 아래처럼 Heap을 늘려주면 된다.
$ java -Xmx4g MyApplication
- JMAP
- JHAT
'프로그래밍 > JAVA' 카테고리의 다른 글
자바 Thread 순서 보장하기 (0) | 2020.05.26 |
---|---|
Java trouble shooting (0) | 2020.04.03 |
자바8 Optional (0) | 2019.04.23 |
WebFlux & Non-blocking (0) | 2019.04.22 |
Collection remove에 대해 (0) | 2019.03.20 |