ActivityManager:getMemoryClass()及getLargeMemoryClass()
1.作用:用于获取应用可以使用的最大内存。
2.源码:
public int getMemoryClass() {
return staticGetMemoryClass();
}
/** @hide */不对外暴露的方法
static public int staticGetMemoryClass() {
String vmHeapSize = SystemProperties.get("dalvik.vm.heapgrowthlimit", "");
if (vmHeapSize != null && !"".equals(vmHeapSize)) {
return Integer.parseInt(vmHeapSize.substring(0, vmHeapSize.length()-1));
}
return staticGetLargeMemoryClass();
}
public int getLargeMemoryClass() {
return staticGetLargeMemoryClass();
}
/** @hide */
static public int staticGetLargeMemoryClass() {
String vmHeapSize = SystemProperties.get("dalvik.vm.heapsize", "16m");
return Integer.parseInt(vmHeapSize.substring(0, vmHeapSize.length() - 1));
}
3.分析及说明
两个方法共同的功能是返回当前设备的每个应用程序使用内存的近似值。提供一个内存限制的界限,方便开发者可以再规定的内存限制内让应用运行的更好。
返回值以兆为单位;基线Android内存是16(这恰好是这些设备的java堆内存限制);更有些设备可能返回24或更高的数字。
两者区别在于:getMemoryClass()是系统为应用分配的内存,并没有额外的扩充;
而getLargeMemoryClass()是开发者通过设置manifest文件中的<application>标签中largeHeap属性的值为"true",获得应用可使用的最大内存;
但是作为开发者,建议不要配置manifest获取最大内存,这使得应用在扩展性方面有很大限制,建议优化内存已达到节省内存的目的。
SystemProperties:
String vmHeapSize = SystemProperties.get("dalvik.vm.heapgrowthlimit", "");
其中,SystemProperties是系统的属性,它可以通过get()/set()进行对系统的属性进行读/写。
从代码的角度看,两个方法的核心区别在于SystemProperties.get()中的参数
dalvik.vm.heapgrowthlimit:系统对应用的内存限制的值。
dalvik.vm.heapsize:系统可提供给应用的最大内存使用值(不顾其他进程的死活?)。
4.使用
ActivityManager mActivityManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
int memoryClass = am. getMemoryClass();
int largeMemoryClass = am. getLargeMemoryClass();