#
안드로이드 앱 개발 시 메모리 누수는 앱의 성능을 저하시키고, 심할 경우 ANR(Application Not Responding)이나 OOM(Out of Memory) 오류를 발생시키는 주범입니다. 이번 글에서는 강력한 메모리 분석 도구인 Memory Analyzer(MAT) 를 사용하여 안드로이드 앱의 Java Heap Dump 파일을 분석하고 메모리 누수를 찾아내는 과정을 상세히 안내하겠습니다.
Heap Dump 파일 생성하기#
가장 먼저 분석할 메모리 스냅샷, 즉 Heap Dump 파일이 필요합니다. 안드로이드 스튜디오에서 간단하게 생성할 수 있습니다.
Android Studio Profiler 실행:
- 앱을 디버그 모드로 실행합니다.
- 하단의
Profiler
탭을 엽니다. Memory
프로파일러를 선택합니다.
Heap Dump 생성:
- 메모리 사용량을 모니터링하다가 분석하고 싶은 시점에 ‘Dump Java heap’ 버튼 (아래 이미지의 아이콘)을 클릭합니다.
- 덤프가 완료되면 Android Studio가 자동으로
.hprof
파일을 생성하고 목록에 표시해 줍니다.
이제 분석의 재료가 되는 .hprof
파일이 준비되었습니다.
hprof 파일 변환하기 (가장 중요!)#
안드로이드 스튜디오에서 생성된 .hprof
파일은 안드로이드 환경에 최적화된 형식입니다. 이 파일을 MAT에서 바로 열면 오류가 발생합니다. 따라서 MAT가 인식할 수 있는 표준 Java hprof
형식으로 변환해야 합니다.
이때 hprof-conv
라는 변환 도구를 사용합니다.
hprof-conv 위치:
- Android SDK 설치 경로 내의
platform-tools
폴더에 있습니다. - 예:
C:\Users\[사용자명]\AppData\Local\Android\Sdk\platform-tools
변환 명령어: 터미널이나 명령 프롬프트를 열고 아래 명령어를 실행합니다.
hprof-conv [입력 파일 경로] [출력 파일 경로]
실행 예시: 원본 파일을 옮겼다고 가정해 보겠습니다.
cd C:\Users\[사용자명]\AppData\Local\Android\Sdk\platform-tools
./hprof-conv.exe C:\Users\[사용자명]\Desktop\original.hprof C:\Users\[사용자명]\Desktop\converted.hprof
이제 converted.hprof
라는 새로운 파일이 생성되었습니다. 이 파일을 MAT에서 사용하게 됩니다. 이 변환 과정을 잊으면 분석을 시작할 수 없으니 꼭 기억하시기 바랍니다.
Memory Analyzer (MAT) 설치 및 실행#
MAT는 이클립스 재단에서 제공하는 무료 오픈소스 도구입니다.
설치:
- Eclipse MAT 공식 다운로드 페이지 에 접속하여 본인의 운영체제에 맞는 버전을 다운로드합니다.
- 압축을 풀기만 하면 바로 실행할 수 있는 독립 실행형(Standalone) 버전입니다.
실행:
- 압축 해제한 폴더에서
MemoryAnalyzer
또는mat
실행 파일을 실행합니다. - MAT 실행을 위해서는 Java Runtime(JRE)이 설치되어 있어야 합니다.
MAT으로 Heap Dump 파일 분석하기#
이제 모든 준비가 끝났습니다. 변환된 Heap Dump 파일을 MAT으로 분석해 보겠습니다.
파일 열기#
- MAT를 실행하고
File > Open Heap Dump...
메뉴를 통해 아까 변환했던converted.hprof
파일을 엽니다. - 파일 크기에 따라 로딩 시간이 다소 걸릴 수 있습니다.
Leak Suspects Report (누수 의심 보고서)#
- 파일을 열면 가장 먼저 아래와 같은 팝업창이 나타납니다.
- **‘Leak Suspects Report’**를 선택하고
Finish
를 누르는 것을 강력히 권장합니다. MAT가 자동으로 메모리 누수가 의심되는 지점을 분석하여 리포트 형태로 보여주기 때문입니다.
- 리포트가 생성되면 파이 차트와 함께 메모리 누수의 원인으로 의심되는 객체(Problem Suspect)가 표시됩니다. 보통 이 리포트만 잘 확인해도 문제의 절반은 해결됩니다.
주요 분석 기능#
Leak Suspects 보고서로 문제가 해결되지 않았다면, 더 깊게 분석해야 합니다. MAT의 핵심 기능 두 가지만 기억하면 충분합니다.
Histogram (히스토그램)
- 기능: 메모리에 로드된 모든 객체를 클래스별로 목록화하여 보여줍니다. 각 클래스의 인스턴스 수(Objects), 인스턴스 자체가 차지하는 메모리(Shallow Heap), 그리고 해당 인스턴스가 참조하는 다른 모든 객체까지 포함한 메모리(Retained Heap)를 확인할 수 있습니다.
- 사용법:
- 상단 툴바에서 히스토그램 아이콘을 클릭합니다.
Retained Heap
을 기준으로 내림차순 정렬합니다. 가장 위에 있는 항목들이 메모리를 가장 많이 점유하는 객체들입니다.- 불필요하게 많은 인스턴스가 존재하거나, 비정상적으로 큰 메모리를 차지하는 클래스가 있는지 확인합니다.
Dominator Tree (도미네이터 트리)
- 기능: 객체 간의 참조 관계를 트리 구조로 보여주어, 어떤 객체가 다른 객체들의 생명주기를 ‘지배(Dominate)‘하고 있는지 명확하게 보여줍니다. 즉, 특정 객체 하나를 제거했을 때 연쇄적으로 메모리에서 해제될 수 있는 객체들의 집합을 파악하는 데 가장 유용한 기능입니다.
- 사용법:
- 상단 툴바에서 도미네이터 트리 아이콘을 클릭합니다.
- 마찬가지로
Retained Heap
기준으로 정렬하여 가장 큰 메모리 덩어리를 찾습니다. - 트리를 확장하며 어떤 객체(예:
Activity
,Context
)가 예상과 달리 수많은 다른 객체들을 참조하고 있는지 추적합니다.
실용적인 팁: GC Root 경로 추적
누수가 의심되는 객체를 찾았다면, 왜 이 객체가 가비지 컬렉터(GC)에 의해 수거되지 않는지 알아야 합니다.
- Histogram이나 Dominator Tree에서 의심되는 객체를 마우스 오른쪽 버튼으로 클릭합니다.
Path to GC Roots > exclude all phantom/weak/soft etc. references
를 선택합니다.- 이 객체를 메모리에서 계속 붙잡고 있는 참조 경로(Chain of References)가 나타납니다. 보통
static
필드나 백그라운드 스레드, 혹은 잘못 관리된 리스너 등이 원인인 경우가 많습니다. 이 경로를 따라가면 누수의 근본 원인을 찾을 수 있습니다.
마무리하며#
메모리 누수는 잡기 어려운 버그일 수 있지만, MAT과 같은 강력한 도구를 활용하면 체계적으로 접근하여 해결할 수 있습니다.
핵심 요약:
- Heap Dump 생성: 안드로이드 스튜디오 프로파일러 사용
- hprof 변환:
hprof-conv
도구로 표준 형식으로 변환 (필수!) - MAT 분석:
Leak Suspects
로 자동 분석 후,Dominator Tree
와Histogram
으로 상세 분석
이 가이드가 안드로이드 앱의 성능과 안정성을 높이는 데 실질적인 도움이 되기를 바랍니다. 꾸준한 메모리 관리는 고품질 앱의 기본입니다.