(android)system ui 記憶體優化
android中systemUI是作為一個設定桌布的服務存在的.以前專案中,對systemUI做了延遲啟動的優化,可以把記憶體從25M左右降到8M左右,可是最近一個專案用了同樣的方法(延遲啟動),記憶體卻仍然佔用25M.
1. procrank | busybox grep systemui
結果: 11212 63936K 44144K 27010K 25788K com.android.systemui # USS 佔用25M
2. dumpsys meminfo 11212
結果:
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
結果
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
1024 88 88 0 0 0 88 1 /dev/ashmem/dalvik-jit-code-cache (deleted
*
*
-------- -------- -------- -------- -------- -------- -------- ---- ------------------------------看到24400了嗎, 是虛擬機器分配了了差不多24M的記憶體,導致佔用的記憶體過大(後面的delete 我當初以為是垃圾記憶體,後來據說不是).
4. 分析到這裡,還是沒有什麼卵用.分析以下system ui的啟動log吧,
發現:
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
看到了嗎, 原因就是因為jpeg硬解碼失敗,使用了軟解碼, 導致記憶體使用暴增,而其他平臺是硬解碼成功的,所以記憶體佔用小.
但是這還是沒用,因為硬體廠商基本上不會再為這個專案維護了,讓他們去改希望也比較渺茫了.
5.還是不死心,用ddms 分析一下吧.上圖:
佔用27M, 但是當我點了一下GC後, 神奇的事情發生了,上圖:
美柚看錯, HEAP佔用變成了2M, 我們再用 procrank | grep systemui 看下:
結果: 1883 40608K 20816K 3700K 2484K com.android.systemui
的的確確是變小了. 看來system ui剛啟動的時候圖片操作佔用了記憶體,但是過後變成了垃圾記憶體, 我們只要用gc對其一下垃圾回收便能夠釋放記憶體,縮小差不多20M的記憶體佔用.
那麼我目前的想法,我不想修改systemui 的原始碼, 既然ddms能夠發出gc的命令,那麼我一定可以找到類似的方法 去讓system ui做gc的操作. 功夫不負有心人,
我終於找到了一條命令: 她就是 : kill -10 ${PID} ,
感興趣的同學可以看下虛擬機器的程式碼, 虛擬機器接收到USR1 的訊號時,會做垃圾回收處理, USER1的訊號就是10.
下面 是我寫的一個簡單shell,放到開機時時啟動, 當systemui的uss 記憶體佔用大於20M時, 就發一個gc命令.
#!/system/bin/sh
THRESH_HOLD=20000
while true
do
SYSTEMUI_PID=`procrank 2>&1 | busybox grep systemui | busybox awk '{print $1}'`
SYSTEMUI_MEM=`procrank 2>&1 | busybox grep systemui | busybox awk '{print $5}'`
SYSTEMUI_MEM=${SYSTEMUI_MEM%%K}
#echo ----------
#echo ${SYSTEMUI_PID}
#echo ${SYSTEMUI_MEM}
#echo ----------
if [ ${SYSTEMUI_MEM} -gt ${THRESH_HOLD} ]; then
echo "gc systemui..."
kill -10 ${SYSTEMUI_PID}
fi
sleep 30
done
相關推薦
(android)system ui 記憶體優化
android中systemUI是作為一個設定桌布的服務存在的.以前專案中,對systemUI做了延遲啟動的優化,可以把記憶體從25M左右降到8M左右,可是最近一個專案用了同樣的方法(延遲啟動),記憶體卻仍然佔用25M. 1. procrank | busybox grep
Android——OOM以及記憶體優化
(一)Android的記憶體管理機制 Google在Android的官網上有這樣一篇文章,初步介紹了Android是如何管理應用的程序與記憶體分配:http://developer.android.com/training/articles/memory.html。
Android介面UI的優化
在Android應用開發過程中,螢幕上控制元件的佈局程式碼和程式的邏輯程式碼通常是分開的。介面的佈局程式碼是放在一個獨立的xml檔案中的,這個檔案裡面是樹型組織的,控制著頁面的佈局。通常,在這個頁面中會用到很多控制元件,控制元件會用到很多的資源。Android系統本身有很
android防記憶體洩漏與記憶體優化的方法整理
記憶體洩漏 一、單利洩漏 存在記憶體洩露問題的一些程式碼片段像下面這樣: public class Util { private Context mContext;  
Android的UI優化之merge、include、ViewStub標籤的使用
最近要對新接手的一個Android專案做效能優化,經過大量的查閱學習,總結了一些知識點,特此記錄。此篇記錄UI效能方面的優化思路。 說起UI的優化,不得不瞭解一下過度繪製的概念、產生原因和表現、檢視以及優化overdraw的方法。 1. 過度繪製(Ov
Android避免OOM(記憶體優化)
Android記憶體優化是效能優化很重要的一部分,而如何避免OOM又是記憶體優化的核心。 Android記憶體管理機制 android官網有一篇文章 Android是如何管理應用的程序與記憶體分配 Android系統的Dalvik虛擬機器扮演了記憶體垃圾自動回收的角色。
Android UI效能優化實戰 識別繪製中的效能問題
1、概述2015年初google釋出了Android效能優化典範,發了16個小視訊供大家欣賞,當時我也將其下載,通過微信公眾號給大家推送了百度雲的下載地址(地址在文末,ps:歡迎大家訂閱公眾號),那麼近期google又在udacity上開了系列類的相關課程。有了上述的
Android效能優化篇之記憶體優化--記憶體洩漏
文章目錄 介紹 什麼是記憶體洩露 android中導致記憶體洩漏的主要幾種情況 1.單例模式 2.使用非靜態內部類 3.使用非同步事件處理機制Handler 4.使用靜態
Android記憶體優化—記憶體洩漏、記憶體抖動、記憶體溢位
記憶體洩漏 當某些物件不再被程式所使用,但是這些物件仍然被某些物件所引用著,進而導致垃圾收集器不能及時釋放它們。 記憶體洩露 指由於疏忽或錯誤造成程式未能釋放已經不再使用的記憶體。 解決辦法:在不需要的時候及時釋放掉資源 記憶體抖動 記憶體抖動 指記憶體頻繁地分配和回
Android記憶體優化—Java的引用方式
四種引用方式 1、強引用(StrongReference) 2、軟引用(SoftReference) 3、弱引用(WeakReference) 4、虛引用(PhantomReference) 強引用(StrongReference) 1、只要某個物件有強引用與之關聯,JVM必
Android記憶體優化—Android的記憶體管理方式
記憶體管理機制 從作業系統的角度來說,記憶體就是一塊資料儲存區域,屬於可被作業系統排程的資源。現代多工(程序)的作業系統中,記憶體管理尤為重要,作業系統需要為每一個程序合理的分配記憶體資源,所以可以從兩方面來理解作業系統的記憶體管理機制。 第一:分配機制。為每一個程序分配一個合理的記
Android UI優化—使用Lint進行資源和冗餘UI佈局優化
Lint簡介 1、Lint 是Android Studio 提供的 程式碼掃描分析工具 2、Lint可以幫助我們發現程式碼結構/質量問題,同時提供一些解決方案 3、Lint 發現的每個問題都有描述資訊和等級 Android Studio 中使用 Lint的步驟 1、工具欄 -
Android記憶體優化—dumpsys meminfo詳解
dumpsys 介紹 Dumpsys使用者系統診斷,它執行在裝置上,並提供系統服務狀態資訊 命令格式: adb shell dumpsys [system serbices] 常用dumpsys命令如下: 1、包資訊查詢 子命令格式:adb shell dumpsys pac
android 開發如何做記憶體優化
不少人認為JAVA程式,因為有垃圾回收機制,應該沒有記憶體洩露。其實如果我們一個程式中,已經不再使用某個物件,但是因為仍然有引用指向它,垃圾回收器就無法回收它,當然該物件佔用的記憶體就無法被使用,這就造成了記憶體洩露。如果我們的java執行很久,而這種記憶體洩露不斷的
Android記憶體優化
避免因不正確使用記憶體 & 缺乏管理,從而出現 記憶體洩露(ML)、記憶體溢位(OOM)、記憶體空間佔用過大 等問題,最終導致應用程式崩潰(Crash) 示意圖 下面,將針對回收 程序、物件 、變數的記憶體分配 & 回收進行詳細講解 2、
Android記憶體優化工具(三)MAT
前提 MAT介紹和獲取 官網https://eclipse.org/mat/ Memory Analyzer (MAT)是一個Java堆分析器,分析hprof檔案,檢視記憶體中都要哪些物件,都佔用了多少記憶體,檢視誰阻止Garbage Collect
記憶體優化(三)Android物件池使用
文章目錄 概述 Android Object Pools Pools原始碼解析: Pools結合Builder模式使用案例: 使用總結和注意事項 概述
進行Android記憶體優化的SoftReference 和 WeakReference
經過在網上查了一些相關的資料後總結出一下兩個類的用法可以對記憶體進行優化。在Android應用程式開發中,由於手機的資源有限,所以我們經常會需要觀察某物件什麼時候會被垃圾收集的執行緒清除,你必須要用一個 reference 記住它,以便隨時觀察,但是卻因此造成此物件的 reference 數目一直
Android記憶體優化六:系統中使用堆和棧管理記憶體的區別
一直對系統中堆和棧的使用原則不太理解,在網上看到這篇文章,非常不錯! 轉載地址:http://bbs.csdn.net/topics/390147637 在計算機領域,堆疊是一個不容忽視的概念,我們編寫的C語言程式基本上都要用到。但對於很多的初學著來說,堆疊是一個很模糊的概
Android studio + MAT記憶體分析優化 一
關於記憶體分析和優化,是我們app從開始到結束上線一直都要關注的問題。但是我發現我接觸過得專案和公司,都是在APP成型之後,或者快上線了,才會去關注app記憶體使用情況。派專人去分析每個頁面,每個動作是否會觸發記憶體洩漏,ui卡頓等問題。個人認為這是個非常不好