본문으로 건너뛰기

JVM heap 모니터링은 어떻게 하나요?

💡 요약 정리

  • jmap을 활용한 JVM heap 모니터링을 권장합니다.
    1. jps로 Tomcat PID 확인 → 2) jmap -heap으로 힙/세대별 현황 확인 → 3) jmap -histo:live로 클래스별 사용량 확인.
  • Old Generation 사용량이 계속 증가하면 메모리 누수를 의심하세요.
  • 상세 원인 파악은 jmap만으로는 어렵고, 힙 덤프를 받아 별도 분석이 필요합니다.

가끔 웹사이트 운영 중 OOM(Out Of Memory)이 발생하여 Tomcat이 정상 동작하지 않는 경우가 있습니다. 이때 JVM heap 상태를 확인하려면 jmap을 활용해 점검할 수 있습니다.


1. Tomcat 프로세스 ID(PID) 확인: jps

  • 실행 중인 Tomcat 프로세스 ID를 확인하려면 다음 명령을 실행합니다.
# jps
  • 출력에서 Bootstrap의 id 값이 Tomcat 프로세스 ID입니다.
jps 명령어 결과 예시 - Bootstrap PID 확인
  • jps 결과 예시 화면입니다. Bootstrap 옆 숫자가 Tomcat PID입니다.

2. JVM Heap 상태 확인: jmap -heap

  • 확인한 PID로 JVM 힙 상태를 조회합니다.
# jmap -heap [pid]
jmap -heap 출력 예시 - Heap 설정 및 세대별 사용량
  • Heap 설정과 각 Generation(Young/Old)별 사용 현황을 확인할 수 있습니다.
  • Old Generation 사용량이 지속적으로 증가한다면 메모리 누수(memory leak)를 의심할 수 있습니다.

3. 클래스별 객체/메모리 사용량 확인: jmap -histo

  • 클래스별 객체 수와 메모리 사용량을 더 자세히 보려면 -histo 옵션을 사용합니다.
# jmap -histo:live [pid] | more

참고: 일반적으로는 다음처럼 공백을 포함해 사용합니다: jmap -histo:live [pid] | more

jmap -histo:live 출력 예시 - 클래스별 객체 수/메모리 사용량
  • 주기적으로 클래스별 객체 수와 메모리 사용량을 체크하면, 어느 클래스에서 누수가 발생하는지 대략적으로 파악할 수 있습니다.

추가 안내

  • 어느 부분에서 누수가 유발되는지에 대한 정확한 원인은 jmap만으로는 알 수 없습니다. heap dump를 받아 별도 분석이 필요합니다.