메모리 사용량 (익명 RSS + 스왑)

메모리 사용량 (익명 RSS + 스왑)은 앱의 메모리 사용량을 반영하는 Android vitals의 측정항목입니다.

익명 메모리는 힙 할당 및 mmap 할당 메모리와 같이 저장소의 파일로 지원되지 않는 메모리입니다. Resident Set Size (RSS)는 프로세스에서 사용하고 실제 RAM에 보관된 메모리 페이지 (공유 및 비공유)의 총수입니다. 익명 메모리의 경우 메모리에 압력이 가해지면 시스템에서 스왑 공간 (또는 Android의 경우 zRAM)에 페이지를 쓸 수 있습니다.

전체적으로 메모리 사용량 (익명 RSS + 스왑)은 저장소의 파일로 지원되지 않는 앱의 총 메모리 페이지 수를 측정하며, 시스템에서 스왑으로 보존하는 메모리도 포함됩니다. 익명 RSS와 스왑을 추적하면 앱의 실제 제거 불가능한 메모리 사용량을 확인할 수 있습니다.

메모리 사용량이 많은 항목 식별

Android vitals

Android vitals는 다음 프로세스 상태별로 분류된 앱의 메모리 사용량을 공유합니다.

  • 포그라운드: 앱의 프로세스가 표시됩니다. 여기서 높은 P99는 사용자 인식 성능 (버벅거림 또는 OOM 비정상 종료)에 영향을 미치는 경우가 많으며 더 이상 필요하지 않은 UI 구성요소나 활동을 유지하는 데 크게 영향을 받습니다.
  • 사용자 인식 서비스: 앱의 프로세스가 감지 가능 상태로 실행되고 있습니다. 여기에는 포그라운드 서비스, 신속 처리 작업, 사용자 시작 데이터 전송 작업이 포함됩니다. 시스템 바인딩 서비스 또는 다른 앱에 의해 바인딩된 서비스로도 확장될 수 있습니다. 이러한 서비스는 장기 실행 작업을 위해 설계되었으므로 누수로 인해 메모리를 유지하거나 리소스를 해제하지 못하면 시간이 지남에 따라 P99 테일이 증가할 수 있습니다.
  • 백그라운드: 앱이 백그라운드 서비스를 실행 중이거나 최근에 백그라운드로 전환되었지만 아직 캐시되지 않았습니다. 여기에서 백그라운드 처리 누수가 발생하고 출시되지 않은 리소스가 누적될 수 있습니다. 이 프로세스 상태는 포그라운드 또는 감지 가능한 프로세스보다 중요하지 않으므로 이 상태에서 많은 양의 메모리를 유지하지 않도록 하세요.
  • 캐시됨: 앱이 캐시된 상태입니다. 이 상태는 LMK와 같은 시스템 메모리 압력에 매우 민감합니다. OS는 이 프로세스 상태를 언제든지 삭제할 수 있으므로 이 상태는 디버그 목적으로만 제공됩니다.

이러한 프로세스 상태가 onTrimMemory 콜백과 어떤 관련이 있는지 알아보려면 이벤트에 응답하여 메모리 해제에 관한 안내를 참고하세요.

Android vitals는 RAM 버킷별로 앱의 메모리 사용량을 분류합니다. 메모리 사용량 측정항목은 50번째 및 90번째 백분위수의 최신 일일 값과 함께 일일 백분위수 값의 타임라인으로 표시됩니다.

꼬리 편향을 사용하여 메모리 누수 식별

메모리 누수를 식별하려면 Android vitals에서 일반적인 (P50) 사용자와 꼬리 끝 (P90) 사용자 간의 차이를 확인하세요. 일반적인 애셋 블로트는 모든 백분위수에서 메모리를 균일하게 부풀리지만 메모리 누수는 시간이 지남에 따라 누적되어 꼬리 끝 데이터를 크게 왜곡합니다.

프로세스 이름별로 P90 및 P99 측정항목을 P50 기준과 비교해야 합니다. P90~P50 비율이 3.5배를 초과하면 긴 세션 중에 메모리 누수가 발생할 가능성이 높습니다. 특정 사용 사례의 경우 비율이 높다고 항상 누수가 발생하는 것은 아니지만, 특정 워크플로를 평가하여 메모리 사용량이 높은 것이 예상되는 동작인지 확인해야 합니다.