(android)system ui 内存优化
android中systemUI是作為一個(gè)設(shè)置壁紙的服務(wù)存在的.以前項(xiàng)目中,對(duì)systemUI做了延遲啟動(dòng)的優(yōu)化,可以把內(nèi)存從25M左右降到8M左右,可是最近一個(gè)項(xiàng)目用了同樣的方法(延遲啟動(dòng)),內(nèi)存卻仍然占用25M.
1. procrank | busybox grep systemui?
結(jié)果: 11212?? 63936K?? 44144K?? 27010K???25788K? com.android.systemui # USS 占用25M
2.?? dumpsys meminfo 11212
結(jié)果:
Applications Memory Usage (kB):
Uptime: 8264904 Realtime: 8264904
** MEMINFO in pid 11212 [com.android.systemui] **
???????????????????????? Shared? Private???? Heap???? Heap???? Heap
?????????????????? Pss??? Dirty??? Dirty???? Size??? Alloc???? Free
??????????????? ------?? ------?? ------?? ------?? ------?? ------
?????? Native??????? 0??????? 8??????? 0???? 8580???? 1650????? 209
?????? Dalvik??? 24528???? 5700??? 24380??? 25992??? 25734????? 258
?????? Cursor??????? 0??????? 0??????? 0????????????????????????? ?
?????? Ashmem??????? 0??????? 0??????? 0????????????????????????? ?
??? Other dev?????? 96?????? 56??????? 0????????????????????????? ?
???? .so mmap???? 1203???? 2444????? 496????????????????????????? ?
??? .jar mmap??????? 0??????? 0??????? 0????????????????????????? ?
??? .apk mmap?????? 46??????? 0??????? 0????????????????????????? ?
??? .ttf mmap??????? 0??????? 0??????? 0????????????????????????? ?
??? .dex mmap????? 253??????? 0??????? 0????????????????????????? ?
?? Other mmap?????? 28?????? 16?????? 28????????????????????????? ?
????? Unknown????? 817????? 504????? 812????????????????????????? ?
??????? TOTAL??? 26971???? 8728??? 25716??? 34572??? 27384????? 467
?
3. showmap 11212
結(jié)果
virtual???????????????????? shared?? shared? private? private
??? size????? RSS????? PSS??? clean??? dirty??? clean??? dirty??? # object
-------- -------- -------- -------- -------- -------- -------- ---- ------------------------------
*
*
? 4096?????? 60?????? 60??????? 0??????? 0??????? 0?????? 60??? 1 /dev/ashmem/dalvik-bitmap-2 (deleted)
??? 2052????? 212????? 212??????? 0??????? 0??????? 0????? 212??? 1 /dev/ashmem/dalvik-card-table (deleted)
? 262144??? 26596??? 24455??????? 0???? 2196??????? 0????24400??? 3 /dev/ashmem/dalvik-heap (deleted)
??? 1024?????? 88?????? 88??????? 0??????? 0??????? 0?????? 88??? 1 /dev/ashmem/dalvik-jit-code-cache (deleted
*
*
-------- -------- -------- -------- -------- -------- -------- ---- ------------------------------看到24400了嗎, 是虛擬機(jī)分配了了差不多24M的內(nèi)存,導(dǎo)致占用的內(nèi)存過(guò)大(后面的delete 我當(dāng)初以為是垃圾內(nèi)存,后來(lái)?yè)?jù)說(shuō)不是).
4. 分析到這里,還是沒(méi)有什么卵用.分析以下system ui的啟動(dòng)log吧,
發(fā)現(xiàn):
4 D/Zygote? ( 9704): Process 10352 terminated by signal (15)
?75 I/ActivityManager(10239): Start proc com.android.systemui for restart com.android.systemui: pid=11212 uid=10038 gids={50038, 1028, 1015, 1023,???????? 3002, 3001}
?76 D/ActivityManager(10239): test resumeTopActivty
?77 D/ActivityManager(10239): resumeTopActivty
?78 D/ActivityManager(10239): set persist.sys.bootformui true
?79 I/??????? (11212): jpeg hw mutex s_index = 319
?80 I/??????? (11212): [MSOS_PRINT][003274]???? ~!~mappd sharemem? @^A
?81 I/??????? (11212): [MSOS_PRINT][000640]???? pthread_mutex_init
?82 I/??????? (11212): [MSOS_PRINT][000642]???? CHIP_InitISR
?83 D/??????? (11212): [skia jpeg]: readbuf addr:0x1b14a000, size: 0x100000
?84 D/??????? (11212):? write buff addr:0x1b34a000,? size: 0x1500000
?85 D/??????? (11212):? internal buff addr:0x1b24a000,?? size: 0x100000?????????????????????????????????????????????????????????????????????????????? ?
?86 D/skia??? (11212): ---- fAsset->read(157360) returned 0
?87 E/??????? (11212): jpeg goto fail 0, s16JpegDecoderErrCode = -233
?88 I/??????? (11212): [MPlayerLib]:Decode jpeg fail, s16JpegDecoderErrCode?= -233?
?89 E/??????? (11212):?go sw decode!
?90 D/dalvikvm(11212): GC_FOR_ALLOC freed 59K, 11% free 2318K/2592K, paused 16ms, total 16ms
?91 I/dalvikvm-heap(11212): Grow heap (frag case) to 11.257MB for 9216016-byte allocation
?92 D/dalvikvm(11212): GC_FOR_ALLOC freed 1K, 3% free 11317K/11596K, paused 11ms, total 11ms
?93 D/dalvikvm(11212): GC_CONCURRENT freed 0K, 3% free 11317K/11596K, paused 3ms+2ms, total 16ms
?94 E/bt_userial_vendor(10759): count = 39
?95 E/bt_userial_vendor(10759):? /dev/btusb0 file exist
?96 E/bt_userial_vendor(10759): /dev/btusb0's size????? is 0??? bytes
?97 E/bt_userial_vendor(10759): /dev/btusb0's t_blksize is 4096 bytes
?98 E/bt_userial_vendor(10759): /dev/btusb0's blocks??? is 0??? blocks
?99 D/dalvikvm(11212): GC_FOR_ALLOC freed <1K, 3% free 11317K/11596K, paused 11ms, total 11ms
100 I/dalvikvm-heap(11212):?Grow heap (frag case) to 25.319MB for 14745616-byte allocation
看到了嗎, 原因就是因?yàn)?#xff4a;peg硬解碼失敗,使用了軟解碼, 導(dǎo)致內(nèi)存使用暴增,而其他平臺(tái)是硬解碼成功的,所以內(nèi)存占用小.
但是這還是沒(méi)用,因?yàn)橛布S商基本上不會(huì)再為這個(gè)項(xiàng)目維護(hù)了,讓他們?nèi)ジ南M脖容^渺茫了.
5.還是不死心,用ddms 分析一下吧.上圖:
占用27M, 但是當(dāng)我點(diǎn)了一下GC后, 神奇的事情發(fā)生了,上圖:
美柚看錯(cuò), HEAP占用變成了2M, 我們?cè)儆?procrank? | grep systemui 看下:
結(jié)果: 1883?? 40608K?? 20816K??? 3700K????2484K? com.android.systemui
的的確確是變小了. 看來(lái)system ui剛啟動(dòng)的時(shí)候圖片操作占用了內(nèi)存,但是過(guò)后變成了垃圾內(nèi)存, 我們只要用gc對(duì)其一下垃圾回收便能夠釋放內(nèi)存,縮小差不多20M的內(nèi)存占用.
那么我目前的想法,我不想修改systemui 的源碼, 既然ddms能夠發(fā)出gc的命令,那么我一定可以找到類似的方法 去讓system ui做gc的操作. 功夫不負(fù)有心人,
我終于找到了一條命令: 她就是 :??kill -10 ${PID} ,?
感興趣的同學(xué)可以看下虛擬機(jī)的代碼, 虛擬機(jī)接收到USR1 的信號(hào)時(shí),會(huì)做垃圾回收處理, USER1的信號(hào)就是10.??
下面 是我寫的一個(gè)簡(jiǎn)單shell,放到開機(jī)時(shí)時(shí)啟動(dòng), 當(dāng)systemui的uss 內(nèi)存占用大于20M時(shí), 就發(fā)一個(gè)gc命令.
[java]?view plain?copy總結(jié)
以上是生活随笔為你收集整理的(android)system ui 内存优化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: msm8937+android7.1系统
- 下一篇: android7.1增加一个开机自启动的