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:     内存分配时,发现...

AndroidManifest总结

一、AndroidManifest的文件 当创建工程时,一般情况下IDE都会自动在该工程的根目录下创建AndroidManifest的文件,而当编译工程打包apk时,该文件会一起被打包成apk,而这个...
  • tscyds
  • tscyds
  • 2015-08-15 17:59
  • 2054

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

Android开发————分析Native层内存泄漏

Android开发——使用DDMS分析Native层内存泄漏针对Java层的内存泄漏,Android提供了方便的内存泄漏检测工具,例如MAT、LeakCanary。但对于native层开发,要追查C/...

使用DDMS中的native heap检查Android native内存泄露

ddms native heap

DDMS调试native heap实战

第一步:setprop libc.debug.malloc 1。这里有四种prop可以设置,1是mem leak,5和10是内存越界,20是虚拟机。可悲的是5和10并没有被libc_malloc_de...

Android 关于使用LruCache缓存你想缓存的数据

又是好久没写博客。。 今天我们来一起学习一下缓存技术,相信大家做开发的时候都知道请求网络数据的重要,但是有一些只用请求一次就过时性的消息比如某些新闻信息,如果我们每次进入新闻界面就从新从网络上获取势...

Android 异步加载图片,使用LruCache和SD卡或手机缓存,效果非常的流畅

异步加载图片的例子,网上也比较多,大部分用了HashMap> imageCache ,但是现在已经不再推荐使用这种方式了,因为从 Android 2.3 (API Level 9)开始,垃圾回收器会更...

使用堆外内存

使用堆外内存 有时候对内存进行大对象的读写,会引起JVM长时间的停顿,有时候则是希望最大程度地提高JVM的效率,我们需要自己来管理内存(看起来很像是Java像C++祖宗的妥协吧)。据...

关于largeHeap属性

最近在研究一个项目,但是项目中用的图片和APP的运行内存远远大于Android指定的16M运行内存大小。 然后小白就问了各路大神如何防止APP OOM错误。 于是一群内大神给了我一条明路。 <a...

Android性能优化——如何避免OOM总结

如何避免Android产生OOM总结:本文将从四个方面着手: 1、首先是减小对象的内存占用; 2、其次是内存对象的重复利用; 3、然后是避免对象的内存泄露; 4、最后是内存使用策略优化。
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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