메모리 사용량 (익명 RSS + 스왑)은 앱의 메모리 사용량을 반영하는 Android vitals의 측정항목입니다.
익명 메모리는 힙 할당 및 mmap 할당 메모리와 같이 저장소의 파일로 지원되지 않는 메모리입니다. 여기에는 Java 또는 Kotlin 힙, 관리되지 않는 네이티브 힙 할당 (Android 8.0 (API 수준 26) 이상에서 비트맵 픽셀 데이터가 있는 위치), 스레드 실행 스택을 비롯한 앱의 동적 메모리 할당이 캡처됩니다. OS는 압력 하에서 파일 지원 메모리를 삭제할 수 있지만 익명 메모리는 삭제할 수 없습니다.
상주 세트 크기 (RSS)는 실제 RAM에 보관된 프로세스에서 사용하는 총 메모리 페이지 수 (공유 및 비공유)입니다. 페이지는 둘 이상의 프로세스 (예: 동일한 라이브러리에 액세스하는 앱)에서 액세스하는 경우 '공유'되는 것으로 간주됩니다.
익명 메모리의 경우 메모리가 부족할 때 시스템에서 페이지를 스왑 공간 (또는 Android의 zRAM)에 쓸 수 있습니다. 필요한 경우 시스템에서 스왑에서 이러한 페이지를 다시 읽을 수 있습니다.
전반적으로 메모리 사용량 (익명 RSS + 스왑)은 저장소의 파일로 지원되지 않는 앱의 총 메모리 페이지 수를 측정한 것으로, 시스템에서 스왑으로 보존하는 메모리도 포함됩니다. 익명 RSS + 스왑을 추적하면 앱의 삭제할 수 없는 실제 메모리 사용량을 확인할 수 있습니다.
앱의 메모리 사용량이 높으면 이 페이지의 안내에 따라 문제를 추가로 조사하고 해결하세요.
메모리 사용량이 많은 항목 식별
Android vitals
Android vitals는 다음과 같은 프로세스 상태로 분류된 앱의 메모리 사용량을 공유합니다.
- 포그라운드: 앱의 프로세스가 표시됩니다. 여기서 높은 P99는 사용자 인식 성능 (버벅거림 또는 OOM 비정상 종료)에 영향을 미치는 경우가 많으며 삭제되지 않은 UI 구성요소 또는 Activity에 의해 크게 영향을 받습니다.
- 포그라운드 서비스: 앱에서 포그라운드 서비스를 실행 중입니다. 이러한 서비스는 장기 실행 작업을 위해 설계되었으므로 시간이 지남에 따라 P99 테일을 적극적으로 확장하는 누적 수명 주기 누수의 주요 후보입니다.
- 백그라운드: 앱에서 백그라운드 서비스를 실행 중이거나 최근에 백그라운드로 전환되었지만 아직 캐시되지 않았습니다. 여기서 백그라운드 처리 누수가 복합적으로 발생합니다.
- 캐시됨: 앱이 캐시된 상태입니다. 이 상태는 LMK와 같은 시스템 메모리 부족에 매우 민감합니다. OS는 이 프로세스 상태를 언제든지 삭제할 수 있으므로 이 상태는 디버그 목적으로만 제공됩니다.
이러한 프로세스 상태가 onTrimMemory 콜백과 어떤 관련이 있는지 알아보려면 이벤트에 응답하여 메모리 해제에 관한 안내를 참고하세요.
Android vitals는 앱의 메모리 사용량을 RAM 버킷별로 분류하기도 합니다. 메모리 사용량 측정항목은 50번째 및 90번째 백분위수의 가장 최근 일일 값과 함께 일일 백분위수 값의 타임라인으로 표시됩니다.
메모리 기준선을 식별한 후 안내에 따라 과도한 메모리 사용량을 진단하고 개선하세요.
테일 스큐를 사용하여 메모리 누수 식별
메모리 누수를 식별하려면 Android vitals에서 일반적인 사용자 (P50)와 테일 엔드 사용자 (P90) 간의 차이를 찾으세요. 일반적인 애셋 블로트는 모든 백분위수에서 메모리를 균일하게 확장하지만 메모리 누수는 시간이 지남에 따라 복합적으로 발생하여 테일 엔드 데이터를 크게 왜곡합니다.
프로세스 이름별로 P90 및 P99 측정항목을 P50 기준선과 비교해야 합니다. P90에서 P50 비율이 3.5배를 초과하면 확장된 세션 중에 메모리 누수가 발생할 가능성이 높습니다. 특정 사용 사례의 경우 비율이 높다고 해서 항상 누수가 발생하는 것은 아니지만 특정 워크플로를 평가하여 메모리 사용량이 높은 것이 예상되는 동작인지 확인해야 합니다.
리소스
과도한 메모리 사용량을 로컬에서 진단
과도한 메모리 사용량의 소스를 진단하려면 개발자 설정, Android Studio 또는 Perfetto에서 힙 덤프 기록을 사용하여 힙 덤프를 캡처하면 됩니다. 앱의 핵심 사용자 여정을 테스트한 후 로컬에서 힙 덤프를 캡처하는 것이 좋습니다.
특히 다음 사용자 여정을 테스트하는 것이 좋습니다.
- 웹 뷰 및 인앱 브라우저 세션
- 미디어가 많은 무한 스크롤
- 확장 소재 만들기 및 수정 흐름
잠재적인 메모리 누수를 조사하려면 먼저 Android vitals 메모리 사용량 대시보드의 프로세스 이름 표를 사용하여 가장 많은 리소스를 소비하는 프로세스를 식별합니다. 그런 다음 해당하는 사용자 여정을 로컬에서 실행하고 다양한 프로세스 상태 (표시됨, 포그라운드 서비스, 캐시됨)에서 힙 덤프를 수집하여 앱이 백그라운드로 전환된 후 메모리를 해제하는지 확인합니다.
Android 스튜디오 프로파일러를 사용하여 메모리 문제를 디버깅하는 경우 LeakCanary 통합을 사용하여 누수 감지를 간소화하고 중복 비트맵 감지를 사용하여 이미지 사용량을 최적화할 수도 있습니다.
힙 덤프를 수집한 후에는 Perfetto AI 스킬을 사용하여 힙 덤프를 분석하고 메모리 사용량이 많은 잠재적 소스 를 식별하는 것이 좋습니다.
다음은 AI 스킬이 응답할 수 있는 내용의 예입니다.
I have completed the analysis of memory leaks and bitmap issues for [app] using the provided Perfetto trace.
Summary of Findings
The investigation identified a critical memory pressure issue caused by massive bitmap retention within the app process.
...
Recommendations for [app]
1. [Library] Image Cache Optimization:
* Review the [Library] caching strategy. Ensure that bitmaps
loaded for animations are released or downsampled when the animation is
not in the foreground.
2. Asset Resolution Audit:
* The 14.7 MB average size suggests full-screen or extremely high-density assets. Audit the [library] files in the native_home component to ensure they are not using unnecessarily large source images.
3. View Lifecycle Management:
* Investigate why 21 [LibraryImage] instances are alive simultaneously. Ensure that views in the bottom
tab are properly detached or their animations are cleared when switching between tabs.
4. Fix Surface Leaks:
* Address the Surface.release failures observed in the logs, as these can lead to both memory leaks and
native resource exhaustion.
힙 덤프 해석을 위한 추가 리소스
다음 리소스는 힙 덤프 해석 및 메모리 사용량 디버깅에 관한 자세한 정보를 제공합니다.
- 수동 분석: Perfetto 힙 덤프 탐색기 안내를 사용하여 Perfetto UI에서 힙 덤프 시각화를 탐색하고 해석하는 방법을 알아보세요.
- Java/Kotlin 할당: Android 런타임 (ART) 힙 덤프 분석에 관한 단계별 안내는 첫 번째 ART 힙 덤프 시각화를 참고하세요.
- 네이티브 할당: Perfetto 네이티브 프로파일링 문서를 참고하여 네이티브 (C/C++) 메모리 프로필을 수집하고 분석하는 방법을 알아보세요.
- CLI 검사: adb dumpsys meminfo를 사용하여 기기에서 앱의 메모리 사용량을 빠르게 분류합니다.
- AI 지원 분석: Perfetto AI 스킬을 활용하여 LLM 기반 분석을 실행하여 트레이스에서 메모리 누수 및 과도한 할당을 감지할 수 있습니다.
- SQL 기반 분석: Perfetto SQL 및 트레이스 분석 스킬을 사용하여 구조화된 쿼리 및 전문 스크립트를 실행하여 복잡한 트레이스 데이터를 분석합니다.
메모리 사용량 개선
앱의 메모리 사용량을 개선하는 방법을 자세히 알아보려면 다음 섹션을 참고하세요.
메모리 문제를 해결하는 방법에 관한 자세한 안내는 앱의 메모리 관리 가이드를 참고하세요.