- <span style="font-family: Arial; background-color: rgb(255, 255, 255);">在Android运行机制里面, 不同分辨率不同RAM大小的设备当然会被分配不同的运行内存.高分辨率的设备也肯定比更低分辨率设备需要更多的内存.具体分配多少,可以通过查看自己设备当中/system/build.prop 文件,里面有说明.下面以小米2s为例:</span>
- dalvik.vm.heapsize = 256m
- <span style="font-family: Consolas, "Courier New", Courier, mono, serif; line-height: 18px;">dalvik.vm.heapstartsize = 8m </span>
- dalvik.vm.heapgrowthlimit= 70m
heapstartsize 是初始内存,应用随着使用,内存不断自动的增加,会慢慢达到上限的最大内存.
AndroidManifest.xml 的Application标签有个android:largeHeap="true" 属性,当设为true时,可以向设备申请更多内存, 默认为false.
- android:name=".BaseApplication"
- android:allowBackup="true"
- android:icon="@mipmap/ic_launcher"
- android:label="@string/app_name"
- android:largeHeap="true"
而这个就算设为true也不会无限量地分配,当达到一定的阀值依旧会报OOM错误.设置largeHeap的确可以增加内存的申请量。但不是系统有多少内存就可以申请多少,而是由dalvik.vm.heapsize限制。 因此Google官方并不推荐这个做,在开发时我们应该首先考虑的是如何降低内存或者减少内存的增量使用,而不是一味的去增加内存空间.
- private void getSystemMemory() {
- final ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
- ActivityManager.MemoryInfo info = new ActivityManager.MemoryInfo();
- activityManager.getMemoryInfo(info);
- Runtime rt=Runtime.getRuntime();
- long maxMemory=rt.maxMemory();
- L.e("maxMemory:"+Long.toString(maxMemory/(1024*1024)));
- L.e("系统剩余内存:" + (info.availMem >> 10)/1024 + "m");
- L.e("系统是否处于低内存运行:" + info.lowMemory);
- L.e("当系统剩余内存低于" + (info.threshold >>10)/1024+ "m时就看成低内存运行");
- }
优秀的应用都应该对内存有合理清晰的分配,而不是随意的去新建对象,不断打开页面也不关闭旧的页面, 或者大量的做资源缓存等等的操作.及时的释放内存,并且在缓存一些图片资源前通过类似getLargeMemoryClass()的方法去提前获知应用可用最大内存,从而合理地预设缓存大小,才能有效的避免OOM问题.