본문 바로가기

프로그래밍/JAVA

Thread Dump & Heap Dump

참고: 

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으로 보는건 수월하지가 않아 툴을 사용하면 좋다 

https://fastthread.io/



만약 어떠한 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