out of memory

|

http://blog.naver.com/PostView.nhn?blogId=anywars&logNo=140130318506

 

http://pk09.tistory.com/127

 

http://shadowxx.egloos.com/10781292

------------------------------------------------------------

 

오늘은 여러분들이 프로젝트를 진행하면서 한번을 들어 볼(?) OOM (Out of Memory) LMK (Low Memory Killer) 에 대한 이야기를 해볼까 합니다.

 

오늘 이야기는 예전에 제가 보내드렸던 "[Android] Background process 줄여서 Memory 확보로 성능 개선하기." 메일과 관련이 깊은 내용입니다.

 

사실 이번 이야기는 제 동기가 찾아서 보내준 내용을 제가 여러분들과 공유하고자 전송해드리는 정도입니다.

 

간단히 정리하면, OOM Linux 커널에서 예전부터 쭈~욱 있어왔던 메모리 관리 모듈이고 이게 휴대기기에 들어가는 system 에서는 안맞다고 생각해서 OOM 이 일어나지 않도록 메모리를 관리하자라고 생각해서 Android 에서 만든게 LMK 입니다.

, Android 에는 LMK OOM 이 다 있고 동작합니다. 하지만 OOM 이 발생되면 파급 효과(? - 아래 글을 읽어보면 이해가 되실 것입니다) 가 크기 때문에 미연에 이러한 것을 방지하고자 동작되는 것이 LMK 라고 보시면 됩니다.

 

아래는 제 동기 최종한 선임이 보내준 내용입니다.

======================================

Android memory management

0. OOM Killer
- linux kernel
의 메모리 부족시 메모리 확보를 하는 process
- src
위치 : mm/oom_kill.c

-
기본 설명 :
시스템 구동중 메모리가 부족하면 운영체제 내부의 우선순위 알고리즘에 의해 프로세스를 죽인다.
리눅스 커널은 프로세스의 메모리 할당시 남은 메모리가 없는 상황을 처리하기 위해 OOM(Out of Memory) Killer 를 가지고 있다.
그 것은 모든 프로세스를 어떤 제약으로 점수를 매겨 init을 제외한 최고 점수의 프로세스는 죽여 메모리를 확보한다.
따라서 일반적으로 서버를 운영할때에는 서비스데몬이 oom-killer에게 안죽도록 메모리관리를 잘해야한다

- Wiki OOM
most cases, a computer with virtual memory support where the majority of the loaded data resides on the hard disk would probably run so slowly due to excessive paging that it would be considered to have failed,
prompting the user to close some programs or reboot. As such, an out of memory message is rarely encountered by applications with modern computers
The typical OOM case in modern computers happens when the operating system is unable to create any more virtual memory, because all of its potential backing devices have been filled.
Operating systems such as Linux will attempt to recover from this type of OOM condition by terminating a low-priority process, a mechanism known as the OOM Killer


- OOM
발생 원인
커널은 Virtual memory를 이용한 메모리 할당을 하므로 실제 가용한 physical 메모리 보다 큰 프로그램 size의 메모리를 할당 할 수 있다.
즉 프로그램에서 당장 사용하지 않는 메모리는 나중에 메모리를 할당하기 때문에 실제 사용 가능한 메모리를 넘는 process load될 수 있다.(이것을 overcommit 이라 한다.)
만약 overcommit된 메모리에 실제 뭔가 쓰여지기 시작하면 메모리가 모자라므로 Out of memory가 발생한다.

- OOM Killer Configure
/proc/meminfo/CommitLimit : Commit Limit / SWAP + SOME REAL MEMORY
/proc/meminfo/Committed_AS :
현재 Commited 된 양
/proc/sys/vm/overcommit_memory : (mode 0 - heuristic / mode 1 - always overcommit / mode 2 - strict overcommit, overcommit
불가)
/proc/sys/vm/overcommit_ratio : The percentage can be more than 100, for a situation where you have lots of programs that don't use much of their allocated space.(percentage of real memory)

- Kill Policy
* The formula used is relatively simple and documented inline in the
* function. The main rationale is that we want to select a good task
* to kill when we run out of memory.
*
* Good in this context means that:
* 1) we lose the minimum amount of work done
* 2) we recover a large amount of memory
* 3) we don't kill anything innocent of eating tons of memory
* 4) we want to kill the minimum amount of processes (one)
* 5) we try to kill the process the user expects us to kill, this
* algorithm has been meticulously tuned to meet the principle
* of least surprise ... (be careful when you change it)

- Comment
기본적으로 OOM은 적은 수의 프로세스를 죽여서 많은 양의 메모리를 확보할 수 있는 heuristic을 쓰는 것을 알 수 있다.
OOM killer
heuristic에 기반하고 있기 때문에, 중요한 server process가 죽지않는 다는 보장을 하기가 힘들다
하지만, OOM killer를 쓰지 않는다고 하더라도, 특정 프로세스가 종료할 때까지 기다리는 수 밖에 없고,
page fault handler
에서 page frame을 할당받지 못하면, init를 제외한 해당 task kill 되기 때문에, OOM 상황에서는 어차피 치명적인 상황이 발생한다.
따라서, OOM 상황이 발생하지 않도록 노력하는 것이 중요하여 이때문에 안드로이드에서는 별도로 LMK를 사용하고 있다.

- Reference site
*
http://blog.naver.com/PostView.nhn?blogId=pinocc&logNo=120059187934
* http://blog.naver.com/newbeing2000/30036826720
* http://lechuck.tistory.com/38
* http://andstudy.springnote.com/pages/3667993

 

1. Low Memory Killer
-
안드로이드에 특화된 OOM
- src
위치 : /drivers/staging/android/lowmemorykiller.c(공식 커널에선 제외되어 안드로이드 커널에서만 볼 수 있다.)

-
기본설명
low memory killer
는 구글 직원이 2009년에 안드로이드 메모리 관리를 위해 작성한 리눅스 커널 모듈이다
이 커널이 등장한 배경은 리눅스 메모리 정책이 현재 임베디드 환경에 맞지 않다는 것이다.
리눅스 커널의 기본 메모리 정책은 OOM Killer로 대표되는데 메모리가 부족한 상황에서 최대한의 가용성을 확보하기 위해 가상 메모리를 가장 많이 할당한 프로세스를 죽이는 형태로 되어 있다.
이런 정책은 서버나 임베디드 환경에서 주요 서비스나 주요 어플리케이션을 죽일 수 있다.
안드로이드의 가용 RAM이 설정된 Threshold 이하로 떨어지게 되면 프로세스 중요성별로 분류된 6가지 그룹중 해당 Application Kill 하도록 설정되어 있습니다.
그래서 시스템을 최종 사용자(end user) 관점에서 안정적이게 만든다.

-Application
6가지 타입으로 분류

- LMK Configure
# cat /sys/module/lowmemorykiller/parameters/adj
cat /sys/module/lowmemorykiller/parameters/adj
0,1,2,4,7,15
# cat /sys/module/lowmemorykiller/parameters/minfree
2048,3072,4096,6144,7168,8192
위 값은 4KB 페이지 단위로 표현된 것을 보여준 것이고, 4번째 값인 7168 HIDDNE_APP Threshold에 해당.
가용 RAM 7168 * 4K = 29M로 줄어들어야 HIDDEN_APP Kill 하도록 설정되어 있음
이 값은 /init.rc에 표기되어 있음


- Kill Policy
1.
어플리케이션은 자신의 상태(adj)를 항상 가지고 있는다. (/proc/<pid>/oom_adj)
2.
운영체제는 몇개의 메모리 문턱(minfree)을 가지고 있어서 단계로 메모리 문제를 다룬다.
3.
운영체제는 어플리케이션의 상태 변화를 인지하여 어플리케이션 상태를 수정한다.
4. adj
minfree 값은 짝을 이룬다. (0, 1024) (8, 4096)
5. minfree
값 이하로 메모리가 남은 경우 adj 값 이상의 어플리케이션을 제거한다. (4096 페이지 이하일 경우 adj 8 이상의 어플리케이션 중 하나가 제거된다.)
6. adj
값이 높을 수록 먼저 제거되고 차순으로는 가상 메모리 양을 비교한다. (4096 페이지 이하일 때 8 10이 있을 경우 10이먼저 제거된다.)
*3
번 과정인 어플리케이션 상태 수정은 유저 레벨 서비스인 ActivityManager가 변경한다.
어플리케이션 상태는 GUI와 깊은 연관이 있기 때문에 커널 레벨에서 일방적으로 결정하기에는 부적절하다

- Reference
http://barriosstory.blogspot.com/2009/02/taming-oom-killer.html
http://s2junn.tistory.com/45
http://dalinaum-kr.tumblr.com/post/4528344482/android-low-memory-killer

 

'Android 개발 > Android SDK' 카테고리의 다른 글

Android app process kill  (0) 2013.07.01
안드로이드의 파일 입/출력  (0) 2012.02.12
dalvik debugger  (0) 2012.01.09
Handler와 AlarmManager를 통한 Timer 작업 처리  (0) 2011.05.12
Bitmap OutofMemoryError  (0) 2011.05.12
And

android 2.3 build

|

http://source.android.com/source/initializing.html


------------------------------

Building Android: error: passing ‘const android::RefBase::weakref_impl’

If you are building android in ubuntu >10.04 you are gonna get this awesome error:

:0:0: warning: “_FORTIFY_SOURCE” redefined [enabled by default]
:0:0: note: this is the location of the previous definition
frameworks/base/libs/utils/RefBase.cpp: In member function ‘void android::RefBase::weakref_type::trackMe(bool, bool)’:
frameworks/base/libs/utils/RefBase.cpp:483:67: error: passing ‘const android::RefBase::weakref_impl’ as ‘this’ argument of ‘void android::RefBase::weakref_impl::trackMe(bool, bool)’ discards qualifiers [-fpermissive]
make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libutils_intermediates/RefBase.o] Error 1

Like the error itself tell us, the fix is to add the flag fpermissive, so let’s editframeworks/base/libs/utils/Android.mk and change:

LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS)

to

LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS) -fpermissive

And let the compiler do its job.

----------------------------------

http://e-xiao.blogspot.kr/2011/10/resolve-build-errors-for-android-234.html


Resolve the Build Errors for Android 2.3.4 under 32-bit ubuntu 11.10

ERROR#1
Firstly need to enable to build android on a 32-bit system. Otherwise, you will see the following error message immediately when you start to build the source tree.
************************************************************
You are attempting to build on a 32-bit system.
Only 64-bit build environments are supported beyond froyo/2.2.
************************************************************
modify following files.
external/clearsilver/java-jni/Android.mk
external/clearsilver/util/Android.mk
external/clearsilver/cgi/Android.mk
external/clearsilver/cs/Android.mk
Find all lines of
LOCAL_CFLAGS += -m64
or
LOCAL_LDFLAGS += -m64
Change then with
LOCAL_CFLAGS += -m32
or
LOCAL_LDFLAGS += -m32

Need also change all lines in build/core/main.mk
ifneq (64,$(findstring 64,$(build_arch)))
to
ifneq (i686,$(findstring i686,$(build_arch)))
too.

ERROR#2
host C++: libutils <= frameworks/base/libs/utils/RefBase.cpp
frameworks/base/libs/utils/RefBase.cpp: In member function ‘void android::RefBase::weakref_type::trackMe(bool, bool)’:
frameworks/base/libs/utils/RefBase.cpp:483:67: error: passing ‘const android::RefBase::weakref_impl’ as ‘this’ argument of ‘void android::RefBase::weakref_impl::trackMe(bool, bool)’ discards qualifiers [-fpermissive]

make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libutils_intermediates/RefBase.o] Error 1

With file
frameworks/base/libs/utils/Android.mk
Change the line:
LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS)
To:
LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS) -fpermissive

ERROR#3
host C++: obbtool <= frameworks/base/tools/obbtool/Main.cpp
:0:0: error: "_FORTIFY_SOURCE" redefined [-Werror]
:0:0: note: this is the location of the previous definition
cc1plus: all warnings being treated as errors

make: *** [out/host/linux-x86/obj/EXECUTABLES/obbtool_intermediates/Main.o] Error 1

To fix this, refer to this patch.
https://github.com/CyanogenMod/android_build/commit/e9cbfa60c8dd60d04570d8bf7bd0d54a4304baf5
It will patch line 61 in /build/core/combo/HOST_linux-x86.mk as following.
-HOST_GLOBAL_CFLAGS += -D_FORTIFY_SOURCE=0
+HOST_GLOBAL_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0


-----------------------------------



----------------------------------------



'Android 개발 > 팁 / 활용정보' 카테고리의 다른 글

android memory leak 해결  (0) 2014.03.10
JellyBean 4.2.2  (0) 2013.04.16
anr 로그 /data/anr/traces.txt  (0) 2012.08.08
갤럭시 넥서스 루팅  (0) 2011.12.28
android emulator 저장소 늘리기  (0) 2011.10.30
And

주차하는방법

|

http://navercast.naver.com/contents.nhn?contents_id=5149

 

---------------------------

 

초보 운전자들이 가장 어려워하는 것 중 하나가 바로 주차이다. 기본적으로 주차 하는 방법은 운전면허 학원에서도 배우지만 실전에서의 주차는 학원에서 배우는 것과 천지 차다. 여기 좀 더 쉽고 간결한 방법으로 주차할 수 있는 노하우가 있다. 기본적인 요령을 알고 반복적인 연습과 경험을 쌓는다면 주차가 더 이상 두렵지 않을 것이다. 요즘에는 초보 운전자들이 수동 차량을 모는 경우는 드무니, 오토 차량을 기준으로 설명하겠다.   

 

 

T자 후진 주차 방법

일반적으로 가장 많이 사용하게 되는 주차 방법이다. 일단 주차 초보라면 주차할 때에는 가능한 브레이크만 사용해 주차하도록 한다. 가뜩이나 여기저기 살펴야 할 곳이 많아 정신없는데 가속 페달까지 신경을 쓰다가 자칫 사고가 발생할 수 있기 때문이다.

 

1) 주차된 차량(A와 B)과 나란히 50cm 정도의 거리를 두고 진입한다. 주차된 차량과의 거리가 중요한데 1m가 넘지 말아야 좀 더 쉽게 들어갈 수 있다.


2) 내 차의 뒤범퍼 선이 B 차량의 중간(빨간색 선)에 이르렀다고 생각하면 정지한다.


3) 핸들을 오른쪽 방향으로 끝까지 돌린 후, 후진 기어를 넣고 서서히 주차 공간 안으로 진입한다. 이때 오른쪽 사이드미러를 통해 내 차의 조수석 쪽 뒤범퍼와 B 차량의 운전석 쪽 앞 모서리의 간격을 확인한다. 이어서 왼쪽 사이드미러를 통해 내 차와 A 차량의 조수석 쪽 모서리와의 간격을 확인한다.


 

4) 공간이 좁다면 내 차의 오른쪽 뒷바퀴를 B 차량에 가깝게 붙인다는 느낌으로 핸들을 조작하는 것이 좋다.


5) 자동차가 주차 공간의 1/3 지점까지 들어가 옆 차와 수평이 됐다고 생각되면 핸들을 풀어 정중앙에 놓고 후진을 한다.


6) A, B 차량 사이의 간격을 직접 고개를 돌려 확인한 후 만약 어떤 한쪽에 너무 붙게 되면 간격이 넓은 차 쪽으로 핸들을 조금 풀어 앞으로 갔다가 다시 핸들을 정중앙에 놓고 후진해 진입한다.


7) 옆 차와 사이드미러 위치가 비슷해지면 차를 세운다.

 

T자 후진 주차

 

 

T자 전진 주차 방법

많이 사용하진 않지만 최근에는 조경보호 문제로 전면 주차를 요구하는 주차장이 많아져 주차방법을 익혀 놓는 게 좋다. 주차 과정이 바로 눈앞에 보여 주차가 더 쉽다고 느껴지지만, 실제로 많은 운전자들이 후진 주차보다는 전진 주차가 더 어렵다고 말한다. 주차공간이 넓은 편이라 해도 한 번에 차를 넣기는 쉽지 않아 두세 번 정도는 넣었다 뺐다를 반복해야 하는 경우가 많다.

 

1) 주차돼 있는 차량 A와 평행하게, 1m 정도의 거리를 두고 진입한다. 후진 주차와는 반대로 주차된 차량과 내 차의 거리가 멀수록 더 쉽게 주차할 수 있다.

 

2) 내 차의 오른쪽 사이드미러가 A 차량의 왼쪽 끝선에 이르면 정지한다. 

 

3) 핸들을 오른쪽으로 끝까지 돌려 주차 공간 안으로 진입한다. 운전자는 오른쪽 보다는 왼쪽의 상황을 더 잘 확인할 수 있기 때문에 내 차를 B 차량에 가깝게 붙인다는 느낌으로 들어가면 도움이 된다.


 

4) 진입할 때는 오른쪽 사이드미러를 통해 내 차의 조수석 옆면이 A 차량의 모서리에 닿는지 확인하고 이어 내 차의 왼쪽 앞범퍼가 B 차량의 모서리에 닿는지 확인해야 한다.


5) 전진 주차는 거의 한 번에 넣기가 어렵기 때문에 주차 공간으로 진입하던 중간 다시 후진해야할 일이 생길 수 있는데, 이때에는 핸들을 정중앙에 놓고 후진해야 양쪽 옆 차와 부딪히지 않는다.


6) 후진한 다음에는 다시 양쪽 차량과의 간격을 확인하면서 핸들을 조금씩 돌려 진입한다.

 

T자 전진 주차

 

 

평행 주차 방법

도로 상에 주차를 할 때는 평행(일렬) 주차를 하는 경우가 많다. 평행 주차를 할 때는 후진으로 들어가는 것을 익히도록 한다. 공간이 아주 넓은 경우가 아니라면 전진으로 평행 주차를 하는 것은 쉽지 않다. 초보 운전자의 경우 T자 주차보다 평행 주차를 어렵게 생각한다. 하지만 처음 후진을 하기 직전 차를 세우는 위치만 잘 익힌다면 보다 쉽게 주차할 수 있다.

 

1) B 차량과 평행으로 1m 정도 간격을 두고 진입한다. 좀 더 가까워도 괜찮다. B 차량의 뒤범퍼 선과 내 차의 뒤 선이 거의 일직선 상으로 놓였다고 생각되면 정지한다.

 

2) 오른쪽으로 끝까지 핸들을 돌린다.


 

3) 후진기어를 넣고 후진을 하면서 내 차의 중심축이 45도 각도로 놓였을 때 재빨리 핸들을 풀어 정중앙으로 놓는다. 

 

4) 그 상태로 후진을 하다가 B 차량의 왼쪽 뒤범퍼와 내 차의 조수석 쪽 앞범퍼가 만날 때쯤 재빨리 핸들을 왼쪽으로 끝까지 돌려준다.


5) 오른쪽 사이드미러를 통해 내 차의 뒤범퍼가 벽(또는 방지선)에 닿지 않도록 확인하면서, 벽에 밀착하는 느낌으로 후진해 진입한다.

 
6) 내 차가 완전히 주차 공간 안으로 들어가면 앞뒤 차량과의 간격을 적당히 유지한 다음 핸들을 풀어 바퀴를 정중앙에 놓는다.

 

평행 주차

 

And