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. アプリプロセスの物理 RSS と仮想メモリの対比を表示します。
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
コマンドラインを実行し、実行が完了するまで待ちます。ファイル ブラウザまたはスタジオのファイル管理を通じてファイルを見つけ、ダブルクリックして開くと、詳細なメモリ スナップショットを表示できます。