안드로이드 메모리
안드로이드 메모리 개념을 공부하고 우선 순위와 서비스의 관계를 이해한다.
안드로이드 OS 메모리
앱 메모리
사용자가 앱을 전환하게 된다면 포그라운드 상태에서 백그라운드 상태로 변경되게 된다. 사용자가에 표시가 되지 않거나 음악 재생과 같은 포그라운드 서비스를 실행하지 않는 앱을 캐시에 보관하게 된다. 때문에 시스템에서 프로세스를 재사용할 수 있어 사용자가 빠르게 앱 전환이 가능하다. 이러한 이유로 사용되지 않는 앱이라도 앱에 캐싱된 프로세스, 리소스가 할당이 되기 때문에 시스템 성능에 영향을 미친다. 시스템은 리소스가 부족해 지면 캐시에 있는 프로세스를 종류하게 된다.
프로세스 간 메모리 할당
안드로이드는 포그라운드에서 내려간 앱도 메모리에 보관하여 빠른 전환이 가능하게 만든다. 때문에 사용한 가능한 메모리가 있다는 것이 메모리 낭비라는 전제 하에 실행되게 된다. 항상 모든 메모리를 사용할려고 하기 때문에 메모리 부족 상황에 어떻게 반응하는지 알아야한다.
메모리 부족 관리
메모리 부족 상황을 처리하기 위해선 두가지 기본 메커니즘이 있다.
커널은 안드로이드의 최하위 계층으로 시스템의 중심역활을 한다. 시스템에 관련된 일을 담당한다.
1. 커널 스왑 데몬(kswapd)
컴퓨터 구조 스터디 후 다시 확인해야 이해도가 올라 갈거 같음.
2. 로우 메모리 킬러(low-memory killer, LMK)
kswapd만으로 충분한 메모리를 확보할 수 없는 경우에 시스템이 onTrimMemory()를 호출하게 된다.
📍onTrimMemory() : Developers
운영 체제가 프로세스에서 불필요한 메모리를 정리하기에 적절한 시기라고 판단할 때 호출됩니다. 예를 들어 백그라운드로 이동하여 원하는 만큼의 백그라운드 프로세스를 계속 실행하기에 메모리가 충분하지 않을 때 발생합니다. 새로운 중간 값이 추가될 수 있으므로 레벨의 정확한 값과 비교해서는 안 되며, 일반적으로 해당 값이 관심 있는 레벨보다 크거나 같은지 비교하는 것이 좋습니다.
프로세스의 현재 트림 레벨을 검색 방법 : ActivityManager.getMyMemoryState(RunningAppProcessInfo)
안드로이드 애플리케이션은 생명주기 시기에 맞지 않게 언제든 죽을 수 있다는 위험이 있다. 이를 사전에 방지하기 위해 시스템은 앱에게 메모리를 정리하라는 경고를 콜백해준다.
onTrimMemory()를 이용해 메모리가 부족하고 할당량을 줄여야한다고 앱에 알리게 되지만 충분한 메모리가 확보되지 않을 경우 커널이 메모리를 확보하기 위해 프로세스를 로우 메모리 킬러를 사용해 종료하기 시작한다.
종료할 프로세스의 우선수위를 LMK는 oom_adj_score (메모리 부족) 점수를 사용하여 정한다. 최고 점수를 얻은 프로세스가 먼저 종료되게 된다.
Android Low Memory Killer Daemon
Android Low Memory Killer Daemon Introduction Android Low Memory Killer Daemon (lmkd) is a process monitoring memory state of a running Android system and reacting to high memory pressure by killing the least essential process(es) to keep system performing
android.googlesource.com
2-1. 우선 순위
메모리 부족 점수가 높을 수록 낮은 우선 순위를 가지게 된다. 최고점은 현재 포그라운드에서 실행중이 아닌 백그라운드 앱이며 최하점은 안드로이드 프로세스이다.
- Background App: 이전에 실행되었고 현재는 활성화되지 않은 앱이다.
- Previous App: 가장 최근에 사용된 백그라운드 앱
- Home App: 런처 앱 (바탕화면)
- Services: 서비스가 동작중인 앱
- Perceptible App: 위젯으로 동작중인게 인식되는 앱
- Foreground App: 현재 사용 중인 앱
- Persistent: 메세지, 전화와 같은 기기 핵심 서비스
- System: 안드로이드 OS
2-2. Service
안드로이드에서 앱이 백그라운드 상태가 되었을때 LMK에 의해 강제 종료 되는걸 막아야하는 경우가 있다. 이런 상황에서 사용하는게 Service Component 중에 Foreground Service이다. Perceptible App 등급을 주는 것으로 가시적으로 사용자에게 사용하고 있다는 것을 알려주며(notification) 백그라운드에서 작업을 수행하게 된다. Background Service를 사용하게 된다면 Android 6.0 (Api leval 23, 마시멜로)에 도입된 Doze 모드로 인해 리소스 정리를 당할 수 있다.
Service Component
안드로이드 4대 컴포넌트 중 하나인 서비스에 대해 학습하고, Background / Froground Service 차이점을 이해한다. 서비스 (Service) 1. 서비스란?서비스는 안드로이드 컴포넌트 중 하나로 앱의 진입점이다
hyen-97.tistory.com