Android adb シェル アプリのメモリ (Java ヒープ メモリ/vss 仮想メモリ/詳細なメモリ ステータス/メモリ スナップショット hprof) とシステム利用可能なメモリを表示

1.adbシェルはアプリプロセスのpidを取得します

adb shell "ps|grep com.xxx包名"

チャネル パッケージに従って、対応する pid をクエリするには、次のようにします。
ここに画像の説明を挿入

2. adb シェルを通じてデバイスの Java dalvik ヒープ メモリの最大値を表示する

コマンドラインを実行します。

adb shell  getprop dalvik.vm.heapgrowthlimit

ここに画像の説明を挿入
アプリプロセスで Java ヒープ (dalvik ヒープ サイズ) ヒープ メモリが 384m を超えると、oom がスローされます。

アプリのmanifest.xmlでlargeHeap="true"が設定されている場合、アプリプロセスのdalvikヒープ制限は512m制限に対応します。

ここに画像の説明を挿入

3. アプリプロセスの物理 RS​​S と仮想メモリの対比を表示します

adb shell procrank (電話の root 権限が必要)、このコマンドは無視できます。

Top コマンドライン形式の使用を検討してください。

adb shell top -n 1 |findstr "packageInfo"

4399 チャネル パッケージを例として、 を実行するadb shell top -n 1 |findstr "\<com.minitech.mixxxxx.m4399\> \<PID\>"
ここに画像の説明を挿入
、adb シェルを通じてプロセス ステータスをクエリします。

実行コマンド形式:

adb shell  cat /proc/app的pid/status

ここに画像の説明を挿入
注意点: 32 ビット (arm64 ビット以外) では、アプリ プロセスのピーク仮想メモリが 3G を超え、oom 状況が発生しやすくなります。

4. adb シェル コマンド ラインを使用して、アプリ プロセスのメモリ ステータスを表示します。

フォーマット:

adb shell dumpsys meminfo [pkg/pid]

指定したプロセス パッケージ名のメモリ使用量を表示するために使用できます。
実行するとadb shell dumpsys meminfo com.minitech.xxxx.m4399、Java ヒープ、ネイティブ ヒープ、データベース、アセットなどを明確に知ることができます。メモリ値は KB 単位です。

C:\Users\hexingen>adb shell dumpsys meminfo com.minitech.xxx.m4399
Applications Memory Usage (in Kilobytes):
Uptime: 4282829 Realtime: 4282829

** MEMINFO in pid 14622 [com.minitech.miniworld.m4399] **
                   Pss  Private  Private  SwapPss     Heap     Heap     Heap
                 Total    Dirty    Clean    Dirty     Size    Alloc     Free
                ------   ------   ------   ------   ------   ------   ------
  Native Heap   455496   455468        8        0   596992   484213   112777
  Dalvik Heap    26347    26328        0        0    45768    29384    16384
 Dalvik Other     6178     6176        0        0
        Stack     3844     3844        0        0
       Ashmem     5561     5092        0        0
    Other dev       28        0       28        0
     .so mmap    62819     5104    55760       36
    .jar mmap        4        0        4        0
    .apk mmap    49281     9980    38240        0
    .ttf mmap     1031        0      768        0
    .dex mmap    24272       16    24228        0
    .oat mmap     8604        0     3968        0
    .art mmap     3794     2224      588        2
   Other mmap     6361       20     6076        0
    GL mtrack   152964   152964        0        0
      Unknown    79528    79528        0        1
        TOTAL   886151   746744   129668       39   642760   513597   129161

 App Summary
                       Pss(KB)
                        ------
           Java Heap:    29140 //java 堆所占用的物理内存
         Native Heap:   455468 //native 堆所占用的物理内存
                Code:   138068
               Stack:     3844
            Graphics:   152964
       Private Other:    96928
              System:     9739
               //app进程中占有物理内存(等于uss+按比列的共享库物理内存)
               TOTAL:   886151       TOTAL SWAP PSS:       39

 Objects // 进程中关键对象情况 ,activity \binder 个数,可看内存泄漏
               Views:      166         ViewRootImpl:        2
         AppContexts:        5           Activities:        4
              Assets:        7        AssetManagers:        4
       Local Binders:       71        Proxy Binders:       40
       Parcel memory:       40         Parcel count:      155
    Death Recipients:        2      OpenSSL Sockets:        8

 SQL
         MEMORY_USED:     1092
  PAGECACHE_OVERFLOW:      342          MALLOC_SIZE:       79

 DATABASES //进程中数据库db 打开情况
      pgsz     dbsz   Lookaside(b)          cache  Dbname
         4       40            480      222/96/23  /data/user/0/com.minitech.miniworld.m4399/databases/pangle_com.byted.pangle_bd_embed_tea_agent.db
         4       24             31         2/20/3  /data/user/0/com.minitech.miniworld.m4399/databases/tracker.db
         4       52             91       21/29/12  /data/user/0/com.minitech.miniworld.m4399/databases/bugly_db_
         4       92            200     478/108/25  /data/user/0/com.minitech.miniworld.m4399/databases/pangle_com.byted.pangle_ttopensdk.db
         4       24             98         1/37/4  /data/user/0/com.minitech.miniworld.m4399/databases/pangle_com.byted.pangle_downloader.db
         4       20             17         0/30/3  /data/user/0/com.minitech.miniworld.m4399/databases/pangle_com.byted.pangle_npth_log.db
         4       16             41        13/21/6  /data/user/0/com.minitech.miniworld.m4399/files/MobSDK/comm/dbs/.dh

 Asset Allocations  //进程中asset 打开情况
    : 1K
    zip:/data/user/0/com.minitech.miniworld.m4399/files/pangle_p/com.byted.pangle/version-4908/apk/base-1.apk:/resources.arsc: 98K

一般に、Pss Total 列と Private Dirty 列のみが対象となります。場合によっては、Private Clean 列と Heap Alloc 列によって提供されるデータも重要です。

次に、上記のデータを詳細に分析します。

Java ヒープのメモリ使用量を確認します。dalvik
ここに画像の説明を挿入
ヒープ サイズが jvm のしきい値 (通常は 384M または 512M) を超えると、Java ヒープがトリガーされて oom が発生します。

プロセス内の pss 物理メモリ使用量を確認します

  • Pss 合計: 占有された物理メモリ
  • プライベート ダーティ: アプリ プロセスが終了した後、システムが再利用できるアームの物理メモリ
  • プライベート クリーン: 現在のアプリ プロセスでシステムによって再利用された arm 物理メモリ。
    ここに画像の説明を挿入
    アプリ プロセスの pss 物理メモリがますます大きくなると、システムで利用可能な arm プロセッサの物理メモリが少なくなり、利用可能な物理メモリを割り当てるのに十分でなくなるまで、oom がトリガーされます。

メモリ リークをチェックします

1. AppContexts、Activities、および ViewRootImpl は、現在のプロセスのコンテキストとアクティビティの数、ルート ビュー (つまり、phonewindow) データを表し、ビジネスと組み合わせて、その数が現在の数を超えているかどうかを確認します。超えている場合は、メモリ リークが発生します。 、静的であるか、シングルトン クラスによって間接的に保持されます。
Java se で強く参照されるオブジェクトはリサイクルできません

adb shell dumpsys meminfo の詳細な説明: https://blog.51cto.com/u_4387387/6077172。

さらに: /proc/pid/maps 和/proc/pid/smaps adb シェルを介した実行には許可が必要ですが、この許可は一時的に使用できなくなります。
ここに画像の説明を挿入

5. 携帯電話システムの現在のメモリ状態を確認します。

を実行するとadb shell cat /proc/meminfo 、携帯電話プロセッサのメモリ、現在利用可能なメモリが表示されます。
ここに画像の説明を挿入
MemAvailable の場合、利用可能なメモリ サイズはどんどん小さくなり、使い果たされるまで oom がトリガーされます。

6.adb シェルはメモリ スナップショット hrop を取得します。

コマンドラインを実行します。

adb shell am dumpheap package包名 /data/local/tmp/xxx.hprof

ここに画像の説明を挿入
コマンドラインを実行し、実行が完了するまで待ちます。ファイル ブラウザまたはスタジオのファイル管理を通じてファイルを見つけ、ダブルクリックして開くと、詳細なメモリ スナップショットを表示できます。
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/hexingen/article/details/131934734