'Technical Note/MOBILE PERFORMANCE'에 해당되는 글 5건

Technical Note/MOBILE PERFORMANCE

1 Intro


일전에 어떤 기업에서 기술면접을 본 적이 있다. 그 때 면접관이 물어봤던 물음 중에 하나가 “안드로이드 플랫폼에서 메모리 누수가 일어나는 경우와 그것을 어떻게 관리할지”에 대한 것이었다. 당시에는 솔직히 잘 몰라서 아주 원론적인 답만 했다. 그게 한동안 계속 기억에 남아서 날 찜찜하게 만들었다.


메모리 누수 문제는 어떤 언어나 플랫폼을 쓰던 꼭 집고 넘어가야 할 문제이다. 나의 경우엔 C와 같이 프로그래머가 직접 메모리를 관리하는 경우에만 익숙해져 있다보니 자동으로 메모리를 관리한다는 Java 같은 언어에서는 어떤 문제가 발생하는지 정확히 알지 못했다.


여담이지만 특정기능을 시스템 차원에서 지원한다는 것이 마냥 좋지만은 않은 것 같다. 뭔가가 ‘자동’으로 이루어진다는 말은 그걸 쓰는 사람이 필요에 따라 그 기능에 직접 개입할 수 없다는 뜻도 되기 때문이다. 설사 직접 개입할 수 있는 길이 있다 하더라도 보통 그런 접근법은 권장되지 않는다. 그 기능의 작동 플로우에 녹아들어 같이 휩쓸려가는 방식이 권장된다. 이런 관계로 자동으로 이루어지는 그 작동 방식을 알아야한다. 모르면 잘못 사용할 가능성이 높다는 것이다. Java의 Garbage Collection도 딱 이런 경우인데, C에서 직접 메모리를 관리하면서 주의해야할 부분과는 또 다른 방식으로 신경을 쓸 수 밖에 없는 것 같다.


암튼 모순적이게도 Java 세상에서도 프로그래머가 직접 메모리 관리에 대해 신경써야 하는 상황이 있으니 그에 대해 한번 정리해보고자 한다.


2 Java에서의 메모리 누수


원론적으로 말하자면 Java의 Garbage Collector(이하 GC)가 제대로 작동할 겨우 메모리 누수가 생길 수 없다. 왜냐하면 GC가 특정 조건을 trigger로 작동하면서 아무도 참조하지 않는 (힙의 특정영역을 점유하고 있을)객체는 회수하기 때문이다1. 반대로 말하자면 회수가 안된 객체는 누군가에 의해 분명 참조되고 있다는 뜻이다. 만약 룰이 깨진다면 그것은 해당 JVM 구현의 버그일 것이다.


그렇다면 Java에서 메모리 누수란 무엇일까? 위의 전제에서 힌트가 있다. 즉 누군가에 의해 참조되고 있는 그 객체가 진정 쓸모있냐 없냐에 달린 것이다. 쓸모없는 객체를 계속 누군가가 참조를 하고 있다면 그게 바로 메모리 누수이다.


Stackoverflow에 있는 재미있는 쓰레드에 보면 Java에서 쓸모없는 객체를 미친듯이 생성시켜 Out Of Memory Exception을 일으키는 여러 경우에 대한 예시가 나온다.


3 Android에서의 메모리 누수


안드로이드에서는 일반적인 JVM과는 달리 프로세스 하나마다 dalvik(JVM)이 하나씩 실행되기 때문에, JVM 하나에 다중 프로세스 때문에 생기는 문제에 대해 신경쓸 필요는 없어서 그나마 좀 간편하다고 하겠다2. 하지만 플랫폼의 구조적인 결함이나 버그로 인한 메모리 누수가 몇가지 알려져 있다. 알아보도록 하자.


3.1 Context 관련


이 문제는 안드로이드 공식 블로그 글에 원인과 해결책이 잘 나와있다. 간단히 말하면 일정한 생명주기를 가지는 Activity 내에서 View 를 생성할 때 Context 즉 해당 Activity 자체를 인자로 넘기는데, 화면 방향전환과 같이 Activity 재생성이 일어나는 경우 관련된 모든 객체들의 참조를 끊지 않으면 Activity 객체가 사용하던 메모리가 회수되지 않아 누수가 발생한다는 것이다.


이 문제는 플랫폼 설계상 어쩔 수 없이 생길 수 있는 것인 듯 하다. 플랫폼 구조를 뜯어고치지 않는 이상 응용프로그래머가 주의하여 프로그래밍 할 수 밖에 없는 상황이라 하겠다.


그럼 해결 방법은 무엇일까? 몇가지가 있다.


Activity Context 대신 Application Context를 사용할 것을 고려하라. Application Context 객체는 Application 단위의 생명주기를 가진다.

Activity Context를 Activity에서 쓸 경우, Activity 생명주기와 싱크를 맞추어라.

만일 Activity의 sub-class를 정의하여 사용한다면, sub-class에서 상위 Activity를 참조하는 경우를 되도록 만들지 마라. 대신 sub-class를 static으로 정의하고 해당 클래스가 Activity와WeakReference 를 갖도록 하라.

3.2 Bitmap 관련3


안드로이드 버전 2.3.3(API Level 10) 이전의 경우 Bitmap 의 픽셀 데이타를 native heap에 저장했다고 한다. 이로 인해서 Bitmap 객체가 GC를 통해 메모리 회수되지 않고 자꾸 쌓여서 OOM Exception을 일으키는 경우이다. 어떻게 보면 말도 안되는 일인데, 이를 해결하기 위해서 Bitmap의 recycle() 4이란 함수를 호출하라고 친철히 설명하고 있다. 최근 버전들은 이 문제가 해결되어(native heap을 쓰지않고 Dalvik VM heap으로 바꾸었다함) 참조변수를 null 로 바꾸기만 해도 충분하다고 한다.


3.3 기타


그 외에도 WebView5 나 MapView6 등에서 누수가 일어나는데 딱히 해결책이 없는 모양이다. 그나마 누수의 크기가 크지 않아서 조심하면서 쓰는 수 밖에 없단다.(뭐 이래~!)


4 마무리


Memory Leak이란 결국 해당 프로그램이 메모리(heap) 부족으로 원하는 시간만큼 실행되지 못할 때 문제가 된다. 잠재적인 위험을 가지고 있지만, 즉 누수가 조금씩 일어나지만 메모리 부족이 생기기 이전에 실행이 끝나고 프로세스가 정상적으로 죽는 경우라면 사실 문제될 이유가 없다. 하지만 그렇게 제한적인 프로그램이 활용도가 높을리는 없을꺼다. 따라서 프로그래머는 메모리 누수를 신경써야 한다. 아주 많이.


5 References


Memory Management in the Java HotSpot Virtual Machine

Java Reference와 GC

Bitmap.recycle()은 가급적 호출해 주는 편이 좋다. (Android 2.x 버전)

안드로이드 메모리 누수 줄이기

https://docs.google.com/present/edit?id=0AUhbwUh9azXLZGZnNnpnYzhfMzFjYnp2NzRjNg

Footnotes:


1 더 정확히 말하면 레퍼런스의 Root Set에 해당객체를 직접적 혹은 간접적으로 참조하는 변수가 없다면 그 객체는 garbage collecting 시에 회수된다.


2 시스템의 아래로 내려가면 결국은 Linux 프로세스 위에 dalvik이 하나씩 떠 있는 상황이라 특정 프로세스에서 메모리릭이 발생하여 그 프로세스가 죽는다고 해도 다른 프로세스에는 영향이 없다.


3 Issue 8488: 'bitmap size exceeds VM budget' if Activity is restarted {includes test demo!}


4 이 함수는 Bitmap 이 객체화 될때 native heap에 할당한 픽셀 데이타를 free 시킨다.


5 http://stackoverflow.com/questions/3130654/memory-leak-in-webview


6 Issue 2181: Memory leak in system when using MapView

Technical Note/MOBILE PERFORMANCE

안드로이드 시스템 분석에 사용할만한 shell 명령을 알아보자.


시스템 기본 정보: 하드웨어, 커널 등


cat /proc/version : 커널 버전

cat /proc/cpuinfo : 프로세서 정보. CPU 타입, 모델, 제조사 등

cat /proc/meminfo : 메모리 정보. 실제 메모리 및 가상 메모리

cat /proc/devices : 현재 커널에 설정되어 있는 장치 목록

mount : 마운트된 모든 장치 정보

df : 하드디스크 사용량

cat /proc/filesystems : 커널에 설정되어 있는 파일시스템 목록

cat /proc/swaps : 스왑 파티션의 크기와 사용량

cat /proc/interrupts : 장치가 사용중인 인터럽트(IRQ) 목록 표시

cat /proc/ioports : 현재 사용중인 Input/Output 포트

cat /proc/loadavg : 시스템의 평균부하량

cat /proc/partitions : 파티션 정보

cat /proc/uptime : 시스템이 얼마나 살아있었는지.

cat /proc/stat : 시스템 상태에 관한 다양한 정보. CPU 사용통계, 부팅이후 page fault 발생횟수 등

cat /proc/zoneinfo : ZONEINFO ?

dmesg : 시스템 부팅시 나왔던 메시지

ps : 실행중인 프로세스 정보

ps -p -t : 프로세스와 쓰레드 목록

set 또는 printenv : 환경설정값 출력


시스템 리소스 사용 현황


vmstat : 시스템의 리소스 상황 모니터링. CPU, I/O, 메모리 등

cat /proc/diskstats : 디스크 utilization과 throuthput. 즉 디스크 IO 현황

top : 시스템의 프로세스 상황 모니터링. 프로세스별 CPU 사용량, 메모리와 스왑 사용량 등

procrank : 프로세스별 메모리(VSS,RSS,USS, PSS)

dumpsys meminfo [PID] : 해당 프로세스의 메모리 상세 정보

cat /proc/[PID]/stat : 해당 프로세스에 대한 정보. 시작시간, 상태, CPU 사용량 등

cat /proc/[PID]/maps : 해당 프로세스의 메모리 맵 정보

cat /proc/vmstat : 버추얼 메모리 통계?

librank : 라이브러리별 메모리 사용량?


네트워크 관련


cat /proc/net/netlink : 네트워크 정보

netcfg : 네트워크 인터페이스와 IP주소 목록

netstat : 네트워크 연결상태 확인

nc : 네트워크용 cat 명령어(netcat)

ifconfig : 네트워크 인터페이스 설정 정보. 장치명을 파라미터로 받음. IP 주소, 서브넷마스크 등

tcpdump : 실시간 패킷 모니터링

iftop : 네트워크를 위한 top

route : 해당 호스트까지 연결하는 중간 경로 정보인 라우팅 테이블 표시

ping : 원격 호스트와의 연결 테스트

cat /proc/net/route : Routes


안드로이드 제공


logcat : 로그캣 보기

pm : package manager의 약자. 패키지/permission/instrumentation/feature 목록, 패키지 설치/제거 등

am : activity manager의 약자. 액티비티 시작, Intent 브로드캐스팅, Instrumentation 시작, profiling 시작/중지 등

service : 안드로이드 서비스 목록 표시, 서비스에 명령 전달

monkey : 애플리케이션에 랜덤 이벤트 발생시킴. 사용자 이벤트, 시스템 이벤트의 무작위 발행

cat /data/anr/traces.txt : VM TRACES (쓰레드 덤프)

cat /proc/binder/proc/[PID] : 바인더 프로세스 상태

cat /proc/binder/xxx : 바인더 관련 정보(xxx는 transactions, transaction_log, failed_transaction_log, stats 등)

cat /data/system/packages.xml : 설치된 패키지 세팅 정보

setprop : system property 세팅

getprop : 세팅된 system property 목록 출력



종합 리포트

dumpsys [service]: app/service 상태정보 덤프. 서비스별로 추가 파라미터 받을 수 있음

dumpstate : device 상태정보 덤프(cpu,mem,ps 등). 상태정보를 추출하는 여러 명령어들의 조합으로 구성

dumpcrash : 애플리케이션이 crash될 때의 상태정보 덤프?

bugreport : logcat+dumpsys+dumpstate


그밖에...

그밖의 안드로이드 shell 명령어는 /system/bin 및 /system/xbin을 뒤져보면 많이 나온다. 이제 남은 일은 찾아낸 명령어의 사용법, 출력결과를 어떻게 해석할지, 어떤 상황에서 이들을 활용할지 사례조사, 그리고 직접 활용해보는 것일게다.




* 참조


http://www.cyworld.com/polox94ii/312644


http://tkhwang.pe.kr/archives/65


http://en.androidwiki.com/wiki/ADB_Shell_Command_Reference


http://elinux.org/Using_Bootchart_on_Android


http://elenoa.tistory.com/52


게시일: 2014. 1. 27.


How to View Device Specification android With Adb Command


"ADB COMMAND"


@echo off

echo Waiting for device 

adb wait-for-device 

echo Manufacturer 

adb shell getprop ro.product.manufacturer 

echo Name adb shell getprop ro.product.name 

echo Model adb shell getprop ro.product.model 

echo Android version 

adb shell getprop ro.build.version.release 

echo Platform 

adb shell getprop ro.board.platform 

echo CPU 

adb shell getprop ro.product.cpu.abi 

echo cpu abi2 

adb shell getprop.ro.product.cpu.abi2 

echo Description 

adb shell getprop ro.build.description 

echo Fingerprint 

adb shell getprop ro.build.fingerprint 

echo Flexversion 

adb shell getprop ro.gsm.flexversion 

echo locale language 

adb shell getporp ro.product.locale.language 

echo locale region 

adb shell getprop ro.product.locale.region 

echo wifi.channels 

adb shell getprop ro.wifi.channels 

echo board platform 

adb shell getprop.ro.board.platform 

echo board 

adb shell getprop ro.product.board 

echo display id echo serial number 

adb get-serialno 

echo imei 

abb shell getprop gsm.baseband.imei 

adb shell getprop ro.build.display.id 

ceho version incremental 

adb shell getprop ro.build.version.incremental 

echo version sdk 

adb shell getprop ro.build.version.sdk 

echo version codename 

adb shell getprop ro.build.version.codename 

echo version release 

adb shell getprop ro.build.version.release 

echo date 

adb shell getprop ro.build.date 

echo type 

adb shell getprop ro.build.type 

echo user 

adb shell getprop ro.build.user 

adb kill-server

pause


More Stuf About Android : http://www.adbcommand.com/

Technical Note/MOBILE PERFORMANCE

안드로이드에서 프로세스가 도대체 얼만큼의 메모리를 사용하고 있는지 분석해본다.

시스템 메모리 사용 현황

우선 전체 시스템의 메모리부터 파악하자. $> adb shell 로 접속한 후 /proc/meminfo를 열어본다.

# cat /proc/meminfo

MemTotal:          94172 kB
MemFree:            2136 kB
Buffers:              12 kB
Cached:            46380 kB
SwapCached:            0 kB
Active:            36868 kB
Inactive:          46140 kB
Active(anon):      18548 kB
Inactive(anon):    19584 kB
Active(file):      18320 kB
Inactive(file):    26556 kB
Unevictable:         264 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:         36892 kB
Mapped:            29344 kB
Slab:               2952 kB
SReclaimable:        740 kB
SUnreclaim:         2212 kB
PageTables:         3176 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:       47084 kB
Committed_AS:     914824 kB
VmallocTotal:     876544 kB
VmallocUsed:       11376 kB
VmallocChunk:     863236 kB

MemTotal, MemFree 같은 필드는 대충 감이 잡히는데, 모르는 항목이 많이 보인다. 넘어가자. -.-;;

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 명령어로 구할 수 있다.

# top

User 1%, System 6%, IOW 0%, IRQ 0%
User 6 + Nice 0 + Sys 20 + Idle 293 + IOW 0 + IRQ 0 + SIRQ 0 = 319

  PID CPU% S  #THR     VSS     RSS PCY UID      Name
  205   4% R     1    888K    368K  fg root     top
   54   1% S    40 149592K  31644K  fg system   system_server
   99   0% S    17 117416K  22028K  fg radio    com.android.phone
    4   0% S     1      0K      0K  fg root     events/0
    5   0% S     1      0K      0K  fg root     khelper
    6   0% S     1      0K      0K  fg root     suspend
    7   0% S     1      0K      0K  fg root     kblockd/0
    8   0% S     1      0K      0K  fg root     cqueue
    9   0% S     1      0K      0K  fg root     kseriod
   10   0% S     1      0K      0K  fg root     kmmcd
   11   0% S     1      0K      0K  fg root     pdflush
   12   0% S     1      0K      0K  fg root     pdflush
    1   0% S     1    296K    204K  fg root     /init
   14   0% S     1      0K      0K  fg root     aio/0
   21   0% S     1      0K      0K  fg root     mtdblockd
   22   0% S     1      0K      0K  fg root     hid_compat
   23   0% S     1      0K      0K  fg root     rpciod/0
   24   0% S     1      0K      0K  fg root     mmcqd
   25   0% S     1    728K    308K  fg root     /system/bin/sh
   26   0% S     1    796K    260K  fg system   /system/bin/servicemanager
   27   0% S     1    832K    384K  fg root     /system/bin/vold
   28   0% S     1    656K    248K  fg root     /system/bin/debuggerd
   29   0% S     4   5420K    728K  fg radio    /system/bin/rild
   30   0% S     1  81428K  25528K  fg root     zygote
   31   0% S     6  20944K   3332K  fg media    /system/bin/mediaserver
   32   0% S     1    784K    284K  fg root     /system/bin/installd
   33   0% S     1   1616K    404K  fg keystore /system/bin/keystore
   34   0% S     1    728K    324K  fg root     /system/bin/sh
   35   0% S     1    824K    336K  fg root     /system/bin/qemud
   37   0% S     4   3372K    184K  fg root     /sbin/adbd
   46   0% S     1    780K    308K  fg root     /system/bin/qemu-props
   94   0% S     6 109168K  18604K  bg system   com.android.settings
   97   0% S     7 107548K  18784K  fg app_4    com.android.inputmethod.latin
  102   0% S    12 133720K  28496K  fg app_4    android.process.acore
  132   0% S     6 102392K  18260K  bg app_6    com.android.alarmclock
  144   0% S     7 103136K  18908K  bg app_1    android.process.media
  165   0% S     6 114060K  19036K  bg app_12   com.android.mms
  183   0% S     7 105492K  19592K  bg app_21   com.android.email
  197   0% S     1    728K    324K  fg root     /system/bin/sh
   13   0% S     1      0K      0K  fg root     kswapd0
    2   0% S     1      0K      0K  fg root     kthreadd
    3   0% S     1      0K      0K  fg root     ksoftirqd/0

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는 공유되는 페이지를 공유 프로세스의 수로 나누어서 좀더 정확한 메모리 사용량을 파악할 수 있게 해준다. 이게 프로세스가 사용하는 실제 메모리 크기에 가장 근접한 값이라고 볼 수 있다.

# procrank

  PID      Vss      Rss      Pss      Uss  cmdline
   54   32244K   31644K   14353K   10860K  system_server
  102   28496K   28496K   10835K    7164K  android.process.acore
   30   25528K   25528K    8585K    5636K  zygote
   99   22028K   22028K    6146K    3604K  com.android.phone
  183   19592K   19592K    4461K    2480K  com.android.email
  165   19036K   19036K    4122K    2136K  com.android.mms
  144   18908K   18908K    3953K    2148K  android.process.media
   94   18604K   18604K    3868K    1780K  com.android.settings
   97   18784K   18784K    3734K    1712K  com.android.inputmethod.latin
  132   18260K   18260K    3352K    1508K  com.android.alarmclock
   31    3332K    3332K    1002K     628K  /system/bin/mediaserver
  203     456K     456K     269K     260K  procrank
   29     728K     728K     258K     220K  /system/bin/rild
    1     204K     204K     185K     184K  /init
   37     184K     184K     169K     168K  /sbin/adbd
   27     384K     384K     156K     144K  /system/bin/vold
   35     336K     336K     134K     124K  /system/bin/qemud
   33     404K     404K     107K      88K  /system/bin/keystore
   34     324K     324K     102K      68K  /system/bin/sh
  197     324K     324K     102K      68K  /system/bin/sh
   25     308K     308K      96K      68K  /system/bin/sh
   46     308K     308K      95K      84K  /system/bin/qemu-props
   32     284K     284K      93K      84K  /system/bin/installd
   26     260K     260K      92K      84K  /system/bin/servicemanager
   28     248K     248K      84K      76K  /system/bin/debuggerd

프로세스별 PSS 수치는 DDMS의 Sysinfo 탭을 통해서도 볼 수 있다. 파이그래프로 비주얼하게 보여주므로, 메모리 사용 비율을 쉽게 파악할 수 있다. 





조금 더 상세한 메모리 정보
top과 procrank를 통해 애플리케이션의 개략적인 메모리 사용량을 알수 있었다면, dumpsys meminfo <PID(프로세스 ID)> 명령어로 약간 더 상세한 메모리 사용정보를 구할 수 있다. dumpsys meminfo 명령어는 프로세스가 사용하는 native(C/C++)와 dalvik(JAVA) 영역을 구분하여 보여주므로 달빅 VM 만의 메모리 크기를 알 수 있다.

# dumpsys meminfo 183
Currently running services:
  meminfo
----------------------------------------------------------
DUMP OF SERVICE meminfo:
Applications Memory Usage (kB):
Uptime: 3793754 Realtime: 3793754

** MEMINFO in pid 183 [com.android.email] **
                    native   dalvik    other    total
            size:     3436     3139      N/A     6575
       allocated:     3425     2639      N/A     6064
            free:       10      500      N/A      510
           (Pss):      824     1893     1461     4178
  (shared dirty):     1888     4916      972     7776
    (priv dirty):      620      540      552     1712

 Objects
           Views:        0        ViewRoots:        0
     AppContexts:        2       Activities:        0
          Assets:        2    AssetManagers:        2
   Local Binders:        4    Proxy Binders:        8
Death Recipients:        0
 OpenSSL Sockets:        0

 SQL
            heap:       56          dbFiles:        0
       numPagers:        3   inactivePageKB:       13
    activePageKB:        0

 

  • Pss 필드 : procrank에 나온 PSS 값과 동일
  • shared dirty : 다른 프로세스와 공유하는 dirty pages(디스크로부터 페이징 불가능?)
  • private dirty : 프로세스 고유의 dirty pages

참고로 위의 Objects와 SQL 섹션에는 View/Context/Activity 등의 개수와 SQL 페이지 크기 등 중요한 정보를 제공하므로 활용가치가 높다.

dumpsys meminfo 출력 결과에 나온 dalvik 컬럼의 size, allocated, free 필드값은 DDMS의 VM Heap 탭을 통해서도 확인할 수 있다. 각각 VM Heap 탭의 Heap Size, Allocated, Free 컬럼에 해당한다. DDMS의 VM Heap 탭의 정보는 달빅 VM만의 메모리 정보일 뿐, 애플리케이션의 native 라이브러리가 사용하는 메모리 정보는 제외되었다.





힙 메모리 분석

애플리케이션 프로세스가 차지하는 메모리 크기는 이 정도면 파악되었고, 힙 메모리 안에서 자바 객체 레벨의 메모리 사용량을 분석하려면 힙덤프를 떠서 분석해야한다. 이건 다음 기회에... ^^;;


Technical Note/MOBILE PERFORMANCE

- 앱이 오작동하는 버그는 잡을수 없는가?

- 테스트 자동화와 쉽게 사용할 수 있는 성능 측정 툴의 부재 


Technical Note/MOBILE PERFORMANCE

웹툰 테스트 자동화의 목적

:  하나의 모바일 장비에서 장시간 반복적으로 페이지를 로딩할 경우 Front-End 단에서 어떤 일이 벌어지는가?

Front-End Performance Test 
- app 이 죽거나, 멈추거나, 느려지는 문제를 찾고자 한다.
- 이미지나 동영상 등 app의 컨텐츠를 처리하는 과정에서 발생할 수 있는 문제점을 찾고자 한다.
- 모바일 장비의 메모리 사용량을 추척해서 메모리에 영향을 주는 부분을 체크하고 싶다
- app의 cpu 사용율을 추척해서 분석 결과를 보여주고 싶다





모바일 장비의 성능에 미치는 것
- Out of Memeory
- CPU usage
- Network
- Low battery



have you had problems with a mobile app within the last 6 months

기타
Front-End 성능 측정 도구
- Webpagetest
- Pagespeed
     - Chrome / FireFox Extension
     - Insights
     - API
- YSlow
- Google Speed Tracer


대표적인 profiling 툴
- procstats : 각 서비스에 대한 메모리 사용량, 실행시간
- top : 상태정보 heap, objects, sql
- traceview : 함수 클래스뱔 cpu 시간

- systrace : 컴포넌트별 cpu 실행시간


1
블로그 이미지

zzikjh