連載
» 2014年03月06日 18時00分 UPDATE

Androidで動く携帯Javaアプリ作成入門(49):Android 4.4のメモリ使用状況を把握する3つのツールの使い方 (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}:サンプリング数

 {ステータス名}には以下が存在します。

表1 procstatsの{ステータス名}と意味
{ステータス名} 意味
TOTAL 全ステータスの合計
Persistent 永続的に使用しているメモリ
Top  
Imp Fg フォアグラウンドでの動作時間
Imp Bg バックグラウンドでの動作時間
Backup バックアップ動作時間
Heavy Wgt メモリ使用量が多い動作時間
Service サービスの動作時間
Service Rs サービス再起動時間
Receiver レシーバー動作時間
(Home) ホームアプリ動作時間
(Last Act)  
(Cached)  

 アプリやサービスが長時間安定して動作するかどうかを確認するためには、以下のような手順を行います。

  1. アプリまたはサービスを起動
  2. 3時間後にprocstatsでダンプを取得
  3. 3時間後に再びprocstatsでダンプを取得
  4. 何度か取得したダンプの値を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の通りです。

表2 meminfoのタグと意味
タグ 意味
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と併せて使用するとよいでしょう。

       1|2 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。