当加载带有大量图片的列表时,通常我们都要考虑到图片达到一定上限时,内存不足引发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堆配置的三个属性
:
- dalvik.vm.heapstartsize=8m:表示应用程序启动后,系统为其分配的初始大小。
- dalvik.vm.heapgrowthlimit=64m:单个应用程序被分配的最大可用内存,即内存阀值。当应用程序的内存使用量超过这个阀值,就会引起OOM。
- dalvik.vm.heapsize=256m:单个虚拟机可分配的最大内存。(每个应用程序都是在单个虚拟器中运行,为了避免单个进程崩溃导致整个系统的崩溃)单个应用可用最大内存以heapgrowlimit为准,如果想申请更大的内存,可以在manifest.xml的application标签中指定android:largeHeap为true,这样dvm
heap最大可以达到heapsize,但如果内存使用量也超过了该值,同样会引起OOM发生。
关于这几个属性的更全面的阐述移步: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”图标,那么右侧面板会显示当前进程的内存使用情况。
- Heap Size:当前应用程序所占用的堆内存大小(Heap Size = Allocated +Free)
- Allocated:表示当前活跃对象占用的内存大小
- Free:表示系统通过gc操作释放了多少内存
- % Used:当前内存的使用比例(= Allocated/Heap Size)
在上一篇实现一个最简单图片列表引发的问题 里,实现了一个图片列表,当我们不断滑动列表去进行图片加载时时候,在DDMS中观察到Heap
Size的大小并不是保持在一个合理的范围,而是持续上升的,当达到最大内存使用上限比如64m的时候,程序就出现了OOM。
可以通过亲测程序去观察下这些参数的变化。
参考:
Android 内存管理 &Memory Leak & OOM 分析
版权声明:本文为博主原创文章,未经博主允许不得转载。