Skip to main content

Memory Analyzer(MAT)으로 Android 앱의 Java Heap Dump 완벽 분석 가이드

·661 words·4 mins
미뇽
Author
미뇽
안녕하세요! 기술로 세상을 이롭게 만들고 싶은 개발자 미뇽입니다.
Table of Contents

#

안드로이드 앱 개발 시 메모리 누수는 앱의 성능을 저하시키고, 심할 경우 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가 자동으로 메모리 누수가 의심되는 지점을 분석하여 리포트 형태로 보여주기 때문입니다.

Get Started

  • 리포트가 생성되면 파이 차트와 함께 메모리 누수의 원인으로 의심되는 객체(Problem Suspect)가 표시됩니다. 보통 이 리포트만 잘 확인해도 문제의 절반은 해결됩니다.

Check problem suspect

주요 분석 기능
#

Leak Suspects 보고서로 문제가 해결되지 않았다면, 더 깊게 분석해야 합니다. MAT의 핵심 기능 두 가지만 기억하면 충분합니다.

Histogram (히스토그램)

  • 기능: 메모리에 로드된 모든 객체를 클래스별로 목록화하여 보여줍니다. 각 클래스의 인스턴스 수(Objects), 인스턴스 자체가 차지하는 메모리(Shallow Heap), 그리고 해당 인스턴스가 참조하는 다른 모든 객체까지 포함한 메모리(Retained Heap)를 확인할 수 있습니다.
  • 사용법:
    1. 상단 툴바에서 히스토그램 아이콘을 클릭합니다.
    2. Retained Heap을 기준으로 내림차순 정렬합니다. 가장 위에 있는 항목들이 메모리를 가장 많이 점유하는 객체들입니다.
    3. 불필요하게 많은 인스턴스가 존재하거나, 비정상적으로 큰 메모리를 차지하는 클래스가 있는지 확인합니다.

Dominator Tree (도미네이터 트리)

  • 기능: 객체 간의 참조 관계를 트리 구조로 보여주어, 어떤 객체가 다른 객체들의 생명주기를 ‘지배(Dominate)‘하고 있는지 명확하게 보여줍니다. 즉, 특정 객체 하나를 제거했을 때 연쇄적으로 메모리에서 해제될 수 있는 객체들의 집합을 파악하는 데 가장 유용한 기능입니다.
  • 사용법:
    1. 상단 툴바에서 도미네이터 트리 아이콘을 클릭합니다.
    2. 마찬가지로 Retained Heap 기준으로 정렬하여 가장 큰 메모리 덩어리를 찾습니다.
    3. 트리를 확장하며 어떤 객체(예: Activity, Context)가 예상과 달리 수많은 다른 객체들을 참조하고 있는지 추적합니다.

실용적인 팁: GC Root 경로 추적

누수가 의심되는 객체를 찾았다면, 왜 이 객체가 가비지 컬렉터(GC)에 의해 수거되지 않는지 알아야 합니다.

  1. Histogram이나 Dominator Tree에서 의심되는 객체를 마우스 오른쪽 버튼으로 클릭합니다.
  2. Path to GC Roots > exclude all phantom/weak/soft etc. references를 선택합니다.
  3. 이 객체를 메모리에서 계속 붙잡고 있는 참조 경로(Chain of References)가 나타납니다. 보통 static 필드나 백그라운드 스레드, 혹은 잘못 관리된 리스너 등이 원인인 경우가 많습니다. 이 경로를 따라가면 누수의 근본 원인을 찾을 수 있습니다.

마무리하며
#

메모리 누수는 잡기 어려운 버그일 수 있지만, MAT과 같은 강력한 도구를 활용하면 체계적으로 접근하여 해결할 수 있습니다.

핵심 요약:

  1. Heap Dump 생성: 안드로이드 스튜디오 프로파일러 사용
  2. hprof 변환: hprof-conv 도구로 표준 형식으로 변환 (필수!)
  3. MAT 분석: Leak Suspects로 자동 분석 후, Dominator TreeHistogram으로 상세 분석

이 가이드가 안드로이드 앱의 성능과 안정성을 높이는 데 실질적인 도움이 되기를 바랍니다. 꾸준한 메모리 관리는 고품질 앱의 기본입니다.