Android adb shell 시스템 점유 보는 법,adb shell에서 사용할 수 있는 유용한 명령(dumpsys, dumpstate), Memory leak 분석
출처 : http://webkebi.zany.kr:9003/board/bView.asp?bCode=91179649&aCode=2511&cBlock=0&cPageNo=1&sType=0&sString
-----------------------------------------------------
- ■ 관련 명령어 요약 (아래 상세 설명에서 나오는 명령어들)
-----------------------------------------------------
adb shell cat /proc/meminfo
adb shell procrank -p
adb shell top -m 10 -s cpu
adb shell dumpsys meminfo 242
dumpsys package 패키지명 | grep versionCode
-----------------------------------------------------
- ■ procrank and top
-----------------------------------------------------
adb shell procrank -p
adb shell top -m 10 -d 1 -s cpu
Usage: procrank [ -W ] [ -v | -r | -p | -u | -h ]
-v Sort by VSS.
-r Sort by RSS.
-p Sort by PSS.
-u Sort by USS.
(Default sort order is PSS.)
-R Reverse sort order (default is descending).
-w Display statistics for working set only.
-W Reset working set of all processes.
-h Display this help screen.
Usage: top [ -m max_procs ] [ -n iterations ] [ -d delay ] [ -s sort_column ] [ -t ] [ -h ]
-m num Maximum number of processes to display.
-n num Updates to show before exiting.
-d num Seconds to wait between updates.
-s col Column to sort by (cpu,vss,rss,thr).
-t Show threads instead of processes.
-h Display this help screen.
-----------------------------------------------------
- ■ 시스템 메모리 사용 현황
-----------------------------------------------------
우선 전체 시스템의 메모리부터 파악하자.
$> adb shell 로 접속한 후 /proc/meminfo 를 열어본다.
adb pull /proc/meminfo /tmp 명령으로 꺼내서 봐도 되고.
adb shell cat /proc/meminfo 명령으로 봐도 된다.
-----------------------------------------------------
- ■ VSS 와 RSS
-----------------------------------------------------
이론적으로(?) 프로세스가 차지하는 정확한 메모리의 크기를 알 수는 없다고 한다.
다만, 프로세스에 매핑되는 page 수를 해석하는 다양한 방법이 있는데, VSS, RSS, USS, PSS 등이 그것이다.
VSS(Virtual Set Size)
프로세스와 관련된 버추얼 메모리(virtual memory) 크기.
메모리 맵이 1M이면 프로세스가 어떤 리소스도 사용하지 않아도 VSS는 1MB가 된다.
의미있는 수치라고 볼 수 없음.
RSS(Resident Set Size)
프로세스와 관련된 물리적 페이지(physical pages) 수.
여러 프로세스 사이에서 공유된 페이지(shared pages) 수를 확인할 수 없어 별 의미없음.
A프로세스의 RSS가 2MB, B프로세스의 RSS가 2MB일 때 실제 물리 페이지 수는 4MB이거나 2MB일 수 있다.
어쨌거나 프로세스별 VSS 와 RSS 값은 top 명령어로 구할 수 있다.
-----------------------------------------------------
- ■ USS 와 PSS
-----------------------------------------------------
VSS나 RSS보다 조금 더 의미있는 수치는 USS와 PSS인데,
procrank 명령어로 구할 수 있다.
USS(Unique Set Size)
프로세스만의 고유한 페이지 수.
공유되지 않는 프로세스에 private한 메모리 크기이다.
PSS(Proportional Set Size)
USS + (공유 페이지 / 공유하는 프로세스 수).
즉, 프로세스 고유 메모리 사용량 + 하나의 프로세스가 차지하는 공유 메모리 비율이다.
만약 A프로세스가 6MB 메모리를 사용하고 그 중 2MB가 그 프로세스의 고유 영역이라면, 나머지 4MB는 공유 메모리이다. 4MB의 공유메모리를 4개의 프로세스가 공유하고 있다면 PSS는 2MB + (4MB/4) = 3MB가 된다.
PSS는 공유되는 페이지를 공유 프로세스의 수로 나누어서 좀 더 정확한 메모리 사용량을 파악할 수 있게 해준다.
이게 프로세스가 사용하는 실제 메모리 크기에 가장 근접한 값이라고 볼 수 있다.
프로세스별 PSS 수치는 "DDMS 의 Sysinfo 탭" 을 통해서도 볼 수 있다.
파이그래프로 비주얼하게 보여주므로, 메모리 사용 비율을 쉽게 파악할 수 있다.
-----------------------------------------------------
- ■ 조금 더 상세한 메모리 정보
-----------------------------------------------------
top과 procrank를 통해 애플리케이션의 개략적인 메모리 사용량을 알수 있었다면,
dumpsys meminfo <PID(프로세스 ID)> 명령어로 약간 더 상세한 메모리 사용 정보를 구할 수 있다.
dumpsys meminfo 명령어는 프로세스가 사용하는 native(C/C++)와 dalvik(JAVA) 영역을
구분하여 보여주므로 달빅 VM 만의 메모리 크기를 알 수 있다.
- Pss 필드 : procrank에 나온 PSS 값과 동일
- shared dirty : 다른 프로세스와 공유하는 dirty pages(디스크로부터 페이징 불가능?)
- private dirty : 프로세스 고유의 dirty pages
Objects와 SQL 섹션에는 View/Context/Activity 등의 개수와 SQL 페이지 크기 등
중요한 정보를 제공하므로 활용가치가 높다.
dumpsys meminfo PID 명령
dumpsys meminfo 출력 결과에 나온 dalvik 컬럼의
size, allocated, free 필드값은 DDMS의 VM Heap 탭을 통해서도 확인할 수 있다.
각각 VM Heap 탭의 Heap Size, Allocated, Free 컬럼에 해당한다.
DDMS의 VM Heap 탭의 정보는 달빅 VM만의 메모리 정보일 뿐, 애플리케이션의 native 라이브러리가 사용하는 메모리 정보는 제외되었다.
= 참고 원문 =
http://ecogeo.tistory.com/255
http://kohlerm.blogspot.com/2009/04/analyzing-memory-usage-off-your-android.html
dumpsys
dumpsys는 안드로이드 폰의 어플리케이션 및 현재 기기의 상태에 대한 자세한 정보를 제공한다.
(소스코드 위치: ./frameworks/base/cmds/dumpsys/dumpsys.cpp)
dumpsys meminfo: 메모리 사용 정보를 표시
dumpsys cpuinfo: CPU 프로세서 사용 정보를 표시
dumpmsys account: 모든 계정에 대한 정보를 표시
dumpsys activity: Activity에 대한 정보를 표시
dumpsys window: 키보드와 윈도우, 그리고 그들의 z order에 대한 정보를 표시
dumpsys wifi: 접속 가능한 액세스 포인트와 현재의 연결 상태를 표시
dumpsys power: 전원 관리와 관련된 정보(wakelock, screen off time 등)를 표시
dumpstate
dumpstate는 device 상태정보를 추출하는 여러 명령어들의 조합으로 구성 (dumpsys를 포함)
(소스코드 위치: ./frameworks/base/cmds/dumpstate/dumpstate.c)
Usage: dumpstate [-d] [-o file] [-s] [-z]
-d: 파일 이름에 날짜 정보를 추가 (-o 옵션과 함께 사용)
-o: 파일에 기록 (screen에는 표시하지 않음)
-s: 결과를 콘솔 소켓에 기록
-z: gzip 압축하여 파일로 기록 (-o 옵션과 함께 사용)
참고자료
http://comments.gmane.org/gmane.comp.handhelds.android.devel/174717
http://stackoverflow.com/questions/5780280/how-can-i-see-which-wakelocks-are-active
http://wrightrocket.blogspot.com/2010/12/useful-commands-in-adb-shell.html
http://tkhwang.pe.kr/archives/65
http://ecogeo.tistory.com/256
http://neit.egloos.com/category/Android
메모리 맵 확인
cat /proc/pid/maps
/sys/kernel/debug/tracing/available_filter_functions
/sys/kernel/debug/tracing$ echo sys_brk > sey_ftrace_filter
/sys/kernel/debug/tracing$ cat trace
/sys/kernel/debug/tracing$ cat current_tracer
/sys/kernel/debug/tracing$ echo function > current_tracer
/sys/kernel/debug/tracing$ cat trace
/sys/kernel/debug/tracing$ echo kmalloc >> set_ftrace_filter
/sys/kernel/debug/tracing$ cat trace
/sys/kernel/debug/tracing$ echo __kmalloc >> set_frace_filter
/data/local/tmp
cat /proc/pid/oom_adj
$ librank
$ showmap
$ procmem
$ cat /proc/self/smaps
$ cat /data/tombstones/tombstons_00\
dumpsys gfxinfo
dumpsys meminfo
adb shell dumpsys activity services
adb shell service list
'Android' 카테고리의 다른 글
Android monkey test / script (0) | 2012.10.13 |
---|---|
android /system/etc/permissions 에 있는 xml들 추적. (0) | 2012.09.17 |
GCM 사용하기 3 (JSP로 GCM 푸시 서버 만들기) (0) | 2012.09.05 |