Android 플랫폼은 사용 가능한 메모리가 있다는 것은 메모리 낭비라는 전제 하에 실행됩니다. Android는 항상 사용 가능한 모든 메모리를 사용하려고 합니다. 예를 들어 시스템은 앱이 닫힌 후에도 앱을 메모리에 보관하여 사용자가 앱으로 빠르게 다시 전환할 수 있게 합니다. 이러한 이유로 Android 기기는 사용 가능한 메모리가 거의 없는 상태로 실행되는 경우가 많습니다(여기에서 Android 메모리 할당 참고).
Android 로우 메모리 킬러 (LMK) 데몬 프로세스는 실행 중인 Android 시스템의 메모리 상태를 모니터링하고 시스템 성능을 허용 수준에서 유지하기 위해 최소한의 필수 프로세스를 종료하여 많은 양의 메모리 수요에 대처합니다.
종료할 프로세스를 결정하기 위해 LMK 데몬은 oom_adj_score라는 메모리 부족 점수를 사용하여 실행 중인 프로세스의 우선순위를 정합니다. 점수가 높은 프로세스가 먼저 종료됩니다. 백그라운드 앱이 먼저 종료되고 시스템 프로세스가 마지막에 종료됩니다. 다음 표에는 LMK 점수 카테고리가 높은 점수에서 낮은 점수로 나열되어 있습니다. 최고 점수 카테고리인 첫 번째 행의 항목이 먼저 종료됩니다.

Android vitals의 LMK 측정항목
Android vitals를 사용하면 앱의 LMK 비율을 모니터링하고 개선할 수 있습니다. Android Vitals는 사용자 인식 LMK 발생률이라는 하나의 LMK 발생률만 측정합니다.
이 측정항목은 사용자 인식 LMK를 1번 이상 경험한 일일 활성 사용자의 비율을 반영합니다. 사용자 인식 LMK는 사용자가 인식했을 가능성이 높은 LMK입니다. 예를 들어 앱이 활동을 표시하거나 포그라운드 서비스로 실행되는 동안에 발생하는 LMK입니다.
Android vitals의 안정성 섹션에서 측정항목을 확인할 수 있습니다.

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

메모리 프로파일링 도구
다음 도구를 사용하면 다음과 같은 방법으로 메모리 문제를 찾고 진단할 수 있습니다.
- 앱에서 시간 경과에 따라 메모리를 할당하는 방법을 확인합니다. 앱에서 사용 중인 메모리의 양, 할당된 Java 객체의 수, 가비지 컬렉션이 발생하는 시점을 실시간 그래프로 확인할 수 있습니다.
- 가비지 컬렉션 이벤트를 시작하고 앱이 실행되는 동안 Java 힙 스냅샷을 찍습니다.
- 앱의 메모리 할당을 기록하고, 할당된 모든 객체를 검사하고, 각 할당의 스택 트레이스를 확인합니다.
Android 스튜디오 메모리 프로파일러
Android 스튜디오는 Android 프로파일러의 구성요소로 메모리 프로파일러를 제공합니다. 이 프로파일러는 끊김 현상, 멈춤, 심지어 앱 비정상 종료로 이어질 수 있는 메모리 누수 및 메모리 변동을 식별하는 데 도움이 됩니다. 프로파일러는 앱의 메모리 사용 현황을 실시간 그래프로 보여주며 힙 덤프를 캡처하고 가비지 컬렉션을 강제 실행하고 메모리 할당을 추적할 수 있습니다.

Unity 메모리 프로파일링 도구
Unity Engine을 사용하여 앱을 빌드하는 경우 Unity 메모리 프로파일링 가이드를 따르세요. Unity는 애플리케이션의 메모리 사용량을 분석하는 두 가지 도구를 제공합니다.
첫 번째는 애플리케이션에서 메모리를 사용하는 위치에 관한 기본 정보를 제공하는 내장 프로파일러인 메모리 프로파일러 모듈입니다.

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

Unreal 메모리 통계
Unreal Engine으로 빌드된 앱은 Unreal 메모리 통계를 사용하여 메모리 할당 및 할당 해제에 관한 세부정보(예: 메모리 블록과 연결된 하위 수준 메모리(LLM) 태그 및 콜 스택)를 확인할 수 있습니다.
메모리 통계 쿼리 시스템은 언제든지 실시간 할당을 찾고, 메모리 사용량의 변경사항을 식별하고, 메모리 누수를 찾고, 단기 할당과 장기 할당을 구분할 수 있습니다.
UE 5.4부터 메모리 통계는 Android 프로젝트의 호출 스택을 사용한 메모리 추적을 지원합니다.

메모리 부족 통계
Android는 게임의 메모리 요구사항을 줄이고 이전 게임 실행이 종료된 이유를 확인할 수 있는 콜백과 API를 제공합니다.
콜백
지원 중단된 trim 콜백을 등록하지 마세요. Android에는 시스템의 메모리 한도가 발생할 때 네이티브 메모리 압력 이벤트를 감지하는 API가 없습니다.
메모리 부족 종료를 방지하는 데는 자르기 콜백이 도움이 되지 않았으므로 Android에서는 TRIM_MEMORY_UI_HIDDEN
및 TRIM_MEMORY_BACKGROUND
를 제외한 모든 콜백을 지원 중단했습니다.
경기 종료
Android는 사용 가능한 모든 메모리를 사용하여 앱과 게임을 캐시하여 빠르게 로드되도록 하려고 합니다 (사용자 환경 개선). 하지만 메모리가 제한되면 시스템은 메모리 사용량이 가장 많은 앱과 게임을 종료하여 정상적인 기기 작동을 위한 메모리를 확보합니다.
게임 메모리 사용량을 개선하는 데 도움이 되는 정보, 통계, 권장사항은 다음과 같습니다.
ApplicationExitInfo
사용: 이 API는 이전 게임 실행이 Android 시스템에 의해 종료된 이유를 반환합니다.ApplicationExitInfo
를 사용하여 이전 프로세스 실행 종료의 원인으로 메모리 부족을 확인합니다. 메모리가 부족하여 게임이 종료되었는지 확인하여 해당 기기에서 메모리를 더 적게 사용하도록 게임을 최적화할 수 있습니다.- 총 실제 RAM 확인: 포그라운드에 있을 때 게임이 종료되지 않도록 하고 기기의 기능에 맞추려면 기기당 총 실제 RAM을 자세히 살펴보고 이를 기반으로 게임 메모리 사용량을 조정합니다. 플레이어가 멀티태스킹을 할 수 있도록 백그라운드로 전환된 직후 앱이 종료되지 않도록 하려면 trim 콜백(특히
TRIM_MEMORY_UI_HIDDEN
)을 사용하여 게임 메모리 사용량을 줄이세요.