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

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

Unity 메모리 프로파일링 도구
Unity 엔진을 사용하여 앱을 빌드하는 경우 Unity 메모리 프로파일링 안내를 따르세요. Unity는 Unity에서 애플리케이션의 메모리 사용량을 분석하는 두 가지 도구를 제공합니다.
첫 번째는 메모리 프로파일러 모듈입니다. 이는 애플리케이션이 메모리를 사용하는 위치에 관한 기본 정보를 제공하는 내장 프로파일러입니다.
두 번째 도구는 프로젝트에 추가할 수 있는 Unity 패키지인 메모리 프로파일러 패키지입니다. 이 패키지는 Unity 편집기에 추가 메모리 프로파일러 창을 추가합니다. 메모리 프로파일러를 사용하면 애플리케이션의 메모리 사용량을 훨씬 더 자세히 분석할 수 있습니다. 스냅샷을 저장하고 비교하여 메모리 누수를 찾거나 메모리 레이아웃을 확인하여 메모리 조각화 문제를 찾을 수 있습니다.
Unreal Memory Insights
Unreal Engine으로 빌드된 앱은 Unreal Memory Insights를 사용하여 메모리 블록과 연결된 하위 수준 메모리 (LLM) 태그와 호출 스택을 비롯한 메모리 할당 및 할당 해제에 관한 세부정보를 확인할 수 있습니다.
메모리 통계 쿼리 시스템은 언제든지 라이브 할당을 찾고, 메모리 사용량의 변경사항을 식별하고, 메모리 누수를 찾아내고, 단기 할당과 장기 할당을 구분할 수 있습니다.
UE 5.4부터 Memory Insights는 Android 프로젝트의 호출 스택을 사용한 메모리 추적을 지원합니다.
메모리 부족 통계
Android는 게임의 메모리 요구사항을 줄이고 이전 게임 실행이 종료된 이유를 확인할 수 있는 콜백과 API를 제공합니다.
콜백
지원 중단된 trim 콜백을 등록하지 마세요. 시스템이 메모리 제한에 도달할 때 네이티브 메모리 압력 이벤트를 감지하는 API가 Android에는 없습니다.
트림 콜백은 메모리 부족으로 인한 종료를 방지하는 데 도움이 되지 않았으므로 Android에서는 TRIM_MEMORY_UI_HIDDEN 및 TRIM_MEMORY_BACKGROUND를 제외한 모든 콜백을 지원 중단했습니다.
게임 종료
Android는 사용 가능한 모든 메모리를 사용하여 앱과 게임을 캐시하여 빠르게 로드되도록 하지만 (사용자 환경 개선) 메모리가 제한되면 시스템은 메모리 집약적인 앱과 게임을 종료하여 정상적인 기기 작동을 위한 메모리를 확보합니다.
더 나은 게임 메모리 사용을 달성하는 데 도움이 되는 정보, 통계, 권장사항은 다음과 같습니다.
ApplicationExitInfo사용: 이 API는 이전 게임 실행이 Android 시스템에 의해 종료된 이유를 반환합니다.ApplicationExitInfo를 사용하여 이전 프로세스 실행이 종료된 이유가 메모리 부족인지 확인합니다. 메모리 부족으로 인해 게임이 종료되었는지 확인하여 해당 기기에서 메모리를 적게 사용하도록 게임을 최적화할 수 있습니다.- 총 실제 RAM 확인: 게임이 포그라운드에 있을 때 종료되지 않도록 하고 기기 기능과 일치시키려면 기기별 총 실제 RAM을 확인하여 이를 기반으로 게임 메모리 사용량을 세부적으로 조정하세요. 백그라운드로 이동한 직후 앱이 종료되지 않도록 하는 것이 목표라면 (플레이어가 멀티태스킹할 수 있도록) 트리밍 콜백(특히
TRIM_MEMORY_UI_HIDDEN)을 사용하여 게임 메모리 사용량을 줄이세요.