在Android L系统之前所有Android版本的APP都采用Dalvik方式运行,也就是说每个Android APP在运行时会启动一个Dalvik虚拟机,并且系统会给它分配固定的内存空间(手机厂商会根据手机的配置情况来对其进行调整)。

如何获取Dalvik初始分配的内存大小

我们可以使用如下的几种方法查看Android系统为Dalvik分配的内存大小。

方法一:使用ActivityManager

  • ActivityManager的getMemoryClass()获得内用正常情况下内存的大小
  • ActivityManager的getLargeMemoryClass()可以获得开启largeHeap最大的内存大小
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
activityManager.getMemoryClass();
activityManager.getLargeMemoryClass();

方法二:直接查看/system/build.prop文件

在build.prop中有关于Dalvik内存配置的代码,例如:

dalvik.vm.heapstartsize=8m
dalvik.vm.heapgrowthlimit=192m
dalvik.vm.heapsize=512m
  • dalvik.vm.heapstartsize=8m 相当于虚拟机的 -Xms配置,该项用来设置堆内存的初始大小。
  • dalvik.vm.heapgrowthlimit=192m 相当于虚拟机的 -XX:HeapGrowthLimit配置,该项用来设置一个标准的应用的最大堆内存大小。一个标准的应用就是没有使用android:largeHeap的应用。
  • dalvik.vm.heapsize=512m 相当于虚拟机的 -Xmx配置,该项设置了使用android:largeHeap的应用的最大堆内存大小。

方法三:使用adb查看

  • adb shell getprop|grep dalvik.vm.heapstartsize 应用启动后分配的初始内存
  • adb shell getprop|grep heapgrowthlimit 单个标准应用程序最大内存限制(没设置android:largeHeap)
  • adb shell getprop|grep dalvik.vm.heapsize 单个dalvik虚拟机最大的内存限制(设置了android:largeHeap)

能否改变dalvik默认分配的大小

既然dalvik内存大小是系统分配的,那么我们能否申请到比标准应用更多的内存呢?在Honeycomb中新增的android:largeHeap="true"标记只需要在AndroidManifest.xml中的Application节点中声明即可分配到更大的堆内存。

使用android:largeHeap是否需要系统权限

我们知道在Android系统里有些特殊的权限只能供system应用使用,在系统为每个dalvik都初始分配同样内存大小的情况下,使用android:largeHeap申请更多的内存大小确实是够特殊的了。然而答案是否认的,我们确实只需要简单的在application元素上加入android:largeHeap="true"就能正常使用了。

使用android:largeHeap的建议

既然使用android:largeHeap="true"不需要特殊的权限,我们好像不用就白不用。多一点内存,就少了一点OutOfMemoryError的风险。这样只是治标不治本,也只是延迟了一下OOM的出现而已,我们应该从代码本身去查找,从根本上解决问题。
所以在开发的时候,建议先不要使用android:largeHeap="true",如果是占用内存较大的应用,比如我们在机顶盒上开发的视频播放器应用,显示的图片都较大,而且播放视频本身也比较消耗内存,所以在应用开发完成,测试通过发布时再加上android:largeHeap="true"