📕 개요
공식 문서의 내용을 바탕으로 안드로이드 시스템에서 메모리 부족 상황에서 시스템이 어떻게 반응하고, 어떻게 메모리를 효율적으로 관리하는지에 대한 기본 개념을 알아보겠습니다.
안드로이드 플랫폼은 사용 가능한 메모리가 있다는 것은 자원을 낭비한다는 전제 하에 실행되기 때문에 항상 사용 가능한 모든 메모리를 사용하려 합니다. 우리가 앱을 닫은 후에도 다시 전환할 수 있는 것도 앱을 메모리에 보관하기 때문이죠!
이러한 이유로 안드로이드 기기는 사용 가능한 메모리가 거의 없는 상태로 실행되는 경우가 많습니다. 하지만 실제 우리가 스마트폰을 사용할 땐 이를 잘 느낄 수 없죠. 안드로이드는 어떤 방법을 사용해 이를 가능하게 하는걸까요 ?
📕 안드로이드 메모리 관리
ART(Android RunTime)과 Dalvik VM은 페이징과 메모리 매핑과 사용해 메모리를 관리합니다.
- 페이징 : 물리적인 메모리를 작은 고정 크기의 블록으로 나누어 관리하는 방법입니다. 각 블록을 페이지라고 하며, 일반적으로 4KB 크기로 설정됩니다.
- 메모리 매핑 : 파일이나 다른 프로세스의 메모리를 현재 프로세스의 주소 공간에 매핑하는 기술입니다.
📌 프로세스에 관한 글은 아래 글을 참조해 주세요 !
📌 ART와 Dalvik VM에 관한 글은 아래 글을 참조해 주세요!
앱에서 메모리를 해제하는 방법은 두 가지가 있습니다.
- 가비지 컬렉터에서 사용하지 않는 객체 참조 해제
- 메모리와 매핑된 모든 파일을 RAM에서 페이지 아웃
📕 안드로이드 메모리 유형
안드로이드 기기에는 세 가지 메모리 유형이 존재합니다.
- RAM : 가장 빠른 메모리지만 크기가 제한됩니다.
- zRAM : RAM의 파티션을 Swap Space에 사용됩니다.
- 저장소 : 파일 시스템, 앱 및 라이브러리 SDK 같은 영구 데이터가 저장됩니다.
📕 안드로이드 메모리 부족 관리
커널 스왑 데몬(kswapd)
- Linux 커널의 일부로 이미 사용된 메모리를 사용 가능한 메모리로 변환합니다.
- 사용 가능한 메모리가 임계값 아래로 떨어지면 메모리 회수 시작
- 사용 가능한 메모리가 임계값에 도달하면 메모리 회수 중지
로우 메모리 킬러(Low Memory Killer, LMK)
- 메모리를 확보하기 위해 프로세스를 종료시킵니다.
- kswapd로는 충분한 메모리 확보 할 수 없을 때 onTrimMemory()를 사용해 앱에 메모리 부족을 알린 이후 동작합니다.
- 메모리 부족 점수(oom_adj_score)에 따른 프로세스 우선순위에 따라 프로세스를 종료합니다
- Background apps : 이전에 실행되었고 현재 활성화 되지 않은 앱
- 이전 앱 : 가장 최근에 사용한 백그라운드 앱
- 홈 앱 : 홈(배경 화면)
- Service : 클루우드 동기화 또는 클라우드 업로드
- 인식할 수 있는 앱 : 사용자가 어떤 식으로든 인식할 수 있는 포그라운드에 없는 앱. Ex) 작은 UI로 표시되는 검색 창 또는 음악 듣기)
- 포그라운드 앱 : 현재 사용중인 앱
- Persistent : 와이파이, 전화, 블루투스 같은 기기의 핵심 서비스
- 시스템 : 안드로이드 시스템 프로세스
- 네이티브 : 시스템에서 사용하는 매우 낮은 수준의 프로세스 Ex) kswapd
OOM(Out of Memory)
- Linux 커널에서 메모리 부족시 더 많은 메모리를 요구하는 에러
- OOM Killer : 메모리가 부족하면 운영체제 내부의 우선순위 알고리즘에 의해 프로세스를 죽입니다.
📕 OOM vs LMK
OOM Killer는 주요 application을 죽일수도 있습니다. 주요한 어플리케이션이 죽지않는다는 보장을 할수 없다는 것은
안드로이드에 맞지 않음을 뜻합니다.
반면에 LMK은 process에게 adj값을 부여하여, memory가 minfree 이하로 떨어질 경우 높은 adj값을 가진 process를 kill하여 memory 확보합니다.
🚨결론 !
- 안드로이드는 OOM Killer 와 LMK를 모두 사용합니다 .
- 즉, LMK는 OOM killer 동작 전에 여유 메모리를 확보하는 안드로이드에서 추가된 모듈입니다
'Android' 카테고리의 다른 글
[Android] Room Database (0) | 2024.01.21 |
---|---|
[Android] Jetpack WorkManager (0) | 2024.01.07 |
Android Daum 우편번호 서비스 API With FireBase Hosting (2) | 2024.01.04 |
Android Base64 Decoding (0) | 2024.01.03 |
Anroid Jetpack [ ViewBinding ] (0) | 2024.01.02 |