Eclipse Memory Analyzer(MAT) 설치 및 사용법
Eclipse Memory Analyzer(MAT)를 사용해서 Java Heap Dump을 분석하는 방법에 대해 알아보겠습니다. MAT를 eclipse의 플러그인으로 설치하지 않고 Stand-alone으로 사용할 수 있네요! TMAXSOFT 사이트의 테크니컬 센터 -> 기술지식 -> MAT를 이용한 힙덤프 분석 실습 및 Heap Dump 분석 가이드 자료를 참고하시면 좋습니다. 연습용 Heap Dump 파일을 MAT로부터 생성할 수도 있다고 하네요. 여기를 클릭하시면 관련 내용을 확인하실 수 있습니다.
- MAT 다운로드 사이트에서 자신의 운영환경에 맞는 파일을 다운로드합니다. 저는 Windows (x86_64)를 다운로드하겠습니다. 압축파일(.zip)이 다운로드됩니다.

- OpenJDK가 설치되지 않았거나, 최신 버전을 사용하고자 한다면 OpenJDK도 다운로드합니다. 저는 최신버전의 OpenJDK를 다운로드하겠습니다.

- MAT와 OpenJDK의 다운로드가 완료되면 압축을 풀고, OpenJDK를 MAT 하위 폴더로 이동시킵니다. OpenJDK는 다른 경로에 저장하셔도 됩니다.
- MemoryAnalyzer.exe 파일이 있는 폴더로 이동합니다. MAT를 실행하기 위해서는 Java 가상머신 경로를 설정해 줘야 하는데, JAVA_HOME 환경변수에 설정하거나 MemoryAnalyzer.ini 파일에 설정해야 합니다. 저는 MemoryAnalyzer.ini 파일에 아래와 같은 설정을 추가하겠습니다. 그리고 MAT에서 사용할 메모리의 크기도 늘려줍니다(4GB 이상의 파일을 분석한다면 -Xmx6g 또는 -Xmx8g 정도로 수정). 그렇지 않으면 Java heap space error가 발생합니다.
-vm D:\mat\jdk-26\bin\javaw.exe ... -vmargs --add-exports=java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED -Xmx8g
- MemoryAnalyzer.exe 파일을 실행한 후 File > Open Heap Dump 메뉴를 선택하여 분석하고자 하는 Java heap dump 파일(.hprof)을 오픈합니다. 이전에 분석했던 파일이라면 .hprof를 제외한 모든 파일(.index, .threads 등)을 삭제한 후 오픈합니다.

- 선택된 heap dump file의 파싱이 끝나면 아래와 같은 Dialog가 나옵니다. Leak Suspects Report를 선택하고 Finish 버튼을 클릭합니다.
- Leak Suspects Report: MAT의 분석 엔진이 전체 힙 메모리를 훑어서 비정상적으로 큰 면적을 차지하고 있는 객체 그룹을 찾아냅니다. 메모리 누수가 의심될 때 가장 먼저 실행하는 리포트입니다. 보통 여기서 80~90%의 원인이 파악됩니다.
- Component Report: 클래스 로더(Class Loader)나 패키지 단위로 객체들을 그룹화하여 분석합니다. 전체적인 누수보다는 특정 모듈의 최적화가 필요할 때 사용합니다.
- Re-open previously run reports: 이전에 해당 힙 덤프에 대해 생성했던 리포트 결과물들을 다시 화면에 띄웁니다.
- Default report 확인
- 가장 많은 메모리를 점유(Retained Heap)하고 있는 특정 객체나 쓰레드를 찾아 Problem suspect로 표시합니다.
- Problem suspect별 섹션의 하단에 Details »을 클릭하면 상세 정보를 확인할 수 있습니다.
- 먼저 Inspector 뷰를 화면에 표시합니다. Window > Inspector 메뉴를 선택한 후 Inspector 뷰를 화면의 왼쪽에 배치합니다.

- Dominator Tree 뷰로 이동합니다. Dominator Tree 아이콘을 클릭하거나 Overview 탭의 Dominator Tree 텍스트 링크를 클릭합니다. Dominator Tree는 힙덤프 분석에서 “어떤 객체가 메모리를 인질로 잡고 있는가”를 보여주는 가장 직관적인 도구로, 단순히 객체 수만 나열하는 Histogram과 달리, 객체 간의 종속 관계를 트리 구조로 재구성하여 보여줍니다.

- Dominator Tree 뷰에서 jeus.servlet.engine.WebThread 클래스를 선택하면, Inspector 뷰에 속성들과 값들이 나열됩니다. 먼저 currentRequest 속성으로 이동합니다.

- currentRequest 속성에서 포트 번호(webServerPort) 및 발생한 시간(startTime)을 확인합니다. startTime값은 Epoch & Unix Timestamp Conversion Tools 사이트에서 읽을 수 있는 시간으로 변환할 수 있습니다.

- 마지막으로 많은 양의 데이터를 처리한 SQL쿼리를 찾는 방법입니다. Dominator Tree뷰에서 net.sf.log4jdbc.PreparedStatementSpy 클래스를 선택하면, Inspector뷰의 sql 속성이 표시됩니다. sql 속성의 Value를 복사한 후 텍스트 편집기에 붙여놓기 하시면 됩니다.

