【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
以上仅是个人看法。
先了解以下概念:
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
以上仅是个人看法。
相关文章推荐
- android-进阶(3)-自定义view(2)-Android中View绘制流程以及相关方法的分析
- Android中View绘制流程以及invalidate()等相关方法分析
- Android中View绘制流程以及invalidate()等相关方法分析
- Android中View绘制流程以及invalidate()等相关方法分析
- Android中View绘制流程以及invalidate()等相关方法分析
- Android中View绘制流程以及invalidate()等相关方法分析
- Android中View绘制流程以及invalidate()等相关方法分析
- Android中View绘制流程以及invalidate()等相关方法分析
- Android中View绘制流程以及invalidate()等相关方法分析
- Android中View绘制流程以及invalidate()等相关方法分析
- Android中View绘制流程以及invalidate()等相关方法分析
- Android中View绘制流程以及invalidate()等相关方法分析
- Android View绘制流程以及invalidate()等相关方法分析
- Android中View绘制流程以及invalidate()等相关方法分析 .
- Android中View绘制流程以及invalidate()等相关方法分析
- Android中View绘制流程以及invalidate()等相关方法分析
- Android中View绘制流程以及invalidate()等相关方法分析
- Android中View绘制流程以及invalidate()等相关方法分析
- Android中View绘制流程以及invalidate()等相关方法分析
- Android中View绘制流程以及invalidate()等相关方法分析