在Android系统性能分析时,常常会拿到系统历史cpu和内存占用日志,
来分析某段时间哪些应用cpu和内存占用是否特殊高以及厘革来确定应用内存或cpu是否必要优化。
一、cpu占用查询及优化
1.获取系统中所有应用的cpu占用
adb shell top 获取系统中所有应用cpu占用并按照cpu占用率从大到小排序。
参数-m 可以指定 最多显示多少个进程
2.获取某个应用cpu内存占用率
先通过下令获取包名对应的pid,下令:adb shell pidof 应用包名
lilei@lilei-HP-Z4-G4-Workstation:~$ adb shell pidof 应用包名
3642
2.1 然后根据进程id(3642)获取该应用cpu占用情况,
下令:adb shell top -b -n 1 -p 3642,
查找包含pid 3642第9列就是cpu占用率0.0%内存占用率1.6
- lilei@lilei-HP-Z4-G4-Workstation:~$ adb shell top -b -n 1 -p 3642
- Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
- Mem: 11400952K total, 7869960K used, 3530992K free, 40607744 buffers
- Swap: 3145724K total, 0 used, 3145724K free, 2803496K cached
- 800%cpu 221%user 0%nice 125%sys 429%idle 0%iow 18%irq 7%sirq 0%host
- PID USER PR NI VIRT RES SHR S[%CPU] %MEM TIME+ ARGS
- 3642 system -2 0 16G 183M 129M S 0.0 1.6 0:14.44 应用包名
复制代码 2.2 然后根据进程id(3642)获取该应用各个线程占用cpu情况,
下令:adb shell top -H -d 1 -p 3642 -O cpu
- Threads: 32 total, 0 running, 32 sleeping, 0 stopped, 0 zombie
- Mem: 11400952K total, 8106876K used, 3294076K free, 61607936 buffers
- Swap: 3145724K total, 0 used, 3145724K free, 2929148K cached
- 800%cpu 223%user 0%nice 131%sys 421%idle 0%iow 17%irq 8%sirq 0%host
- TID USER [CPU]%CPU %MEM TIME+ THREAD PROCESS
- 30998 system 4 0.0 1.6 0:00.00 AdrenoOsLib 应用包名
- 30962 system 5 0.0 1.6 0:00.15 RenderThread 应用包名
- 9141 system 2 0.0 1.6 0:00.00 Binder:3642_5 应用包名
- 4172 system 7 0.0 1.6 0:00.00 queued-work-loo 应用包名
- 3987 system 4 0.0 1.6 0:02.07 subscriber 应用包名
- 3985 system 2 0.0 1.6 0:00.00 ion.xxxxxxxxxxxx 应用包名
- 3984 system 3 0.0 1.6 0:00.00 ion.xxxxxxxxxxxx 应用包名
- 3982 system 2 0.0 1.6 0:02.44 ion.xxxxxxxxxxxx 应用包名
- 3981 system 2 0.0 1.6 0:00.00 ion.xxxxxxxxxxxx 应用包名
- 3979 system 2 0.0 1.6 0:01.67 VATimer 应用包名
- 3977 system 3 0.0 1.6 0:00.00 Thread-3 应用包名
- 3976 system 3 0.0 1.6 0:00.00 Thread-2 应用包名
- 3963 system 3 0.0 1.6 0:00.00 DmsSceneWorkerT 应用包名
- 3962 system 3 0.0 1.6 0:00.00 Speech_HT 应用包名
- 3961 system 7 0.0 1.6 0:00.18 MSG_BASE_MODULE 应用包名
- 3960 system 3 0.0 1.6 0:00.00 StatisticsWorke 应用包名
- 3959 system 6 0.0 1.6 0:00.00 Rpc-Handler 应用包名
- 3958 system 3 0.0 1.6 0:00.00 HwBinder:3642_1 应用包名
- 3935 system 2 0.0 1.6 0:00.09 Binder:3642_4 应用包名
- 920 system 5 0.0 1.6 0:00.20 Profile Saver 应用包名
复制代码
3.CPU 优化方法
1.线程池复用,减少CPU调度开销
2.资源拷贝优化,减少读取IO时间
3.线程定名,方便定位题目
4.非须要内容,延迟初始化
5.初始化使命优先级分配,削峰填谷
二、内存占用查询及优化
1.获取系统中所有应用的内存占用
下令:adb shell dumpsys meminfo
可以查询系统所有应用的内存占用及占用排序。
2.获取某个应用内存占用 大小
dumpsys meminfo 应用包名,查询应用内存占用,如下dumpsys信息中第一个包含TOTAL关键字行第二列就是应用的总内存为84415(KB)
TOTAL 84415 32336 43068 0 84415 37040 23405 9641
- lilei@lilei-HP-Z4-G4-Workstation:~$ adb shell dumpsys meminfo 应用包名
- Applications Memory Usage (in Kilobytes):
- Uptime: 5566435 Realtime: 5566435
- ** MEMINFO in pid 3642 [应用包名] **
- Pss Private Private Swap Rss Heap Heap Heap
- Total Dirty Clean Dirty Total Size Alloc Free
- ------ ------ ------ ------ ------ ------ ------ ------
- Native Heap 14231 14200 0 0 17256 25848 17809 4045
- Dalvik Heap 4716 4652 0 0 9108 11192 5596 5596
- Dalvik Other 3302 2412 0 0 4808
- Stack 840 840 0 0 848
- Cursor 2 0 0 0 4
- Ashmem 2 0 0 0 8
- Other dev 160 0 160 0 444
- .so mmap 7128 624 1644 0 53852
- .jar mmap 1103 0 20 0 30596
- .apk mmap 27710 148 26900 0 30404
- .ttf mmap 45 0 0 0 288
- .dex mmap 0 0 0 0 132
- .oat mmap 26 0 0 0 2440
- .art mmap 7751 7580 0 0 20256
- Other mmap 16815 1312 14344 0 20544
- Unknown 584 568 0 0 1252
- TOTAL 84415 32336 43068 0 84415 37040 23405 9641
-
- App Summary
- Pss(KB) Rss(KB)
- ------ ------
- Java Heap: 12232 29364
- Native Heap: 14200 17256
- Code: 29380 119628
- Stack: 840 848
- Graphics: 0 0
- Private Other: 18752
- System: 9011
- Unknown: 25144
-
- TOTAL PSS: 84415 TOTAL RSS: 192240 TOTAL SWAP (KB): 0
-
- Objects
- Views: 337 ViewRootImpl: 1
- AppContexts: 6 Activities: 1
- Assets: 6 AssetManagers: 0
- Local Binders: 53 Proxy Binders: 51
- Parcel memory: 7 Parcel count: 28
- Death Recipients: 23 OpenSSL Sockets: 0
- WebViews: 0
-
- SQL
- MEMORY_USED: 0
- PAGECACHE_OVERFLOW: 0 MALLOC_SIZE: 0
复制代码
3.内存 优化方法
3.1、内存抖动
现象:应用内存波动图形呈 锯齿状。
原因:步伐中频繁创建对象会导致内存频繁分配和回收。
优化方向:减少在循环或频繁调用的方法中创建对象,可以使用缓存机制或对象池来复用对象。
如:使用StringBuilder或String.format等方法举行字符串拼接,制止使用加号拼接,以减少暂时对象的生成等。
3.2、内存走漏
现象:应用内存不断增长
原因:对象被持有导致无法开释或不能按照对象正常的生命周期举行开释
优化方向:
1.制止单例模式持有外部类的引用。
2.制止非静态内部类或匿名类默认持有外部类的引用。
3制止静态成员变量持有外部类的引用造成的内存走漏。
4.广播不必要监听时必要即使注销。
5.数据库游标Cursor不消时必要及时开释。
6.WebView不必要展示时必要及时开释webview的资源。
3.3、内存溢出
现象:E/AndroidRuntime(13316): java.lang.OutOfMemoryError
原因:内存走漏累积到一定水平导致OOM,或者一次性申请许多内存
优化方向:
1.制止内存泄漏。
2..制止一次创建大的数组或者是载入大的文件如图片。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |