Android 메모리 이해 및 문제 해결

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

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

목표

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

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

가이드 구조

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

  1. 기본 개념: Android 메모리의 핵심 기술 원리입니다.
  2. 빠른 평가 도구: 빠른 트리아지를 위해 meminfo, showmap, 및 procstats를 사용합니다.
  3. **Java 메모리 분석**: Java 힙을 자세히 살펴봅니다. AHAT를 사용하여.
  4. 비트맵 및 메모리: 이미지가 RAM에 미치는 영향을 이해하고 도구를 사용하여 프로파일링합니다.
  5. 네이티브 메모리 분석: Perfetto 및 heapprofd를 사용하여 C/C++ 메모리를 프로파일링합니다.
  6. WebView 및 메모리: WebView의 다중 프로세스 아키텍처 및 메모리 사용량을 이해합니다.
  7. 앱 코드는 메모리: 클래스 로드 및 dex 블로트가 RAM에 미치는 영향을 이해합니다.
  8. 스레드 및 메모리: 네이티브 스레드 스택의 비용을 분석합니다.
  9. 메모리 지역성 및 성능: 데이터 액세스 패턴이 CPU 성능에 미치는 영향을 이해합니다.
  10. 서비스 결합 및 프로세스 상태: 교차 프로세스 종속성이 OOM 점수에 미치는 영향을 이해합니다.
  11. 시스템 전체 문제 해결: PSI, LMK, ZRAM 스왑, 페이지 캐시 삭제를 모니터링합니다.
  12. 메모리 회수: 삭제 및 스왑: memcg, 충전, 및 memory.reclaim을 사용하여 사전 회수를 이해합니다.
  13. kswapd 및 lmkd 상호작용: 압력 하에서 kswapd와 lmkd가 함께 작동하는 방식을 이해합니다.

기본 요건 및 환경

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

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

여기에서 시작: 기본 개념