在Android L系统之前所有Android版本的APP都采用Dalvik方式运行,也就是说每个Android APP在运行时会启动一个Dalvik虚拟机,并且系统会给它分配固定的内存空间(手机厂商会根据手机的配置情况来对其进行调整)。
我们可以使用如下的几种方法查看Android系统为Dalvik分配的内存大小。
在build.prop中有关于Dalvik内存配置的代码,例如:
dalvik.vm.heapstartsize=8mdalvik.vm.heapgrowthlimit=192mdalvik.vm.heapsize=512m dalvik.vm.heapstartsize=8m 相当于虚拟机的 -Xms配置,该项用来设置堆内存的初始大小。dalvik.vm.heapgrowthlimit=192m 相当于虚拟机的 -XX:HeapGrowthLimit配置,该项用来设置一个标准的应用的最大堆内存大小。一个标准的应用就是没有使用android:largeHeap的应用。dalvik.vm.heapsize=512m 相当于虚拟机的 -Xmx配置,该项设置了使用android:largeHeap的应用的最大堆内存大小。既然dalvik内存大小是系统分配的,那么我们能否申请到比标准应用更多的内存呢?在Honeycomb中新增的android:largeHeap="true"标记只需要在AndroidManifest.xml中的Application节点中声明即可分配到更大的堆内存。
我们知道在Android系统里有些特殊的权限只能供system应用使用,在系统为每个dalvik都初始分配同样内存大小的情况下,使用android:largeHeap申请更多的内存大小确实是够特殊的了。然而答案是否认的,我们确实只需要简单的在application元素上加入android:largeHeap="true"就能正常使用了。
既然使用android:largeHeap="true"不需要特殊的权限,我们好像不用就白不用。多一点内存,就少了一点OutOfMemoryError的风险。这样只是治标不治本,也只是延迟了一下OOM的出现而已,我们应该从代码本身去查找,从根本上解决问题。 所以在开发的时候,建议先不要使用android:largeHeap="true",如果是占用内存较大的应用,比如我们在机顶盒上开发的视频播放器应用,显示的图片都较大,而且播放视频本身也比较消耗内存,所以在应用开发完成,测试通过发布时再加上android:largeHeap="true"。