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虚拟机Java堆创建过程分析

使用C/C++开发应用程序最令头痛的问题就是内存管理。慎不留神,要么内存泄漏,要么内存破坏。虚拟机要解决的问题之一就是帮助应用程序自动分配和释放内存。为了达到这个目的,虚拟机在启动的时候向操作系统申请...

与dalvik GC相关的属性详解

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

Android进程的内存管理分析

尊重原创作者,转载请注明出处: http://blog.csdn.net/gemmem/article/details/8920039 最近在网上看了不少Android内存管理方面的博文,但是文章大多...
  • gemmem
  • gemmem
  • 2013年05月13日 16:06
  • 28756

android dalvik heap 浅析

详解android vm heap的三个参数,源码中跟着largeheap的流程,以及简要分析dalvik堆分配的策略。...

Android Dalvik虚拟机内存分配问题

之前遇到一个图片加载不出来的问题,在

查看当前手机单个应用所能使用的最大内存

adb  shell  cat /system/build.prop 这个文件路径是 /system/build.prop ,由于文件比较大,这里我们只截取关于dalvik内存的配置信息,...

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

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

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
  • 6934

掌握OOM异常的处理,并可以对应用进行相应的优化

一、内存溢出如何产生的 Android的虚拟机是基于寄存器的Dalvik,它的最大堆大小一般是16M,有的机器为24M。因此我们所能利用的内存空间是有限的。如果我们的内存占用超过了一定的水平就会出现...

Android虚拟机(DVM)内存分配——内存溢出问题

大家都知道Android的上层应用是基于 Dalvik Virtual Machine的。Dalvik VM的特点是基于寄存器,相比SUN的JVM(基于堆栈,没有寄存器)来说,理论上完成同样的功能需要...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android性能之内存基础篇(二)
举报原因:
原因补充:

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