로컬 레벨에서 JVM을 실행시키고 실행중인 Thread / OOM 유발 원인이 되는 Heap 메모리 할당 현황등을 확인하고 싶다면 매우 유용한 도구가 있다.
Visual VM이라는 도구로 로컬에서 실행한 Java Application을 뜯어볼 수 있다.
https://visualvm.github.io/download.html
VisualVM: Download
First Steps Unzip the downloaded archive. The archive already contains the top-level visualvm directory. Start VisualVM by invoking the binary appropriate for your OS:visualvm\bin\visualvm.exe or visualvm/bin/visualvm You may provide additional options to
visualvm.github.io
위 링크에서 다운로드 가능하다.
이번에 Thread Pool이 계속 가득차는 버그가 존재하여, 버그를 디버깅하다가 너무 디버깅이 어려워서 해당 툴을 동료 개발자분을 통해 접하고 사용해보게 되었다.
참고로 실무에서 사용하고 싶은 분들을 위해 해당 툴의 License에 대해 적자면
The GNU General Public License (GPL) Version 2 오픈소스 라이센스를 사용하고 있다. (흔히 GPL 2 라이센스라고 부른다.)
즉, 업무용도이더라도 모니터링 도구로 사용은 가능
소스코드에 해당 Application을 포함/개조는 불가능이다.
-> 사실상 자유롭게 써도 된다.

처음 실행시키면 투박한 화면이 나온다.

좌측에는 실행중인 프로세스가 보인다.
pid 58307번 프로세스는 방금 내가 실행시킨 Spring 서버이다.

여기서 Threads에 들어가면 쓰레드의 이름과 함께 현재 실행중인, 사라진 쓰레드가 모두 나온다.
실제로 어플리케이션에서 멀티쓰레딩을 실행하면 이름별로 분기되어 보이게된다. (추가되면 이름과 함께 아랫줄에 쓰레드가 추가된다.)
보통 쓰레드를 실행시킬 때는 쓰레드풀에 이름을 붙여서 사용하므로 어느 쓰레드풀에서 쓰레드가 많이 돌아가고있는지, 모니터링이 가능하다.
매우 유용한 데드락 감지 기능또한 있어서 데드락 발생 시 쓰레드별로 로그를 기록한 덤프 에러로그를 확인할 수도 있다.

또한 Monitor 탭에서는 힙 메모리와 GC의 현황등을 모니터링 가능하다.
되게 기능이 많은 것 같은데, 일단 이정도만 봐도 OOM 원인 분석과 멀티쓰레딩 테스팅에 큰 도움이 된다.
'Develop(개발) > Today I Learned' 카테고리의 다른 글
| [TIL] QueryDSL의 경로 초기화 문제 (2) | 2025.02.16 |
|---|