Android性能之内存基础篇(二)

原创 2015年11月20日 19:42:54

上一篇我们大概认识了安卓查看内存的一般方法,并对安卓内存有了一个简单的认识,这一篇我们将会对安卓内部关于内存的相关基础知识做一个总结


概要:

1.native内存和heap内存

2.安卓为什么会oom

3.low memory kill机制了解

4.学会查看ram内存以及进程内存(命令及解析)

5.开发中可以避免的问题点


1.native内存和heap内存

那么android中内存分为两块,一个是native内存,是lib层c/才++库所占用的内存;还有一个heap内存,是java实例对象的空间。
在3.0以前,bitmap是分配在native内存当中的,3.0以后都是分配在heap空间的,所以会有我们说的因为图片导致的oom现象,bitmap的优化点,后面会说到。
怎么查看native和heap内存呢,万能DDMS直接可以读到,当然命令dumpsys meminfo也是可以看到的。


2.安卓为什么会oom

首先要明白,oom和ram空闲内存是两回事,因为一个app所申请的内存是有限的,不可能一个app就占用全部的ram。
然后heapsize是分配的,可以在/system/prop.build文件看到,也可以getprop | grep 'heap'查到
这里重点关注下面几个参数:

[dalvik.vm.heapgrowthlimit]: [128m]             -----一般情况app申请的最大内存                                  
[dalvik.vm.heapmaxfree]: [8m]                      ----- GC机制相关,有文章:http://blog.csdn.net/oujunli/article/details/12649017                       
[dalvik.vm.heapminfree]: [512k]                      ----同上              
[dalvik.vm.heapsize]: [384m]                          -------最大的内存,配置文件设置android:largeheap="true"之后就可以用这个                       
[dalvik.vm.heapstartsize]: [8m]   ----起始分配内存
[dalvik.vm.heaptargetutilization]: [0.75]  -----GC相关

了解参数后,oom的原因就知道了,当超过heapgrowthlimit值,安卓系统就会oom,所以一般做内存测试要先看系统分配的最大值heapgrowthlimit或者heapsize,然后进一步
分析。


3.Low Memory Kill机制了解

这玩意是放在kernel的一个安卓特有的专用驱动,负责的是杀进程,oom负责的是进程的自杀,两者不一样的。
这个就简单了,当ram不足的时候,会触发这个机制,至于干掉哪个进程:
表面来说,进程有5个等级,更具等级优先级来干掉 前台进程>可见进程>服务进程>后台进程>空进程最后面那个越容易die
深层来说,进程等级直接反应在文件就是oom_adj的值,值越大越容易被杀,这个值可以在/proc/[pid]/oom_adj看到,注意的是
zygote进程是-16,基本不死的,系统进程也在-12左右,想要你的进程常驻内存,可以在配置文件设置android:persistent,提高oom_adj的值。

4.工具命令查看内存

首先来看一个工具procrank,这个工具可以方便地显示各个进程的内存状况,用的时候需要cp文件到手机内
1.mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system
2.libpagemap.so复制到/system/lib     procmem和Procrank复制到/system/xbin下面 然后chmod 777这两个文件
操做完之后就可以在adb直接调用procrank命令了。


上面几个参数前面介绍过了,就不多说了。

接下来介绍查看应用剩余的RAM,直接cat /proc/meminfo即可
然后,看某个进程内存:dumpsys meminfo [packageName]
这部分解释看这篇文章:http://my.oschina.net/shaorongjie/blog/128442  不重复写了


5.开发中可以避免的问题点

这里将会列出来代码中容易引起内存泄露的地方
1.Cursor没有关闭
2.IO流没有关闭
3.adapter的contentView没有复用
4.Bitmap没有回收 Bitmap没有设置option属性 RGB_656颜色值
5.滥用static
版权声明:本文为博主原创文章,转载请说明出处!

与dalvik GC相关的属性详解

在dalvik中,GC的类型有三种: 1、GC_EXPLICIT:     应用主动调用System.gc()产生的GC事件。 2、GC_FOR_ALLOC:     内存分配时,发现...
  • oujunli
  • oujunli
  • 2013年10月12日 11:56
  • 20808

Android Dalvik虚拟机内存分配问题

之前遇到一个图片加载不出来的问题,在
  • goodlixueyong
  • goodlixueyong
  • 2014年11月02日 22:24
  • 13438

Android问题—Bitmap引起的OOM问题的解决办法

1.什么是OOM?为什么会引起OOM? 答:Out Of Memory(内存溢出),我们都知道Android系统会为每个APP分配一个独立的工作空间, 或者说分配一个单独的Dalvik虚拟机,这样每...
  • u012758088
  • u012758088
  • 2017年04月12日 17:56
  • 239

[Android] 最全内存分析—2016年10月9日

转载请注明出处管理 App 的内存随机存取存储器(RAM)是在任何软件开发环境的宝贵资源,它更在物理存储器常常受限的移动操作系统中大放异彩。尽管 Android 的 Dalvik 虚拟机执行日常垃圾收...
  • gyjyywc
  • gyjyywc
  • 2016年10月09日 02:21
  • 411

Android内存管理机制详解

与windows内存区别         在Linux中经常发现空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实不然。这是Linux内存管理的一个优秀特性,在这方面,区别于 ...
  • chaihuasong
  • chaihuasong
  • 2012年12月13日 10:37
  • 66475

Android中如何查看内存

////////////////////////////////////////////////////////////////////////////////////////////////////...
  • oldmtn
  • oldmtn
  • 2013年07月01日 12:15
  • 5436

android dalvic 虚拟机内存参数

dalvik.vm.heapstartsize        堆分配的初始大小,调整这个值会影响到应用的流畅性和整体ram消耗。这个值越小,系统ram消耗越慢,但是由于初始值较小,一些较大的应用...
  • u014313623
  • u014313623
  • 2017年09月19日 10:28
  • 204

android dalvik heap 浅析

详解android vm heap的三个参数,源码中跟着largeheap的流程,以及简要分析dalvik堆分配的策略。...
  • cqupt_chen
  • cqupt_chen
  • 2013年09月04日 16:40
  • 29565

Android 内存管理 &Memory Leak & OOM 分析

1、Android 进程管理&内存 Android主要应用在嵌入式设备当中,而嵌入式设备由于一些众所周知的条件限制,通常都不会有很高的配置,特别是内存是比较有限的。如果我们编写的代 码当中有太多的对内...
  • vshuang
  • vshuang
  • 2014年09月28日 21:27
  • 28339

android heapStartSize heapMaximumSize heapGrowthLimit heapSize说明

dalvik/vm/Globals.java代码片段: struct DvmGlobals {     /*      * Some options from the command line o...
  • gemmem
  • gemmem
  • 2013年09月25日 12:07
  • 7205
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android性能之内存基础篇(二)
举报原因:
原因补充:

(最多只允许输入30个字)