안드로이드의 메모리 정책 및 가용램 by regen ***

 

안드로이드 폰을 사용하시는 분들 보시면 보통 advanced task killer와 같은 task killer류 어플을 많이들 사용합니다. 개인적으로는 이런 task killer류 어플의 사용을 선호하지 않는데요,
이는 리눅스 기반인 안드로이드에서도 자체적으로 oom_killer라는 task killer가 내장되어 있기 때문이죠. oom은 Out of Memory로 간단하게 이야기하자면 메모리가 부족했을 때를 생각하시면 이해하시기 편하실 겁니다.
이해하시기 편하시게 일단 마켓에서 마켓에서 AutoKiller Memory Optimizer를 까시구요.(무료입니다) 그냥 Autokiller로 검색하면 나올겁니다.

일단 메인화면에서 switch to MB 버튼을 눌르셔서 값을 보기쉽게 Mb 단위로 바꾸도록 하지요. 일단 차례대로 설명을 하자면, 디파이의 경우 디폴트 셋팅값이 위에서부터
foreground app : 12
visible app : 18
secondary server : 36
hidden app : 42
content provider : 48
empty app : 48
로 설정되어있을 겁니다. 안드로이드에서 실행되는 프로세스 life cycle은 상태에 따라 위에 표시된 foreground app ~ empty app과 같은 상태와 oom_adj값을 가지게 됩니다. oom_adj 값은 프로세스마다 -16 ~15 사이의 값이 부여되며 메모리가 부족하게 될 경우 숫자가 높을 프로세스부터 차례로 kill당하게 됩니다.
일단
foreground app 은 현재 실행되여 유저가 control 할 수 있도록 실질적으로 display되고 있는 있는 프로세스를 의미합니다. 즉 현재 실행도 되어있고, 화면에도 표시되고 있는 어플을 의미합니다.
visible app은 단독으로 수행되지는 않지만 항상 화면에 보일 가능성이 있는 프로세스들. 예를 들면 문자입력기 같은 경우가 이에 해당되겠지요.
secondary server 는 현재 수행되고 있는 위젯이나 service와 같은 프로그램이 이에 해당됩니다.
hidden app 은 background app. 즉 프로세스를 끄진 않았지만 현재 화면에 보이지 않는 상태의 프로세스가 여기에 해당됩니다. 예를 들어 어떤 어플을 실행시킨뒤 종료시키지 않은 채 홈키를 눌러 홈화면으로 오게 된다면 해당 어플의 상태는 foreground app에서 hidden app으로 변하게 되는 겁니다. 여기까지가 안드로이드의 실질적인 멀티태스킹에 관여되는 부분이라고 생각하시면 됩니다.
content provider는 아마도 현재 사용되지 않는 CP를 의미하는 것 같은데 잘은 모르겠습니다.
empty app은 cache로 존재하는 app으로 안드로이드의 퍼포먼스에는 영향을 미치지 않지만 어플이 다시 시작될 때 빠르게 캐쉬역할로 빠르게 재시작 할 수 있도록 하는 등의 역할을 하게 됩니다. 그런 까닭에 이런 안드로이드는 설정된 메모리 정책이 허용하는 안에서 이런 empty app을 메모리에 올리게 되고, 따라서 유저가 실행한 적도 없는 어플이 메모리에 존재하게 되는 겁니다. 그런 어플은 전부 이 empty app에 해당된다고 생각하시면 됩니다.
이 empty app은 장점도 있고 단점도 있으니 존재의의에 대해서는 넘어가기로 하고…
각 상태마다 옆에 붙은 숫자의 의미를 알아보기로 하죠.
예를 들어 디파이의 경우 foreground app이 12Mb로 설정되어있는 데 이 경우 가용램이 12Mb이하로 떨어지게 되면 foreground app이상의 모든 프로세스를 oom_killer가 kill하게 됩니다.
다른 경우도 마찬가지입니다. 예를 들어 가용램이 48Mb로 떨어지게 되면 적절한 가용램이 확보될때까지 hidden app이상의 모든 프로세스, 즉 hidden app ~ empty app에 해당되는 프로세스를 empty app 부터 역으로 kill하게 됩니다. 예를 들어 만일 이 값이 200Mb로 셋팅되어있다면 가용램이 200Mb 이하로 떨어지게 되면 백그라운드의 어플이 전부 kill당하게 되겠지요.
이 정도면 대충 안드로이드가 어떤 식으로 메모리를 메모리를 관리하고 필요한 가용램을 확보하는지 아시리라 생각합니다. autokiller 어플은 이러한 안드로이드의 메모리정책을 수정할 수 있는 어플이구요. 값을 수정하기 위해서는 일단 루팅이 선행되어야 하며 foreground app ~ secondary server 사이의 값을 변경하기 위해서는 settings의 enable advanced mode 를 체크하셔야 합니다. 재부팅 후에도 자동으로 수정한 값이 적용되길 바라신다면 settings에서 apply settings on boot 체크하셔면 되구요.
각 프로세스마다 어떤 oom_adj값을 가지고 있는지 확인하고 싶으면 메인화면에서 processes선택하면 foregroud app ~ empty app 의 모든 프로세스가 어떤 상태에 놓여있는지 그리고 어떤 oom_adj값을 가지고 있는지 나타냅니다.
개인적으로는 이런 안드로이드의 메모리 정책 값만 적절하게 수정해주어도, 굳이 task killer류의 어플은 필요하지 않다고 생각하니다.
캐쉬로 사용되는 empty app도 무작정 메모리에 올라오는 게 아니라 유저의 어플의 사용빈도 등에 따라서 어느 정도 적절하게 올라오게 되는데 oom_killer가 아닌, task killer류의 어플을 통해서 강제로 프로세스를 kill하게 될 경우 안드로이드의 이러한 학습에 반영이 되지 않는 걸로 알고 있습니다. 뿐만 아니라 task killer도 엄연히 자원의 한 부분을 차지하고 있음으로 퍼포먼스의 하락을 불러올 수도 있습니다. ( 뭐 여기에 관해서는 찬반의견이 많은 관계로 개인적인 의견이라고 해두겠습니다. )
디파이의 경우 램이 512로 멀티태스킹을 하기에 충분하므로, 다른 값은 건드리지 않고 content provider와 empty app만 각각 110과 150으로 수정하여 사용하고 있습니다.
이 셋팅에 의하면 가용램이 150이하로 떨어지게 되면 empty app부터 oom_adj값이 높은 순서에 의하여 차례로 kill하게 되어 얼추 가용램 값이 150Mb정도로 맞춰지게 됩니다. 현재 디파이의 안드로이드 버전이 2.1로 메모리 관리 능력이 강력하지 않은 관계로(프로요에서는 상당부분 개선된 걸로 알고있습니다.) 그럼에도 불구하고 계속해서 가용램이 떨어지는 경우가 있는데 이럴 경우 재부팅 과정을 한번 거쳐주시거나, autokiller에서 수동으로 empty app을 kill해주시면 됩니다.
그리고 가용램에 관해서 좀 강박관념을 가지고 가용램 = 퍼포먼스 라고 생각하시는 분들이 계신 것 같은데 이는 반은 맞고 반은 틀린 말입니다.
가용램은 어디까지나 현재 사용이 가능한 메모리량으로 비어있는 상태의 메모리량으로 생각하시면 됩니다. 이게 많이 남아있다고 해서 퍼포먼스가 올라가고 낮은 상태라고해서 퍼포먼스가 떨어지고 하지는 않습니다. 다만 가용램이 적다는 것은 백그라운드로 돌아가고 있는 프로세스가 많다는 것이고 이 프로세스들이 스케쥴링에 따라 CPU의 자원을 나눠서 가지게 되므로 성능이 떨어지는 것 뿐입니다.

안드로이드, 가용램

 

http://blogit.blogkorea.net/39768088/http://regen.egloos.com/4517293

This entry was posted in Uncategorized. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s