Android中对app应用内存的分配

在Android运行机制里面, 不同分辨率不同RAM大小的设备当然会被分配不同的运行内存.高分辨率的设备也肯定比更低分辨率设备需要更多的内存.具体分配多少,可以通过查看自己设备当中/system/build.prop 文件,里面有说明.下面以小米2s为例:

dalvik.vm.heapsize = 256m  
dalvik.vm.heapstartsize = 8m    
dalvik.vm.heapgrowthlimit= 70m 
其中eapgrowthlimit   是一个普通应用的内存限制   ,这个值 可以 通过ActivityManager.getLargeMemoryClass()  方法得到.

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时就看成低内存运行");
    }
准确的说话是 google原生OS的默认值是16M,但是各个厂家的OS会对这个值进行修改。

优秀的应用都应该对内存有合理清晰的分配,而不是随意的去新建对象,不断打开页面也不关闭旧的页面, 或者大量的做资源缓存等等的操作.及时的释放内存,并且在缓存一些图片资源前通过类似getLargeMemoryClass()的方法去提前获知应用可用最大内存,从而合理地预设缓存大小,才能有效的避免OOM问题.

最近在使用Picasso加载图片时,发现在加载大图时内存消耗特别大.正在尝试二次封装.


你可能感兴趣的:(Android)