본문 바로가기

개발 이야기/Android (안드로이드)

[Android] 확 바뀐 안드로이드 스튜디오 프로파일러로 메모리 릭 & CPU 점유율 잡는 법

320x100

Android Studio가 업데이트되면서 기존에 익숙했던 Android Monitor가 사라지고 **App Profiler**로 기능이 통합되었습니다. UI와 사용법이 변경되어 당황스러우셨던 분들을 위해, 최신 안드로이드 스튜디오(Koala, Ladybug 등) 환경에서 **메모리 릭(Memory Leak)**을 잡는 방법과 CPU 점유율을 분석하는 방법을 정리했습니다.


1. 메모리 릭(Memory Leak) 잡아내기

메모리 릭을 탐지하는 방법은 크게 두 가지가 있습니다. 개발 단계에서 가장 추천하는 자동화 툴(LeakCanary) 방식과, 정밀 분석을 위한 Android Studio Profiler 방식입니다.

방법 A: LeakCanary 라이브러리 사용 (추천)

가장 쉽고 확실한 방법입니다. 코드를 수정할 필요 없이 의존성만 추가하면, 앱 실행 중 메모리 릭이 발생할 때 자동으로 알림을 띄워줍니다.

1. 설정 (build.gradle : app module)

Kotlin
 
dependencies {
    // 디버그 빌드에서만 동작하도록 debugImplementation을 사용합니다.
    debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.12'
}

2. 확인 방법

  1. 앱을 실행하고 메모리 릭이 의심되는 화면(Activity/Fragment)에 진입했다가 뒤로가기로 빠져나옵니다.
  2. 약 5초 후, 릭이 감지되면 상단 알림창에 "LeakCanary is dumping memory..." 알림이 뜹니다.
  3. 알림을 클릭하여 분석 리포트를 확인합니다.
  4. Leak Trace를 통해 어떤 객체가 메모리를 붙잡고 있어서 화면이 종료되지 못했는지 범인을 지목해 줍니다.

방법 B: Android Studio Profiler 사용 (정밀 분석)

LeakCanary로 원인이 불명확하거나, 구체적인 힙(Heap) 상태를 확인하고 싶을 때 사용합니다.

1. 프로파일러 실행 Android Studio 하단 탭 **Profiler**를 클릭하거나 메뉴에서 View > Tool Windows > Profiler를 선택합니다. + 버튼을 눌러 연결된 기기와 내 앱 프로세스를 선택하여 세션을 시작합니다.

2. 힙 덤프(Heap Dump) 뜨기

  1. MEMORY 영역의 타임라인을 클릭하여 상세 뷰로 진입합니다.
  2. **휴지통 아이콘(Force Garbage Collection)**을 누릅니다. (중요: GC를 수행했음에도 남아있는 객체가 진짜 릭이기 때문입니다.)
  3. Capture heap dump 버튼을 클릭하여 현재 메모리 상태를 스냅샷으로 저장합니다.

3. 릭 분석하기

  1. 덤프 결과 화면 좌측 탭에서 Leaks 필터가 있다면 켜거나, 직접 클래스명을 검색합니다.
  2. 이미 종료되었어야 하는데 남아있는 Activity나 Fragment 인스턴스를 클릭합니다.
  3. 우측 References (Instance View) 창에서 Depth를 확인합니다.
  4. 트리 구조를 역추적하여 어떤 객체(View, Static 변수, Thread 등)가 해당 Activity를 참조(Reference)하고 있는지 확인합니다. 그 참조가 메모리 릭의 원인입니다.

2. 앱 버벅임(Jank) 및 CPU 점유율 분석하기

앱 사용 중 프레임 드랍이 발생하거나 발열이 심할 때, 어떤 메소드가 CPU를 과도하게 점유하는지 확인하는 방법입니다.

1. CPU 프로파일링 시작 Profiler 세션에서 CPU 영역 타임라인을 클릭하여 상세 뷰로 들어갑니다.

2. 레코딩 옵션 선택 상황에 맞는 옵션을 선택해야 정확한 분석이 가능합니다.

  • Callstack Sample (Java/Kotlin Method Sample): 일반적인 앱 성능 저하 원인을 찾을 때 사용합니다. 오버헤드가 적어 기본적으로 권장됩니다.
  • System Trace: UI 렌더링 문제나 미세한 프레임 드랍을 분석할 때 사용합니다.

3. 기록 및 분석

  1. Record 버튼을 누릅니다.
  2. 앱에서 느리다고 생각되는 동작(예: 리스트 스크롤, 버튼 클릭 후 로딩)을 수행합니다.
  3. Stop 버튼을 눌러 기록을 종료합니다.

4. 결과 해석 (Flame Chart) 분석 결과 탭이 열리면 **Flame Chart(불꽃 차트)**를 확인하는 것이 가장 직관적입니다.

  • 가로 길이 = 실행 시간: 차트의 가로 길이가 길수록 해당 함수가 CPU를 오래 점유했다는 뜻입니다.
  • 분석 요령: 가장 넓게 자리를 차지하고 있는 블록(함수)을 찾으세요. 그 함수가 메인 스레드를 오래 붙잡고 있어 앱을 느리게 만드는 원인일 확률이 높습니다.
  • Wall Clock Time vs Thread Time:
    • Wall Clock Time: 대기 시간을 포함한 실제 흐른 시간입니다.
    • Thread Time: 실제 CPU가 연산에 사용한 시간입니다. 알고리즘 최적화가 필요하다면 이 지표를 보세요.

마무리

안드로이드 스튜디오의 프로파일러는 강력하지만, UI가 자주 변경되어 헷갈릴 수 있습니다. 가장 좋은 성능 최적화 루틴은 LeakCanary를 상시 켜두어 메모리 누수를 조기에 차단하고, 특정 구간의 성능 저하가 느껴질 때만 Profiler를 켜서 정밀 진단하는 것입니다.

이 글이 여러분의 앱 성능 최적화에 도움이 되길 바랍니다.

반응형