Android 메모리 이해 및 문제 해결

메모리는 Android 지원 기기에서 중요하고 유한한 리소스입니다. Android 플랫폼 개발자 또는 OEM은 Java 런타임부터 Linux 커널에 이르기까지 모든 수준에서 메모리가 작동하는 방식을 이해해야 성능이 우수하고 안정적인 시스템을 빌드할 수 있습니다.

이 가이드에서는 Android 메모리 아키텍처, 분석에 사용할 수 있는 도구, 메모리 관련 문제를 식별하고 해결하는 데 도움이 되는 실습에 관한 포괄적인 개요를 제공합니다.

목표

이 가이드를 완료하면 다음을 수행할 수 있습니다.

  • Zygote 프로세스 모델 및 메모리 매핑 파일을 포함한 Android 메모리의 기본 개념을 설명합니다.
  • RSS (Resident Set Size), PSS (Proportional Set Size), USS (Unique Set Size)를 구분합니다.
  • dumpsys meminfo 및 showmap와 같은 표준 명령줄 도구를 사용하여 메모리 사용량을 빠르게 평가합니다.
  • AHAT를 사용하여 Java 힙 덤프를 캡처하고 분석하여 누수 및 과도한 할당을 찾습니다.
  • Perfetto 및 heapprofd를 사용하여 전체 시스템에서 Java 및 네이티브 메모리를 모두 프로파일링합니다.
  • PSI (Pressure Stall Information)와 같은 시스템 전반의 메모리 압박 지표를 이해하고 LMK (Low Memory Killer) 활동을 모니터링합니다.
  • ZRAM 스왑 및 페이지 캐시 제거를 포함한 커널 수준 회수 활동을 관찰합니다.

가이드 구조

이 가이드는 순차적으로 읽을 수 있도록 다음과 같은 섹션으로 구성되어 있습니다.

  1. 기본 개념: Android 메모리의 핵심 기술 원리입니다.
  2. 빠른 평가 도구: meminfo, showmap, procstats를 사용하여 신속하게 분류합니다.
  3. Java 메모리 분석: AHAT를 사용하여 Java 힙을 심층 분석합니다.
  4. 비트맵 및 메모리: 이미지가 RAM에 미치는 영향을 이해하고 도구를 사용하여 프로파일링합니다.
  5. 네이티브 메모리 분석: Perfetto 및 heapprofd를 사용하여 C/C++ 메모리를 프로파일링합니다.
  6. WebView 및 메모리: WebView의 멀티 프로세스 아키텍처 및 메모리 사용량 이해
  7. 앱 코드는 메모리: 클래스 로드 및 dex 비대화가 RAM에 미치는 영향 이해
  8. 스레드 및 메모리: 네이티브 스레드 스택의 비용을 분석합니다.
  9. 메모리 지역성 및 성능: 데이터 액세스 패턴이 CPU 성능에 미치는 영향 이해
  10. 서비스 결합 및 프로세스 상태: 프로세스 간 종속 항목이 OOM 점수에 미치는 영향을 이해합니다.
  11. 시스템 전체 문제 해결: PSI, LMK, ZRAM 스왑, 페이지 캐시 제거를 모니터링합니다.
  12. 메모리 회수: 제거 및 스왑: memory.reclaim를 사용한 memcg, 충전, 사전 회수 이해
  13. kswapd 및 lmkd 상호작용: 압박 상황에서 kswapd와 lmkd가 함께 작동하는 방식을 이해합니다.
  14. 메모리 페이지를 OS에 반환: madvise 및 posix_fadvise를 사용하여 사용되지 않는 힙 페이지와 파일 캐시 페이지를 커널에 반환합니다.
  15. 간소화된 프로세스로 백그라운드 작업 유지: 백그라운드 서비스와 작업자를 전용 프로세스로 이동하여 UI 및 그래픽 메모리가 높은 우선순위로 유지되지 않도록 합니다.

기본 요건 및 환경

이 가이드에서는 Android 메모리 문제를 진단하고 해결하는 방법을 보여주는 참조 워크플로, 벤치마크 데이터, 우수사례를 제공합니다.

  • 분석 도구: 이 가이드의 기법은 주로 Perfetto, dumpsys meminfo, showmap, AHAT를 비롯한 표준 Android 성능 도구를 사용합니다.
  • 루트 권한: 일부 시스템 수준 진단 워크플로 (예: 커널 메모리 부족 또는 하드웨어 PMU 카운터 검사)에는 userdebug 기기 또는 에뮬레이터 빌드에 대한 승격된 루트 권한 (adb root)이 필요합니다.

시작점: 기본 개념