首页 > 代码库 > 【Anroid高级】查看手机及应用内存状况的方法
【Anroid高级】查看手机及应用内存状况的方法
1.单个app 内存限制大小
- ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
- activityManager.getMemoryClass();
2."/proc/meminfo" 系统内存信息文件【整个系统的内存情况】
Android获取手机总内存和可用内存
“/proc/meminfo”解析
3.ActivityManager.MemoryInfo【整个系统】
availMem 剩余内存
threshold 临界值 【超过次值就开始杀死后台服务和没有关联的进程】
lowMemory 低内存状态
4.android.os.Debug
getNativeHeapFreeSize()
getNativeHeapAllocatedSize()
getNativeHeapSize()
5.android.os.Debug.MemoryInfo【当前进程的内存情况】
6.Runtime
maxMemory()
7.VMRuntime
getTargetHeapUtilization()
getMinimumHeapSize()
getExternalBytesAllocated() 应该是外部分配的内存Native内存
8.GC_EXTERNAL_ALLOC freed 与 GC_EXPLICIT freed 是什么?
系统GC释放的内存提示
09-28 17:16:40.513: DEBUG/dalvikvm(3267): GC_EXPLICIT freed 4501 objects / 251624 bytes in 67ms
EXPLICIT:Free的内存是VM中java使用的内存 即 heap mem
在Davilk中,给一个程序分配的内存根据机型厂商的不同,而不同,现在的大部分的是32M了,而在VM内部会把这些内存分成java使用的内存和 Native使用的内存,它们之间是不能共享的,就是说当你的Native内存用完了,现在Java又有空闲的内存,这时Native会重新像VM申请,而不是直接使用java的。
例如上边的例子
explicit 3411K/6663K
external 24870K/26260K
如果这时需要创建一个2M的
Bitmap,
Native现有内存26260-24870=1390K<2048k,因此他就会向Vm申请内存,虽然java空闲的内存是
6663-3411=3252>2048,但这部分内存Native是不能使用。
但是你现在去申请2M的Native内存,VM会告诉你无法分配的,因为现在已使用的内存已经接近峰值了32M(26260+6663=32923 ),所以现在就会成force close 报OOM。
所以现在我们要检查我们的native内存的使用情况来避免OOM。
ps: http://stackoverflow.com/questions/2298208/how-to-discover-memory-usage-of-my-application-in-android#2299813
三、通过Android系统提供的Runtime类,执行adb 命令(top,procrank,ps...等命令)查询
内存耗用:VSS/RSS/PSS/USS
Terms
? VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
? RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)
? PSS - Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
? USS - Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)
一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS
查看每个进程及其内存状况
private void getRunningAppProcessInfo() { mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); // 获得系统里正在运行的所有进程 List<RunningAppProcessInfo> runningAppProcessesList = mActivityManager .getRunningAppProcesses(); for (RunningAppProcessInfo runningAppProcessInfo : runningAppProcessesList) { // 进程ID号 int pid = runningAppProcessInfo.pid; // 用户ID int uid = runningAppProcessInfo.uid; // 进程名 String processName = runningAppProcessInfo.processName; // 占用的内存 int[] pids = new int[] { pid }; Debug.MemoryInfo[] memoryInfo = mActivityManager .getProcessMemoryInfo(pids); int memorySize = memoryInfo[0].dalvikPrivateDirty; st = st + "processName=" + processName + ",pid=" + pid + ",uid=" + uid + ",memorySize=" + memorySize + "kb" + "\n"; System.out.println("processName=" + processName + ",pid=" + pid + ",uid=" + uid + ",memorySize=" + memorySize + "kb"); } }查看总内存:
public long getmem_TOLAL() { long mTotal; // /proc/meminfo读出的内核信息进行解释 String path = "/proc/meminfo"; String content = null; BufferedReader br = null; try { br = new BufferedReader(new FileReader(path), 8); String line; if ((line = br.readLine()) != null) { content = line; } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (br != null) { try { br.close(); } catch (IOException e) { e.printStackTrace(); } } } // beginIndex int begin = content.indexOf(':'); // endIndex int end = content.indexOf('k'); // 截取字符串信息 content = content.substring(begin + 1, end).trim(); mTotal = Integer.parseInt(content); return mTotal; }
查看内存信息(该api较新):
public long getmem_UNUSED(Context mContext) { long MEM_UNUSED; // 得到ActivityManager ActivityManager am = (ActivityManager) mContext .getSystemService(Context.ACTIVITY_SERVICE); // 创建ActivityManager.MemoryInfo对象 ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo(); am.getMemoryInfo(mi); textView3.setText("totalMen:" + mi.totalMem / 1024 + "\n" + "threshold:" + mi.threshold / 1024 + "\n" + "availMem:" + mi.availMem / 1024 + "\n"); // 取得剩余的内存空间 MEM_UNUSED = mi.availMem / 1024; return MEM_UNUSED; }查看app内存:
ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); int i=manager.getMemoryClass(); textView.setText("\n"+"app:"+i);
【Anroid高级】查看手机及应用内存状况的方法