1. 程式人生 > >(android)system ui 記憶體優化

(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

    3 /dev/ashmem/dalvik-heap (deleted)
    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;  

AndroidUI優化之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卡頓等問題。個人認為這是個非常不好