介绍
内存是手机中最纠结的内容,特别是android手机,图片的OOM,甚至衍生到初始化界面都会Crash,内存成为开发最头痛的问题了,最简单的莫过于内存泄露了。Emmagee 虽然说不能够真正的监控到应用程序的内存泄露的问题。但是它已经将一些我们需要的基础的东西监控到了,不过真正用来监控应用工具还是使用android studio ,不过这些都是后话。
总内存
Emmagee获取内存的方式是读取 proc目录下的meminfo文件,我们看看meminfo内容:
1|root@android:/proc # cat meminfo
MemTotal: 364608 kB
MemFree: 31164 kB
Buffers: 15340 kB
Cached: 79620 kB
SwapCached: 0 kB
Active: 126356 kB
Inactive: 140748 kB
Active(anon): 83620 kB
Inactive(anon): 92060 kB
Active(file): 42736 kB
Inactive(file): 48688 kB
Unevictable: 352 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 8 kB
代码如下:
public long getTotalMemory() {
String memInfoPath = "/proc/meminfo";
String readTemp = "";
String memTotal = "";
long memory = 0;
try {
FileReader fr = new FileReader(memInfoPath);
BufferedReader localBufferedReader = new BufferedReader(fr, 8192);
while ((readTemp = localBufferedReader.readLine()) != null) {
if (readTemp.contains("MemTotal")) {
String[] total = readTemp.split(":");
memTotal = total[1].trim();
}
}
localBufferedReader.close();
String[] memKb = memTotal.split(" ");
memTotal = memKb[0].trim();
Log.d(LOG_TAG, "memTotal: " + memTotal);
memory = Long.parseLong(memTotal);
} catch (IOException e) {
Log.e(LOG_TAG, "IOException: " + e.getMessage());
}
return memory;
}
以上的代码实际上很简单的,通过字符串的分割查找到MemTotol的值而已。
剩余内存
ActivityManager.getMemoryInfo()主要是用于得到当前系统剩余内存的及判断是否处于低内存运行。
public long getFreeMemorySize(Context context) {
ActivityManager.MemoryInfo outInfo = new ActivityManager.MemoryInfo();
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
am.getMemoryInfo(outInfo);
long avaliMem = outInfo.availMem;
return avaliMem / 1024;
}
当前应用使用内存
当前应用使用的内存才是我们主要关注的值。获取当前进程内存的方式也同样是通过am的方式进行获取的。
public int getPidMemorySize(int pid, Context context) {
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
int[] myMempid = new int[] { pid };
Debug.MemoryInfo[] memoryInfo = am.getProcessMemoryInfo(myMempid);
memoryInfo[0].getTotalSharedDirty();
int memSize = memoryInfo[0].getTotalPss();
return memSize;
}
getProcessMemoryInfo:
获取每个进程ID(集合)占用的内存大小(集合), pid和MemoryInfo是一一对应的。