Android 4.4のメモリ使用状況を把握する3つのツールの使い方:Androidで動く携帯Javaアプリ作成入門(49)(1/2 ページ)
アプリがどのように経時実行しているかを引き出す「procstats」、メモリ使用量の詳細を表示するツール「meminfo」、プロセスの統計情報をGUIで見られる「Process Stats」などを紹介。Dalvik VMのOutOfMemoryErrorとヒープ制御についても。
今回は連載第47回「低性能端末でも使えるか? Android 4.4 KitKatの新機能39選」で簡単に紹介したAndroid 4.4の新機能のうち、メモリ使用状況を把握し、改善するためのツールの使用方法を解説します。
アプリがどのように経時実行しているかを引き出す「procstats」
Android SDK 4.4から追加された「procstats」という新しいツールを使用すると、システム上で実行されている全てのアプリとサービスが使用しているリソースを分析できます。
Android OSにはアプリがどのように経時実行しているかという情報が蓄積されており、procstatsはこの情報を引き出します。想定される使用方法は、Androidデバイスにプリインストールするアプリやサービスが、搭載するRAMで十分動作可能であるかを判断するということです。
アプリ開発者向けというよりはAndroidデバイスベンダー向けでしょう。ただし、アプリ開発者がアプリが長時間、安定して動くかの確認を行うのにも有効です。その確認方法は後述します。
さて、procstatsの使用方法は、Android 4.4のSDKをインストールして、以下のコマンドを打つだけです。
adb shell dumpsys procstats
これで以下のようなログが全プロセス分出力されます。
AGGREGATED OVER LAST 24 HOURS: (省略) * com.android.chrome / u0a9: TOTAL: 67% (51MB-53MB-54MB/47MB-48MB-49MB over 17) Top: 67% (51MB-53MB-54MB/47MB-48MB-49MB over 17) Imp Bg: 0.01% Service: 0.38% Receiver: 0.00% (Last Act): 3.8% (51MB-51MB-51MB/48MB-48MB-48MB over 2) (Cached): 1.2% (3.9MB-3.9MB-3.9MB/2.2MB-2.2MB-2.2MB over 1) * android.process.acore / u0a0: TOTAL: 2.3% (6.6MB-8.8MB-10.0MB/5.8MB-7.6MB-8.7MB over 3) Top: 1.9% (6.6MB-8.8MB-10.0MB/5.8MB-7.6MB-8.7MB over 3) Imp Fg: 0.20% Imp Bg: 0.12% Service: 0.02% Receiver: 0.01% (Cached): 89% (4.9MB-6.4MB-10MB/3.6MB-5.0MB-8.4MB over 10) (省略) AGGREGATED OVER LAST 3 HOURS: (省略) CURRENT STATS: (省略) Run time Stats: SOff/Norm: +1m17s341ms SOn /Norm: +15m51s948ms (running) TOTAL: +17m9s289ms Start time: 2014-02-23 20:39:50 Total elapsed time: +19m27s723ms (partial) libdvm.so chromeview
このように、直近24時間、3時間、現在のステータスが表示されます。
残念ながらフォーマットに関する正式なドキュメントは見つけられませんでした。procstatsは「com.android.internal.app.ProcessStats」というクラスで実装されているため、そこからできるだけ表示されている内容の意味を読み取ってみました。
* {プロセス名} / {プロセスUID}: {ステータス名}: {A}% ({B}-{C}-{D}/{E}-{F}-{G} over {H})
- {A}:対象期間当たりの動作時間割合
- {B}:物理メモリ消費量(PSS:Proportional Set Size)最小値
- {C}:PSS平均値
- {D}:PSS最大値
- {E}:専有メモリ(USS:Unique Set Size)最小値
- {F}:USS平均値
- {G}:USS最大値
- {H}:サンプリング数
{ステータス名}には以下が存在します。
{ステータス名} | 意味 |
---|---|
TOTAL | 全ステータスの合計 |
Persistent | 永続的に使用しているメモリ |
Top | |
Imp Fg | フォアグラウンドでの動作時間 |
Imp Bg | バックグラウンドでの動作時間 |
Backup | バックアップ動作時間 |
Heavy Wgt | メモリ使用量が多い動作時間 |
Service | サービスの動作時間 |
Service Rs | サービス再起動時間 |
Receiver | レシーバー動作時間 |
(Home) | ホームアプリ動作時間 |
(Last Act) | |
(Cached) |
アプリやサービスが長時間安定して動作するかどうかを確認するためには、以下のような手順を行います。
- アプリまたはサービスを起動
- 3時間後にprocstatsでダンプを取得
- 3時間後に再びprocstatsでダンプを取得
- 何度か取得したダンプの値をCSVなどに変換し、グラフにして可視化
グラフにしてメモリ使用量が徐々に増えているとか、増えたまま減らないなどの傾向がある場合、メモリリークを疑った方が良いかもしれません。
また、間隔は3時間でなくても、もっと短くても、もっと長くても構いません。定期的にprocstatsコマンドを実行するには、シェルスクリプトやバッチファイルを用いるとよいでしょう。
メモリ使用量の詳細を表示するツール「meminfo」
meminfoはメモリ使用量の詳細を表示するツールで、Android 4.4で機能強化され、メモリ使用量のオーバーヘッドを発見しやすくなりました。
以下のようにコマンドを入力することで、現在のメモリ使用量の詳細を取得できます。
adb shell dumpsys meminfo
メモリ使用量の詳細は以下のような形式で出力されます。
Applications Memory Usage (kB): Uptime: 384313997 Realtime: 2990764480 Total PSS by process: 42895 kB: system (pid 511) 38871 kB: com.google.android.apps.plus (pid 31216) (省略) 117 kB: servicemanager (pid 117) 109 kB: libestool2.so (pid 31478) Total PSS by OOM adjustment: 50839 kB: Native 17269 kB: com.google.android.googlequicksearchbox:search (pid 11151) 7601 kB: com.google.process.gapps (pid 32333) (省略) 3007 kB: com.google.android.deskclock (pid 2700) 2544 kB: com.google.android.setupwizard (pid 7121) Total PSS by category: 153286 kB: Dalvik (省略) 0 kB: GL 0 kB: Memtrack Total RAM: 998092 kB Free RAM: 550088 kB (144700 cached pss + 360360 cached + 45028 free) Used RAM: 479786 kB (336382 used pss + 53096 buffers + 44308 shmem + 46000 slab) Lost RAM: -31782 kB Tuning: 64 (large 384), oom 122880 kB, restore limit 40960 kB (high-end-gfx)
出力内容は以下の表2の通りです。
タグ | 意味 |
---|---|
Total PSS by process | プロセスごとのPSS使用量を大きい順に表示 |
Total PSS by OOM adjustment | OutOfMemoryErrorが発生してサイズ調整されたPSS使用量を種別ごとに大きい順に表示。種別はNative、System、Persistent、Foreground、Visible、Perceptible、A Services、Home、B Services、Cachedがある |
Total PSS by category | カテゴリごとのPSS使用量。カテゴリはDalvik、Native、Ashmem、Graphics、GL、Stack、各種mmapなど |
また、以下のように対象プロセスを指定して実行することも可能です。
adb shell dumpsys meminfo com.android.nfc
指定するプロセスは、現在実行されているものでなければなりません。実行していないプロセスを指定した場合は指定なしと同じ動作となり、存在しないプロセスを指定した場合はエラーになります。
プロセスを指定した場合のフォーマットは以下のようになります。
Applications Memory Usage (kB): Uptime: 387763171 Realtime: 2994213654 ** MEMINFO in pid 752 [com.android.nfc] ** Pss Private Private Swapped Heap Heap Heap Total Dirty Clean Dirty Size Alloc Free ------ ------ ------ ------ ------ ------ ------ Native Heap 20 20 0 0 2432 1913 62 Dalvik Heap 1994 1776 0 0 8480 8145 335 Dalvik Other 1242 1084 0 0 Stack 16 16 0 0 Other dev 4 0 4 0 .so mmap 577 444 0 0 .apk mmap 36 0 36 0 .dex mmap 111 8 36 0 Other mmap 8 8 0 0 Unknown 681 676 0 0 TOTAL 4689 4032 76 0 10912 10058 397 Objects Views: 11 ViewRootImpl: 0 AppContexts: 5 Activities: 0 Assets: 3 AssetManagers: 3 Local Binders: 11 Proxy Binders: 14 Death Recipients: 0 OpenSSL Sockets: 0 SQL MEMORY_USED: 0 PAGECACHE_OVERFLOW: 0 MALLOC_SIZE: 0
.apkや.dexのmmapもメモリ使用量に直接影響するため、ファイルサイズを小さく作るということも軽視できないポイントになるということが見て取れます。
前述のprocstatsと併せて使用するとよいでしょう。
Copyright © ITmedia, Inc. All Rights Reserved.