jstat과 streamlit을 이용한 JVM GC/Heap 메모리 관찰
엔터프라이즈 Java 애플리케이션에서 JVM 힙 메모리 관리와 가비지 컬렉션(GC) 동작 이해는 성능 튜닝과 문제 진단에 핵심적입니다. jstat과 같은 JDK 기본 제공 도구는 GC 활동과 힙 사용량에 대한 실시간 통계를 제공하지만, 숫자로 된 표 형태의 출력은 패턴을 파악하거나 이상 징후를 한눈에 보기에 불편할 수 있습니다. 많은 엔지니어들이 “jstat 출력을 수동으로 해석하는 것은 시간도 많이 소요되고 오류 발생 가능성도 높다”는 경험을 공유하며, 직관적인 시각화 툴의 필요성을 언급해 왔습니다.
VisualGC는 이러한 필요에 응답하는 오픈 소스 도구입니다. VisualGC는 JVM GC 로그(특히 jstat 출력)를 받아 메모리 사용량 및 GC 활동을 시각적으로 보여주는 인터랙티브 차트를 즉시 생성합니다. 이를 통해 복잡한 로그를 바로 이해 가능한 인사이트로 전환하여 엔지니어와 운영자가 메모리 동작을 빠르게 파악하고 잠재적 문제를 발견할 수 있게 도와줍니다.
Demo(Streamlit): https://visualgc.streamlit.app/Jstat_Analyzer
GitHub Repo: https://github.com/call518/VisualGC
VisualGC는 Streamlit 기반의 웹 애플리케이션으로, JVM GC 로그 분석을 쉽고 접근성 높게 만든 도구입니다. 주요 기능은 아래와 같습니다:
간편한 입력 방식: jstat의 원본 출력 텍스트를 가공 없이 바로 붙여 넣기만 하면 됩니다.
즉각적인 시각화: 클릭 한 번으로 GC 횟수, 힙 사용량 변화 그리고 주요 지표를 인터랙티브 차트로 표시합니다.
직관적 사용자 인터페이스: Streamlit이 제공하는 대시보드는 GC 로그에 익숙하지 않은 사용자도 쉽게 다룰 수 있으며, Eden, Survivor, Old Gen, Met스페이스 영역을 색상과 레이블로 구분해 명확히 보여줍니다.
의미 있는 통찰 제공: 예를 들어 Minor GC 시 Eden 영역이 급격히 비워지거나 Full GC 후 Old Gen 사용량이 변화하는 과정을 시각적으로 확인할 수 있습니다.
성능 최적화 지원: 시각화된 패턴과 이상 현상을 기반으로 힙 크기 조정, GC 방식 튜닝 등 개선 포인트를 도출할 수 있습니다.
VisualGC는 JVM 내부 동작을 투명하게 보여주며, 메모리 최적화에 대해 데이터 기반의 판단을 가능하게 합니다.
입력 단계
사용자는 jstat -gc <PID> <간격(ms)> <횟수> 명령으로 JVM의 GC 통계를 수집합니다. 이 명령은 Eden, Survivor, Old Gen, 메타스페이스 사용량뿐 아니라 GC 횟수와 사용 시간을 시간 흐름에 따라 표 형태로 출력합니다.
파싱 단계
VisualGC는 이 로그를 그대로 텍스트 입력으로 받으며, 첫 줄 헤더와 이후 데이터를 Pandas 같은 Python 라이브러리로 읽어 데이터프레임으로 구조화합니다.
시각화 단계:
Streamlit 및 Altair 또는 Plotly 같은 시각화 라이브러리를 활용해 Eden, Old Gen, Survivor 영역의 메모리 사용량 선 그래프, GC 이벤트 타임라인, 힙 용량 한계선 등을 표시합니다. 차트는 확대, 툴팁 등 인터랙티브 기능도 제공합니다.
출력 단계:
차트 외에도 Young/Full GC 총 횟수, 누적 GC 시간, 기타 JVM 상태 요약 지표가 제공되어, GC로 인한 비용과 동작 상태를 정량적으로 파악할 수 있습니다.
GC 로그 수집
예: jstat -gc <PID> 1000 60 으로 1초 간격 60회 데이터를 수집한 후 출력 내용을 복사합니다.
VisualGC 실행
웹 버전 혹은 GitHub 레포지토리를 클론 하여 streamlit run Welcome.py 명령어로 실행할 수 있습니다.
로그 붙여 넣기 및 분석
입력란에 jstat 로그를 붙여 넣고 Confirm 또는 Create Plot 버튼을 클릭하면 분석 차트가 즉시 생성됩니다.
결과 해석
생성된 그래프를 통해 GC 이벤트 발생 시점과 메모리 사용량 변화를 분석하고, 요약 지표를 통해 시스템 상태를 파악합니다.
(샘플 데이터 시각화 예시)
메모리 누수 진단
Full GC 이후에도 Old Gen 사용량이 감소하지 않고 지속적으로 우상향 한다면, 메모리 누수가 의심됩니다. VisualGC 차트를 통해 이러한 트렌드를 한눈에 파악할 수 있습니다.
GC 패턴 분석
Eden 공간이 자주 비워지거나 Full GC에 긴 지연이 발생하는 경우, 현재 GC 설정이 적절한지 확인이 필요합니다. VisualGC는 Minor/Full GC 발생 빈도 및 패턴을 직관적으로 보여줍니다.
성능 튜닝
GC 시간이 과도하게 길거나 힙 사용 패턴이 비효율적으로 보이는 경우, VisualGC 분석을 통해 힙 크기 설정(-Xms, ‑Xmx), Young/Old 세대 비율, GC 알고리즘 등을 조정해 성능을 최적화할 수 있습니다.
JVM의 GC 로그는 복잡하고 해석하기 어려울 수 있지만, VisualGC는 이를 시각적이고 이해하기 쉬운 인사이트로 전환합니다. 웹 기반 오픈 소스 도구로서, 개발자 누구나 손쉽게 JVM 메모리 사용 현황을 분석하고, 예방적 성능 최적화를 수행할 수 있습니다. 데이터 기반 JVM 튜닝이 필요할 경우, VisualGC가 도움이 되지 않을까 생각합니다. 프로젝트는 누구나 확장하거나 기여할 수 있으며, GitHub에서 자세한 정보와 코드를 확인하실 수 있습니다 (GitHub 소스 저장소:https://github.com/call518/VisualGC), 그리고 실제 동작하는 Streamlit 웹 애플리케이션은 https://visualgc.streamlit.app/ 에서 테스트해 볼 수 있습니다.