获取进程最大物理内存
http://androidxref.com/4.4.4_r1/xref/frameworks/base/core/java/android/app/ActivityManager.java
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
int totalMemoryM activityManager.getMemoryClass();
通过注释可以看出,返回的进程分配的最大物理内存,包含native heap 和java heap,单位是M,不同的手机可能不同。Bitmap在native heap分配。
/**
* Return the approximate per-application memory class of the current
* device. This gives you an idea of how hard a memory limit you should
* impose on your application to let the overall system work best. The
* returned value is in megabytes; the baseline Android memory class is
* 16 (which happens to be the Java heap limit of those devices); some
* device with more memory may return 24 or even higher numbers.
*/
public int getMemoryClass() {
return staticGetMemoryClass();
}
这个值的读取其实读取vm的配置参数dalvik.vm.heapgrowthlimit
或者dalvik.vm.heapsize
,前面介绍过:
/** @hide */
static public int staticGetMemoryClass() {
// Really brain dead right now -- just take this from the configured
// vm heap size, and assume it is in megabytes and thus ends with "m".
String vmHeapSize = SystemProperties.get("dalvik.vm.heapgrowthlimit", "");
if (vmHeapSize != null && !"".equals(vmHeapSize)) {
return Integer.parseInt(vmHeapSize.substring(0, vmHeapSize.length()-1));
}
return staticGetLargeMemoryClass();
}
/** @hide */
static public int staticGetLargeMemoryClass() {
// Really brain dead right now -- just take this from the configured
// vm heap size, and assume it is in megabytes and thus ends with "m".
String vmHeapSize = SystemProperties.get("dalvik.vm.heapsize", "16m");
return Integer.parseInt(vmHeapSize.substring(0, vmHeapSize.length()-1));
}
获取native相关内存信息
通过Debug类获取
http://androidxref.com/4.4.4_r1/xref/frameworks/base/core/java/android/os/Debug.java
getNativeHeapSize:获取native堆大小。
getNativeHeapAllocatedSize:获取native堆已占用的大小
getNativeHeapFreeSize:获取native堆可用的大小
/**
* Returns the size of the native heap.
* @return The size of the native heap in bytes.
*/
public static native long getNativeHeapSize();
/**
* Returns the amount of allocated memory in the native heap.
* @return The allocated size in bytes.
*/
public static native long getNativeHeapAllocatedSize();
/**
* Returns the amount of free memory in the native heap.
* @return The freed size in bytes.
*/
public static native long getNativeHeapFreeSize();
获取当前进程的内存情况
android.os.Debug.getMemoryInfo(MemoryInfo memoryInfo)
/**
* Retrieves information about this processes memory usages. This information is broken down by
* how much is in use by dalivk, the native heap, and everything else.
*/
public static native void getMemoryInfo(MemoryInfo memoryInfo);
获取系统的内存情况
ActivityManager.getMemoryInfo(MemoryInfo memoryInfo)
/**
* Return general information about the memory state of the system. This
* can be used to help decide how to manage your own memory, though note
* that polling is not recommended and
* {@link android.content.ComponentCallbacks2#onTrimMemory(int)
* ComponentCallbacks2.onTrimMemory(int)} is the preferred way to do this.
* Also see {@link #getMyMemoryState} for how to retrieve the current trim
* level of your process as needed, which gives a better hint for how to
* manage its memory.
*/
public void getMemoryInfo(MemoryInfo outInfo) {
try {
ActivityManagerNative.getDefault().getMemoryInfo(outInfo);
} catch (RemoteException e) {
}
}
从MemoryInfo可以获得到的内存信息:可用内存,总内存,内存阈值,是否低内存状态,以及一些其他的内存阈值
/**
* Information you can retrieve about the available memory through
* {@link ActivityManager#getMemoryInfo}.
*/
public static class MemoryInfo implements Parcelable {
/**
* The available memory on the system. This number should not
* be considered absolute: due to the nature of the kernel, a significant
* portion of this memory is actually in use and needed for the overall
* system to run well.
*/
public long availMem;
/**
* The total memory accessible by the kernel. This is basically the
* RAM size of the device, not including below-kernel fixed allocations
* like DMA buffers, RAM for the baseband CPU, etc.
*/
public long totalMem;
/**
* The threshold of {@link #availMem} at which we consider memory to be
* low and start killing background services and other non-extraneous
* processes.
*/
public long threshold;
/**
* Set to true if the system considers itself to currently be in a low
* memory situation.
*/
public boolean lowMemory;
/** @hide */
public long hiddenAppThreshold;
/** @hide */
public long secondaryServerThreshold;
/** @hide */
public long visibleAppThreshold;
/** @hide */
public long foregroundAppThreshold;
public MemoryInfo() {
}
//省略
}
如果通过上面的方法获取不到,请读取系统文件/proc/meminfo
获取
获取vm相关的使用率及最小堆大小
这些数据对GC有比较大的影响,可以调整HeapUtilization值
VMRuntime.getTargetHeapUtilization() ;
VMRuntime.getMinimumHeapSize();
VMRuntime.getExternalBytesAllocated();