참고:
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
메모리 릭이 발생하는 경우에 대해서는 어떻게 해야 하는가?
사실 메모리 릭이 발생하는지는 어떻게 알 수 있는가?
Heap Dump를 떠보면 알 수 있는 거다.
JDK에는 많은 툴들이 포함되어 있고 Heap Dump를 뜰 수 있는 툴도 존재한다.
- JMAP
- JHAT
// java process's pid
$ jps
// jmap
$ jmap -dump:live,file=<file-path> <pid>
// jhat, 포트 7000에다가 jhat을 실행시킴
$ jhat -J-Xmx6g -port 7000 ./heapdump.bin
// 해당 url에 접속하면 jhat에 대한 정보를 볼 수 있음
http://localhost:7000
타고 가다보면 어디서 문제가 발생했는지 흰트를 찾을 수 있다.
'프로그래밍 > 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 |