-----------------------------------------------------
- ■ 관련 명령어 요약 (아래 상세 설명에서 나오는 명령어들)
-----------------------------------------------------

    adb shell cat /proc/meminfo
    adb shell procrank -p
    adb shell top -m 10 -s cpu
    adb shell dumpsys meminfo 242

-----------------------------------------------------
- ■ procrank and top
-----------------------------------------------------

    adb shell procrank -p
    adb shell top -m 10 -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

'Linux 일반' 카테고리의 다른 글

우분투 64bit에서 안드로이드 개발에 적합한 이클립스 버전  (0) 2011.02.09
kscope 사용하기 - 1  (0) 2011.01.26
vi 명령어  (0) 2011.01.12
Makefile 문법법  (0) 2011.01.12
ext3 mount man page  (0) 2011.01.12

+ Recent posts