标签:oom 可以使用的最大内存 heapsize 内存使用情况
当加载带有大量图片的列表时,通常我们都要考虑到图片达到一定上限时,内存不足引发OOM导致程序崩溃的问题。下一步也许就是去找个图片加载开源框架来一劳永逸。OOM不急着解决,先来了解下关于程序可用内存的一丢丢知识。在面对OOM的时候,你有没有想过这些:
1.什么是OOM
OOM都知道是Out Of Memory的缩写也就是内存溢出,通俗点说就是内存用完了。
2.为什么会OOM
内存使用超过上限导致了内存溢出。例如内存泄露,当程序运行过程中动态申请的内存空间不再使用但是又没有及时释放,从而导致应用程序内存持续增长,直到超过内存上限导致程序结束。
3.内存上限怎么查看?每个应用最大能够使用的内存大小都一致吗?如何去查看当前运行应用的内存使用情况?
这些就是接下来要说明的问题。是了解内存使用的开始。
“我们都知道Android是个多任务操作系统,同时运行着很多程序,都需要分配内存,不可能为一个程序分配越来越多的内存以至于让整个系统 都崩溃,因此heap的大小有个硬性的限制,跟设备相关,从发展来说也是越来越大,G1:16MB,Droid:24MB,Nexus One:32MB,Xoom:48MB,但是一旦超出了这个使用的范围,OOM便产生了”
类似的描述在很多关于内存相关的blog都很容易看到。那么问题来了,
一、一个程序被分配的内存大小怎么查看?
1.先来了解dalvik堆配置的三个属性 :
关于这几个属性的更全面的阐述移步:android dalvik heap 浅析和Android 内存管理 &Memory Leak & OOM 分析
2.程序可使用最大内存的查看方法
接下来了解下查看/获取heapgrowthlimit和heapsize值的两种方法:
第一种可以用文件管理器打开手机中的system/build.prop文件,这里配置dalvik虚拟机的一些属性:
看到红色框框中熟悉的字眼是不是倍感亲切。这个文件是可编辑的。从这里也可以知道,不同设备,这些值可以是不一样的。“厂家针对设备的配置情况都会适当地修改/system/build.prop文件来调高这个值”。
第二种方法可以通过代码来获取内存阀值:
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); //可用堆内存,单个应用可以使用的最大内存,如果应用内存使用超过这个值,就报OOM int heapgrowthlimit = manager.getMemoryClass(); //进程内存空间分配的最大值,表示的是单个虚拟机可用的最大内存 int heapsize = manager.getLargeMemoryClass(); L.d("heapgrowthlimit = "+heapgrowthlimit+"m"+", heapsize = "+heapsize+"");
了解了一个应用程序最大可使用内存的真面目后,来看看:
二、如何查看运行时内存的使用情况?
可以借助DDMS中提供的内存监测工具Heap,来监测一个进程的内存变化:
在左面板选中当前运行程序的进程,然后点击“Update Heap”图标,那么右侧面板会显示当前进程的内存使用情况。
参考:
Android 内存管理 &Memory Leak & OOM 分析
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:oom 可以使用的最大内存 heapsize 内存使用情况
原文地址:http://blog.csdn.net/aliaooooo/article/details/46999675