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命令.

[java] view plain copy
  1. #!/system/bin/sh
  2. THRESH_HOLD=20000
  3. while true
  4. do
  5. SYSTEMUI_PID=`procrank 2>&1 | busybox grep systemui | busybox awk '{print $1}'`
  6. SYSTEMUI_MEM=`procrank 2>&1 | busybox grep systemui | busybox awk '{print $5}'`
  7. SYSTEMUI_MEM=${SYSTEMUI_MEM%%K}
  8. #echo ----------
  9. #echo ${SYSTEMUI_PID}
  10. #echo ${SYSTEMUI_MEM}
  11. #echo ----------
  12. if [ ${SYSTEMUI_MEM} -gt ${THRESH_HOLD} ]; then
  13. echo "gc systemui..."
  14. kill -10 ${SYSTEMUI_PID}
  15. fi
  16. sleep 30
  17. done

(android)system ui 内存优化相关推荐

  1. android uid systemui,(android)system ui 内存优化

    android中systemUI是作为一个设置壁纸的服务存在的.以前项目中,对systemUI做了延迟启动的优化,可以把内存从25M左右降到8M左右,可是最近一个项目用了同样的方法(延迟启动),内存却 ...

  2. 关于android性能,内存优化 http://www.cnblogs.com/zyw-205520/archive/2013/02/17/2914190.html

     随着技术的发展,智能手机硬件配置越来越高,可是它和现在的PC相比,其运算能力,续航能力,存储空间等都还是受到很大的限制,同时用户对手机的体验要  求远远高于PC的桌面应用程序.以上理由,足以需要 ...

  3. android的UI性能优化

    设计师,开发人员,需求研究和测试都会影响到一个app最后的UI展示,所有人都很乐于去建议app应该怎么去展示UI.UI也是app和用户打交道的部分,直接对用户形成品牌意识,需要仔细的设计.无论你的ap ...

  4. Android中HashMap内存优化之ArrayMap和SparseArray

    ArrayMap及SparseArray是android的系统API,是专门为移动设备而定制的.用于在一定情况下取代HashMap而达到节省内存的目的. 在Android开发中HashMap使用频率相 ...

  5. android system ui修改,安卓SystemUI.apk文件的修改教程

    位于安卓/system/app目录下的SystemUI.apk文件中包含着安卓界面中的图标资源文件,我们可以通过修改替换其中的图片文件来达到美化系统界面的目的.下面是安卓后院(www.top139.c ...

  6. android system ui修改,【教程】一些有关于SystemUI修改的教程

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 1.状态栏显示运营商 找到这一段 加入 2.状态栏下拉时候万恶的日期显示隐藏 自己对比下,你就懂了,不好表述 3.状态栏时间居中:搜索clock 删除带有 ...

  7. ANDROID内存优化(大汇总——全)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 写在最前: 本文的思路主要借鉴了2014年AnDevCon开发者大会的一个演讲PPT,加上 ...

  8. Android内存优化汇总

    写在最前: 本文的思路主要借鉴了2014年AnDevCon开发者大会的一个演讲PPT,加上把网上搜集的各种内存零散知识点进行汇总.挑选.简化后整理而成. 所以我将本文定义为一个工具类的文章,如果你在A ...

  9. android开发内存优化的那些事儿

    一.Android应用程序内存优化   在开发Android App的过程中,经常会遇到内存方面的压力,比如OOM,或者频繁GC.本文不打算涵盖内存优化的所有方面,只是介绍一下我自己遇到的问题和解决方 ...

最新文章

  1. Java性能调优实践
  2. linux服务器出现黄,linux服务器出现严重故障后的原因以及解决方法
  3. 经典面试题(23):以下代码将输出的结果是什么?
  4. MySQL工作笔记-建表时为Float型数据确定精度,查询时精度显示,多列之和查询
  5. GoldenGate应用拓扑结构(三)
  6. 安卓机用久了仍会卡?来看看两年前的小米6
  7. SQL BASELINE修改固定执行计划
  8. RAC安装时,报The specified nodes are not clusterable 的解决方法
  9. 如何掌握mysql的查询语句_如何分析mysql的查询语句
  10. Quartz 表达式生成器
  11. Lua代码加密 LuaJit代码加密
  12. swagger分页查询报错500
  13. 「CSDN 征集」参与 CSDN 「Markdown」编辑器测评,即可有机会获取奖品哦
  14. 记录:前端框架Bootstrap学习使用之组件——Collapse(折叠)
  15. 计算机专业综合改革举措,数学与应用数学专业综合改革的举措数学论文(9页)-原创力文档...
  16. vgs、vgdisplay、vgscan 查看卷组
  17. linux ccid驱动下载,ccid驱动支持
  18. 算法导论-动态规划(钢条切割问题)
  19. cadence allegro 17.2中的正负片
  20. 在HBuilder创建前端web项目时,图片加载不出来,怎么解决?

热门文章

  1. Servlet3.0新特性
  2. 计算机包括桌面计算机和便携式计算机,()计算机包括桌面计算机和便携式计算机这两种形式...
  3. mac使用的快捷方式
  4. 后处理安装_你所不了解的国六后处理
  5. Eclipse搭建SpringCloud+SSM+Maven项目
  6. linux网络批量安装上限,linux基于网络的批量安装
  7. 软考高项之各大管理计划内容-攻坚记忆
  8. Java编程思想 第十章:内部类
  9. 全国计算机在线做题,2020全国一级计算机基础及MS Office应用考试在线自测试题库(不限设备,登陆即可做题)...
  10. 在Linux里安装和启动nginx的方法