【Android先进】查看手机记忆库状态和应用方法
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()
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
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;// 用户IDint 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();}}}// beginIndexint begin = content.indexOf(':');// endIndexint 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;// 得到ActivityManagerActivityManager 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);
某个进程准确的使用好多内存实际上是非常难统计的。
应该指使用C\C++在堆上分配的
内存。
网上又说是
比例分配共享库占用的内存。那么至于这里的共享是否仅仅是库的共享,还是不清楚。
static long getNativeHeapFreeSize()
static long getNativeHeapSize()
在该命令的后面要加上进程的名字。以确定是哪个进程。
, "allocated" 表示的是已使用了的内存大小(kb),, "free"表示的是剩余的内存大小(kb), 很多其它的能够參照
方式三和方式四中的描写叙述
为什么呢?这是由于
procrank 命令和meminfo命令使用的内核机制不太一样,所以结果会有细微区别
可是如今得到的关于它们的意义的解释却不太同样。难道这里Private的都是dirty(这里指不能换页)? Puzzle!
当内存紧张时。the Android out of memory killer将杀死一些
background进程。以避免他们消耗过多的cached RAM ,当然假设下次再用到他们,就须要paging. 那么是说background进程的内存包括在该项中吗?
实例1
int cnt=0;
final static int kBufferMinSize=1000;
final static int kBufferMaxSize=2000;
StringBuffer strBuffer=new StringBuffer(kBufferMinSize);
StringBuffer strBuffer2=new StringBuffer(kBufferMinSize);
StringBuffer strBuffer3=new StringBuffer(kBufferMinSize);
StringBuffer strBufferNativePss=new StringBuffer(kBufferMinSize);
StringBuffer strBufferDalvikPss=new StringBuffer(kBufferMinSize);
StringBuffer strBufferOtherPss=new StringBuffer(kBufferMinSize);
Debug.MemoryInfo memoryInfo=new Debug.MemoryInfo();
final static String tag="robin";
void printMemory()
{
long totalMemory=Runtime.getRuntime().totalMemory();
long freeMemory=Runtime.getRuntime().freeMemory();
long usedMemory=(totalMemory-freeMemory)>>10;
totalMemory=totalMemory>>10;
freeMemory=freeMemory>>10;
if(strBuffer.length()>kBufferMaxSize)
{
strBuffer.delete(0,strBuffer.length());
strBuffer2.delete(0,strBuffer2.length());
strBuffer3.delete(0,strBuffer3.length());
strBufferNativePss.delete(0,strBufferNativePss.length());
strBufferDalvikPss.delete(0,strBufferDalvikPss.length());
}
strBuffer.append(usedMemory+",");
strBuffer2.append(totalMemory+",");
strBuffer3.append((Debug.getNativeHeapSize()>>10)+",");
Debug.getMemoryInfo(memoryInfo);
strBufferNativePss.append((memoryInfo.nativePss)+",");
strBufferDalvikPss.append((memoryInfo.dalvikPss)+",");
if(cnt++==0)
{
Log.i(tag,"usedMemory:"+strBuffer.toString());
Log.i(tag,"totalMemory:"+strBuffer2.toString());
Log.i(tag,"NativeHeapSize:"+strBuffer3.toString());
Log.i(tag,"Native PSS:"+strBufferNativePss.toString());
Log.i(tag,"Dalvik PSS:"+strBufferDalvikPss.toString());
}
}
版权声明:本文博主原创文章,博客,未经同意不得转载。
【Android先进】查看手机记忆库状态和应用方法相关推荐
- android service 休眠,保持Android Service在手机休眠后继续运行的方法
最近项目中用到了service进行计时,在连接USB的情况下一切正常,但是拔掉USB后发现,手机进入休眠后service停止了工作.最后通过 PowerManager.WakeLock 在屏幕休眠后保 ...
- android获取录音读写权限设置,Android编程检测手机录音权限是否打开的方法
本文实例讲述了Android编程检测手机录音权限是否打开的方法.分享给大家供大家参考,具体如下: 6.0之前的权限检测只是检测到是否在清单文件中注册 Boolean flag = (PackageMa ...
- android 录音权限 代码打开,Android编程检测手机录音权限是否打开的方法
本文实例讲述了Android编程检测手机录音权限是否打开的方法.分享给大家供大家参考,具体如下: 6.0之前的权限检测只是检测到是否在清单文件中注册 Boolean flag = (PackageMa ...
- 如何查看手机型号,最好的查询方法
在琢石模拟器的网站上,有一个非常实用而且强大的系统信息查询工具,能够帮我们查看手机的完整参数,让我们鉴别手机真伪跟判断手机参数是不是跟说明书一致. 1.从 网站页面下面附件地址进入百度网盘中. 2.下 ...
- 【Android高级】查看手机及应用内存状况的方法
我 们知道,android程序内存一般限制在16M,当然也有24M的,而android程序内存被分为2部分:native和dalvik,dalvik 就是我们平常说的java堆,我们创建的对象是在这里 ...
- Android怎么查看手机中的本地数据库
我前几天做的项目中有本地数据库, 所以就 用的 SQLite,在调试数据库时,,很想看一下里面的表结构是否正确,这个时候就十分苦恼, 因为这个db文件不能够直接拿出来,我们知道,在DDMS里面有一个F ...
- Android 监听手机GPS打开状态
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/70854942 本文出自[赵彦军的博客] GPS_Presenter package ...
- android adb查看手机内存使用情况
1.查看设备节点内存adb shell df 2.查看磁盘内存和运行内存:adb shell free 3.查看内存详细数据adb shell cat /proc/meminfo MemTotal: ...
- Android studio 查看手机打印日志
Android studio 配置SDK Android studio 配置adb 点击 View -Tool Windows - Logcat 打开日志
最新文章
- 使用inetaddress测试目标可达性_白盒测试工具―Winams介绍
- HD 1003 Max Sum (最大字段和问题)
- 热点的ap频段哪个快_WLAN中无线AP信道的划分
- SpringBoot整合Redis 主从复制_01
- 大数据之Elasticsearch教程
- 网络图片 base64 java_java图片转base64和真实的结果不一样
- i386 Linux 系统调用
- Who is in me? -- Freeware on Windows
- BUUCTF刷题记录(持续更新中~)
- android 英语单词音标获取
- 硬件nat关闭还是开启_卡顿未必怪硬件,Win10玩游戏不可不知的技巧
- 出轨的是老公为什么要老婆做出改变
- iOS 5G网络判断
- OracleP6机场工程进度控制系列15:总进度综合管控报告
- 2.04 标志寄存器
- 广州市越秀区2021-2022学年九年级第一学期期末考试英语试题
- 万年历c语言攀枝花,C语言实现万年历
- OpenLayers加载谷歌地球离线瓦片地图
- GOM引擎传奇中增加会员时间的脚本教程分享
- 使用Sublime Text+SumatraPDF轻松写论文
热门文章
- linux安装mysql5.6.14_(四)Zabbix_linux安装mysql5.6
- 用c语言编辑一个通讯录,C语言实现一个通讯录
- 模糊神经网络_神经网络模型:当网络开始产生类似于人类思维的过程
- html5 white space,CSS white-space 属性
- js如何调用h5的日期控价_微信公众号支付H5调用支付解析
- 如何用计算机组添加打印机共享的打印机,工作组内打印机如何共享?
- linux如何判断网线插入_斜口钳和网线钳制作网线!
- oracle01507报错,oracle报错ORA-01507
- Struts 1基础入门
- 判断一个int数组中的元素是否存在重复