Android 로우 메모리 킬러 (LMK) 데몬은 실행 중인 Android 시스템의 메모리 상태를 모니터링하고, 가장 필요성이 적은 프로세스를 종료하여 높은 메모리 압력에 반응합니다. Android vitals는 Google Play Console에서 사용자가 인지하는 LMK 종료를 추적하고 보고하여 사용자에게 영향을 미치는 메모리 부족 문제를 식별하는 데 도움을 줍니다.
Android vitals의 LMK 측정항목
Android vitals를 사용하면 앱의 LMK 발생률을 모니터링하고 개선할 수 있습니다. Android vitals는 사용자 인식 LMK 발생률이라는 하나의 LMK 발생률만 측정합니다.
이 측정항목은 사용자 인식 LMK를 1번 이상 경험한 일일 활성 사용자의 비율을 반영합니다. 사용자 인식 LMK는 사용자가 인식했을 가능성이 높은 LMK입니다. 예를 들어 앱이 활동을 표시하거나 포그라운드 서비스로 실행되는 동안에 발생하는 LMK가 여기에 포함됩니다. 이러한 종료는 즉각적이고 비정상적인 프로세스 종료를 초래합니다. 최종 사용자에게는 앱이 비정상 종료된 것처럼 보이며, 표준 수명 주기 상태 저장 메커니즘을 우회하여 사용자 진행 상황이 손실되는 경우가 많습니다.
Android vitals는 메모리 관리 오류 문제의 충실도 높은 프록시 역할을 하므로 이러한 프로세스 종료에 중점을 둡니다. LMK 비율이 1%를 초과하면 즉각적인 조치가 필요하다는 것을 나타냅니다. 하지만 LMK 발생률이 낮다고 해서 앱의 메모리 사용량이 정상이라는 의미는 아닙니다. 이 비율이 낮으면 LMK 데몬이 백그라운드에 있는 프로세스를 자주 종료하여 '웜 스타트' 성능과 멀티태스킹 유동성이 저하될 수 있습니다.
이 측정항목은 Android vitals의 안정성 섹션에서 확인할 수 있습니다.

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

로우 메모리 킬러 데몬 작동 방식
Android 플랫폼은 사용 가능한 메모리가 있다는 것은 메모리 낭비라는 전제 하에 실행됩니다. Android는 항상 사용 가능한 모든 메모리를 사용하려고 합니다. 예를 들어 시스템은 앱이 닫힌 후에도 앱을 메모리에 보관하여 사용자가 앱으로 빠르게 다시 전환할 수 있게 합니다. 이러한 이유로 Android 기기는 사용 가능한 메모리가 거의 없는 상태로 실행되는 경우가 많습니다(프로세스 간 메모리 할당 참고).
사용 가능한 메모리가 부족할 때 종료할 프로세스를 판단하기 위해 로우 메모리 킬러 (LMK) 데몬은 oom_adj_score라는 메모리 부족 점수를 사용하여 실행 중인 프로세스의 우선순위를 정합니다. 최고 점수를 얻은 프로세스가 먼저 종료됩니다. 백그라운드 앱이 먼저, 시스템 프로세스가 마지막에 종료됩니다. 다음 표에는 LMK 점수 카테고리가 높은 점수에서 낮은 점수순으로 나열되어 있습니다.
최고 점수 카테고리인 첫 번째 행의 항목이 먼저 종료됩니다.
메모리 프로파일링 도구
다음 도구를 사용하면 다음과 같은 방법으로 메모리 문제를 찾고 진단할 수 있습니다.
- 앱에서 시간 경과에 따라 메모리를 할당하는 방법을 확인합니다. 앱에서 사용 중인 메모리의 양, 할당된 Java 객체의 수, 가비지 컬렉션이 발생하는 시점을 실시간 그래프로 확인할 수 있습니다.
- 가비지 컬렉션 이벤트를 시작하고 앱이 실행되는 동안 Java 힙 스냅샷을 찍습니다.
- 앱의 메모리 할당을 기록하고 할당된 객체를 모두 검사하며 각 할당의 스택 트레이스를 확인합니다.
게임이 네이티브 엔진에서 실행되는 경우 HWAddress Sanitizer를 사용하여 네이티브 메모리 할당을 디버그합니다.
Android 스튜디오 메모리 프로파일러
Android 스튜디오는 끊김 현상, 멈춤, 심지어 앱 비정상 종료를 일으킬 수 있는 메모리 누수 및 메모리 급변을 식별하는 데 도움이 되는 Android 프로파일러의 구성요소로 메모리 프로파일러를 제공합니다. 프로파일러는 앱의 메모리 사용 현황을 실시간 그래프로 보여주며 힙 덤프를 캡처하고 가비지 컬렉션을 강제 실행하고 메모리 할당을 추적하는 기능을 제공합니다.
Unity 메모리 프로파일링 도구
Unity Engine을 사용하여 앱을 빌드하는 경우 Unity 메모리 프로파일링 가이드를 따르세요. Unity는 Unity에서 애플리케이션의 메모리 사용량을 분석하는 두 가지 도구를 제공합니다.
첫 번째는 메모리 프로파일러 모듈입니다. 이 모듈은 애플리케이션이 메모리를 사용하는 위치에 관한 기본 정보를 제공하는 내장 프로파일러입니다.
두 번째 도구는 메모리 프로파일러 패키지로, 프로젝트에 추가할 수 있는 Unity 패키지입니다. 이 패키지는 Unity 편집기에 메모리 프로파일러 창을 추가합니다. 메모리 프로파일러를 사용하면 애플리케이션의 메모리 사용량을 더 자세히 분석할 수 있습니다. 스냅샷을 저장하고 비교하여 메모리 누수를 찾거나 메모리 레이아웃을 확인하여 메모리 단편화 문제를 찾을 수 있습니다.
Android 관련 Unity 워크플로는 Unity 도구로 메모리 사용량 확인, Unity에서 메모리 사용량 최적화, Unity 게임의 LMK 디버그를 참고하세요.
Unreal Memory Insights
Unreal Engine으로 빌드된 앱은 Unreal Memory Insights를 사용하여 메모리 블록과 연결된 LLM (Low Level Memory) 태그 및 호출 스택을 비롯한 메모리 할당 및 할당 해제에 관한 세부정보를 확인할 수 있습니다.
메모리 통계 쿼리 시스템은 특정 시점의 실시간 할당을 찾고, 메모리 사용량의 변화를 식별하고, 메모리 누수를 찾고, 단기 할당과 장기 할당을 구분할 수 있습니다.
UE 5.4부터 Memory Insights는 Android 프로젝트의 호출 스택을 사용한 메모리 추적을 지원합니다.

Android 관련 Unreal 워크플로는 Unreal로 메모리 사용량 확인 및 Unreal에서 메모리 사용량 최적화를 참고하세요.
메모리 부족 통계
Android는 게임의 메모리 사용량을 줄이고 이전 게임 실행이 종료된 이유를 확인할 수 있는 콜백과 API를 제공합니다.
콜백
지원 중단된 trim 콜백을 등록하지 않습니다. Android는 시스템이 메모리를 회수하기 전에 네이티브 메모리 부족 이벤트를 감지하는 API를 제공하지 않으며, 세분화된 실행 메모리 자르기 콜백(TRIM_MEMORY_RUNNING_*)은 로우 메모리 킬을 방지하는 데 효과적이지 않습니다.
따라서 Android는 TRIM_MEMORY_UI_HIDDEN 및 TRIM_MEMORY_BACKGROUND를 제외한 모든 트림 수준을 지원 중단했습니다. 게임이 백그라운드로 이동할 때 UI 및 보조 리소스를 해제하려면 이러한 나머지 콜백(또는 Unity의 OnApplicationPause 및 Unreal의 ApplicationWillEnterBackgroundDelegate과 같은 엔진 수명 주기 상응 항목)을 사용합니다. 구현 세부정보는 게임의 메모리 줄이기를 참고하세요.
게임 종료
Android는 사용 가능한 모든 메모리를 사용하여 앱과 게임을 캐시함으로써 앱과 게임이 빠르게 로드되도록 합니다 (사용자 환경 개선). 하지만 메모리가 제한되면 시스템은 가장 메모리 집약적인 앱과 게임을 종료하여 정상적인 기기 작동을 위해 메모리를 확보합니다.
게임 메모리 사용량을 개선하는 데 도움이 되는 정보, 유용한 정보, 권장사항은 다음과 같습니다.
ApplicationExitInfo사용: 이 API는 이전 게임 실행이 Android 시스템에 의해 종료된 이유를 반환합니다.ApplicationExitInfo를 사용하여 이전 프로세스 종료 이유로 메모리 부족(REASON_LOW_MEMORY) 또는 메모리 제한 종료(REASON_MEMORY_LIMITER)를 확인합니다(게임용 ApplicationExitInfo 참고). 메모리 부족으로 인해 게임이 종료되었는지 확인하여 해당 기기에서 메모리를 적게 사용하도록 게임을 최적화할 수 있습니다.- 총 실제 RAM 확인: 게임이 포그라운드에 있을 때 종료되지 않도록 하고 기기의 기능과 일치하도록 기기당 총 실제 RAM을 확인하여 세부적으로 게임 메모리 사용량을 조정합니다. 플레이어가 멀티태스킹을 할 수 있도록 앱이 백그라운드로 이동한 직후에 종료되지 않도록 하는 것이 목표라면 trim 콜백(특히
TRIM_MEMORY_UI_HIDDEN)을 사용하여 게임 메모리 사용량을 줄이세요.