您的位置:首页 > 移动开发 > Android开发

【Android 很进阶】android OOM理解以及相关方法分析

2015-01-22 11:20 363 查看
相信很多做应用开发的朋友都遇到过OOM,也会认为会出现OOM是因为虚拟机的heap满了,再往里面放东西就会溢出。个人认为这说法只对了一半。

先了解以下概念:

android一个应用可理解为一个进程(单应用多进程的暂时不讨论),一个进程的内存是虚拟机heap内存+native内存。这两块内存是不重新分配,也就是一旦分配完成,即使heap有空闲的内卡可用,native也不能够使用。

所以我认为OOM是:当heap内存满了或者native内存满了就会出现。

只是native内存我们用得比较少,在Decode一张图片的时候使用以下option,那么得到的Bitmap占用的就是native内存。

BitmapFactory.Options options = new BitmapFactory.Options();

options.inPreferredConfig = Config.ARGB_8888;

options.inPurgeable = true;//允许可清除

options.inInputShareable = true;// 以上options的两个属性必须联合使用才会有效果

具体可阅读这位牛人的博客http://blog.csdn.net/weihan1314/article/details/8016759关于Decode 图片出现OOM的分析。声明下:以上代码来自这位牛人的博客,感谢。

接下来讨论一下RunTime.getRunTime()获取虚拟机heap内存的方法(返回单位是B):

1.RunTime.getRunTime().maxMemory(),获取系统可以分配给虚拟机的最大内存大小(从操纵系统那里挖到的最大的内存);

2.RunTime.getRunTime().totalMemory(),获取系统目前分配给虚拟机的内存大小(已经从操纵系统那里挖过来的内存)。这块内存会随着程序的运行而变化(在程序运行的过程中,应用总是慢慢的从操纵系统那里挖内存,基本上是用多少就挖多少,直挖到maxMemory()为止,所以totalMemory()基本上是慢慢增大的);

3.RunTime.getRunTime().freeMemory(),获取系统目前分配给虚拟机的可用内存大小(没有被使用的)。是系统分配给虚拟机,准备要运行某些东西的,暂时未被使用的(虚拟机在挖内存的时候,一般会稍微多挖一点的,这些挖过来而又没有用上的内存,实际上就是 freeMemory());

获取native内存的方法(返回单位是KB):

1.Debug.getNativeHeapSize(),获取Native内存大小;

2.Debug.getNativeHeapAllocatedSize(),获取已分配得到的内存大小;

3.Debug.getNativeHeapFreeSize(),获取空闲的内存大小;

但以上方法获取native内存得到的值都很小,是我理解错误还是使用不当,待研究。。。

补充一点:大量的递归或者死循环会导致stack栈满了则是出现StackOverflowError

以上仅是个人看法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: