로우 메모리 킬러

Android 플랫폼은 사용 가능한 메모리가 있다는 것은 메모리 낭비라는 전제 하에 실행됩니다. Android는 항상 사용 가능한 모든 메모리를 사용하려고 합니다. 예를 들어 시스템은 앱이 닫힌 후에도 앱을 메모리에 보관하여 사용자가 앱으로 빠르게 다시 전환할 수 있게 합니다. 이러한 이유로 Android 기기는 사용 가능한 메모리가 거의 없는 상태로 실행되는 경우가 많습니다(여기에서 Android 메모리 할당 참고).

Android 로우 메모리 킬러 (LMK) 데몬 프로세스는 실행 중인 Android 시스템의 메모리 상태를 모니터링하고 시스템 성능을 허용 수준에서 유지하기 위해 최소한의 필수 프로세스를 종료하여 많은 양의 메모리 수요에 대처합니다.

종료할 프로세스를 결정하기 위해 LMK 데몬은 oom_adj_score라는 메모리 부족 점수를 사용하여 실행 중인 프로세스의 우선순위를 정합니다. 점수가 높은 프로세스가 먼저 종료됩니다. 백그라운드 앱이 먼저 종료되고 시스템 프로세스가 마지막에 종료됩니다. 다음 표에는 LMK 점수 카테고리가 높은 점수에서 낮은 점수로 나열되어 있습니다. 최고 점수 카테고리인 첫 번째 행의 항목이 먼저 종료됩니다.

Android 프로세스: 백그라운드 앱, 이전 앱, 홈 앱, 서비스, 감지 가능한 앱, 포그라운드 앱, 영구, 시스템, 네이티브 순으로 점수가 매겨집니다.
그림 1. 상단은 최고 점수, 하단은 최저 점수인 Android 프로세스

Android vitals의 LMK 측정항목

Android vitals를 사용하면 앱의 LMK 비율을 모니터링하고 개선할 수 있습니다. Android Vitals는 사용자 인식 LMK 발생률이라는 하나의 LMK 발생률만 측정합니다.

이 측정항목은 사용자 인식 LMK를 1번 이상 경험한 일일 활성 사용자의 비율을 반영합니다. 사용자 인식 LMK는 사용자가 인식했을 가능성이 높은 LMK입니다. 예를 들어 앱이 활동을 표시하거나 포그라운드 서비스로 실행되는 동안에 발생하는 LMK입니다.

Android vitals의 안정성 섹션에서 측정항목을 확인할 수 있습니다.

그림 2. Android vitals에서 사용자 인식 LMK 발생률에 액세스합니다.

ANR 및 비정상 종료와 같은 다른 핵심 vitals 측정항목과 마찬가지로 측정항목을 필터링하거나, 동료와 측정항목을 비교하거나, 장기간 (최대 3년) 측정항목의 변화를 모니터링할 수 있습니다. 기존 앱의 경우 2025년 1월 28일부터 데이터를 사용할 수 있습니다.

그림 3. Android Vitals의 LMK 발생률 개요

메모리 프로파일링 도구

다음 도구를 사용하면 다음과 같은 방법으로 메모리 문제를 찾고 진단할 수 있습니다.

  • 앱에서 시간 경과에 따라 메모리를 할당하는 방법을 확인합니다. 앱에서 사용 중인 메모리의 양, 할당된 Java 객체의 수, 가비지 컬렉션이 발생하는 시점을 실시간 그래프로 확인할 수 있습니다.
  • 가비지 컬렉션 이벤트를 시작하고 앱이 실행되는 동안 Java 힙 스냅샷을 찍습니다.
  • 앱의 메모리 할당을 기록하고, 할당된 모든 객체를 검사하고, 각 할당의 스택 트레이스를 확인합니다.

Android 스튜디오 메모리 프로파일러

Android 스튜디오는 Android 프로파일러의 구성요소로 메모리 프로파일러를 제공합니다. 이 프로파일러는 끊김 현상, 멈춤, 심지어 앱 비정상 종료로 이어질 수 있는 메모리 누수 및 메모리 변동을 식별하는 데 도움이 됩니다. 프로파일러는 앱의 메모리 사용 현황을 실시간 그래프로 보여주며 힙 덤프를 캡처하고 가비지 컬렉션을 강제 실행하고 메모리 할당을 추적할 수 있습니다.

그림 4. Android 스튜디오 메모리 프로파일러에서 글로벌 JNI 참조 보기

Unity 메모리 프로파일링 도구

Unity Engine을 사용하여 앱을 빌드하는 경우 Unity 메모리 프로파일링 가이드를 따르세요. Unity는 애플리케이션의 메모리 사용량을 분석하는 두 가지 도구를 제공합니다.

첫 번째는 애플리케이션에서 메모리를 사용하는 위치에 관한 기본 정보를 제공하는 내장 프로파일러인 메모리 프로파일러 모듈입니다.

메모리 모듈은 텍스처 메모리 및 메시 메모리와 같은 메모리 할당을 보여줍니다.
그림 5. 메모리 모듈이 선택된 Unity 프로파일러 창

두 번째 도구는 프로젝트에 추가할 수 있는 Unity 패키지인 메모리 프로파일러 패키지입니다. 이 패키지는 Unity 편집기에 메모리 프로파일러 창을 추가합니다. 메모리 프로파일러를 사용하면 애플리케이션의 메모리 사용량을 훨씬 더 자세히 분석할 수 있습니다. 스냅샷을 저장하고 비교하여 메모리 누수를 찾거나 메모리 레이아웃을 확인하여 메모리 분할 문제를 찾을 수 있습니다.

그림 6. 메모리 프로파일러 창을 사용하여 메모리 스냅샷 분석

Unreal 메모리 통계

Unreal Engine으로 빌드된 앱은 Unreal 메모리 통계를 사용하여 메모리 할당 및 할당 해제에 관한 세부정보(예: 메모리 블록과 연결된 하위 수준 메모리(LLM) 태그 및 콜 스택)를 확인할 수 있습니다.

메모리 통계 쿼리 시스템은 언제든지 실시간 할당을 찾고, 메모리 사용량의 변경사항을 식별하고, 메모리 누수를 찾고, 단기 할당과 장기 할당을 구분할 수 있습니다.

UE 5.4부터 메모리 통계는 Android 프로젝트의 호출 스택을 사용한 메모리 추적을 지원합니다.

메인 메모리 그래프, 실시간 할당 수, 할당/해제 이벤트 수를 보여주는 메모리 통계 추적기
그림 6. Unreal의 메모리 통계 추적기

추가 리소스