【Anroid高级】查看手机及应用内存状况的方法

我 们知道,android程序内存一般限制在16M,当然也有24M的,而android程序内存被分为2部分:native和dalvik,dalvik 就是我们平常说的java堆,我们创建的对象是在这里面分配的,而bitmap是直接在native上分配的,对于内存的限制是 native+dalvik 不能超过最大限制。

1.单个app 内存限制大小

[java] view plaincopy

  1. ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
  2. 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

totalMemory()

freeMemory()

maxMemory()

7.VMRuntime

getTargetHeapUtilization()

getMinimumHeapSize()

getExternalBytesAllocated()   应该是外部分配的内存Native内存

8.GC_EXTERNAL_ALLOC
freed 与 GC_EXPLICIT freed 是什么?

系统GC释放的内存提示

一般在LOG里面显示如下:

09-28 17:16:37.543: DEBUG/dalvikvm(21466): GC_EXTERNAL_ALLOC freed 390 objects /
45656 bytes in 50ms

09-28 17:16:40.513: DEBUG/dalvikvm(3267): GC_EXPLICIT freed 4501 objects / 251624 bytes in 67ms

EXPLICIT:Free的内存是VM中java使用的内存
即 heap mem

EXTERNA:Free的内存是VM中通过JNI的Native类中的malloc分配的内存
例如 Bitmap 和一些 Cursor

在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);
时间: 2024-08-02 21:29:46

【Anroid高级】查看手机及应用内存状况的方法的相关文章

Java内存状况查看方法和分析工具

Java本身提供了多种丰富的方法和工具来帮助开发人员查看和分析GC及其JVM内存的状况,同时开源界也有一些工具用于查看和分析GC和JVM内存的状况. 通过这些分析,可以排查程序中内存泄露的问题及调优程序的性能. 1.输出GC日志 输出GC日志对于跟踪分析GC的状况来说,无疑是最直接的分析内存回收状态的方法,只是输出之后需要人为的去分析,来判断GC的状况. JVM支持将日志输出到控制台和指定的文件中,方法如下: a>输出到控制台 在JVM的启动参数中加入-XX:+PrintGC -XX:+Prin

JVM内存状况查看方法和分析工具

jinfo:可以输出并修改运行时的java 进程的opts. jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号. jstat:一个极强的监视VM内存工具.可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量. jmap:打印出某个java进程(使用pid)内存内的所有'对象'的情况(如:产生那些对象,及其数量). jconsole:一个java GUI监视工具,可以以图表化的形式显示各种数据.并可通过远程连接监视远程的服务器V

ADB——查看手机设备信息

查看设备信息 查看手机型号 adb shell getprop ro.product.model 查看电池状况 adb shell dumpsys battery ''' Current Battery Service state: AC powered: false USB powered: true Wireless powered: false status: 2 health: 2 present: true level: 44 scale: 100 voltage: 3872 temp

Unity3D技术之Android 脚本高级 Unity 手机脚本

欢迎来到unity学习.unity培训.unity企业培训教育专区,这里有很多U3D资源.U3D培训视频.U3D教程.U3D常见问题.U3D项目源码,我们致力于打造业内unity3d培训.学习第一品牌. 高级 Unity 手机脚本 设备属性 您可以访问一系列特定设备的属性:     SystemInfo.deviceUniqueIdentifier 唯一的设备标识. SystemInfo.deviceName 用户指定的设备名称. SystemInfo.deviceModel 设备型号. Sys

Linux下查看操作系统信息、内存情况及cpu信息:cpu个数、核心数、线程数

文章转载:http://blog.snsgou.com/post-793.html 1.查看物理CPU的个数 [[email protected] ~]# cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l1 2.查看逻辑CPU的个数 [[email protected] ~]# cat /proc/cpuinfo |grep "processor"|wc -l4 3.查看CPU是几核(即,核心数) [[em

获取iOS设备的内存状况(转)

转载自:http://mobile.51cto.com/iphone-285371.htm iPhone这类移动设备内存有限,而又不能使用交换区,为了不至于导致内存不足而引起运行效率降低或应用崩溃,有时候需要获取当前的内存状况,以决定采用的缓存策略. AD:2014WOT全球软件技术峰会北京站 课程视频发布 由于iPhone这类移动设备内存有限,而又不能使用交换区,为了不至于导致内存不足而引起运行效率降低或应用崩溃,有时候需要获取当前的内存状况,以决定采用的缓存策略. 不过iOS SDK文档里并

发现一个好用的Android文件访问工具--es文件管理器,可以在同局域网下的浏览器中查看手机中的文件

如题,发现一个好用的Android文件访问工具--es文件管理器,可以在同局域网下的浏览器中查看手机中的文件 1.在手机上打开es文件管理器的远程管理器,如图:                   2.保证手机和电脑在同一个局域网下(有线或者Wifi都可以) 贴一下我的地址: (1)我电脑的IP地址(有线宽带连接): (2)手机的地址(Wifi): 3.在别的手机或者电脑上打开上面的Url(我的是:ftp://192.168.1.115:3721/),打开后就是这样的: 3. 看一下刚才在手机上

MSVC查看类的对象内存布局

虽说自己对内存对象内存布局这一块还算比较熟悉(鄙人这么认为),但是实际要可视化一个内存布局,还是没做过,今天在网上瞎逛,突然发现了MSVC居然支持输出对象的布局结构,这个命令嘛,就是-d1reportSingleClassLayout和-d1reportAllClassLayout了. 顾名思义,前者用于输出指定名字的类的结构,后者则是输出全部的类的结构,试了下后面的命令,发现按下Enter键后,留给鄙人的不是这个文件所得对应的类的内存结构,而是将近几秒的刷屏.....所以还是-d1report

在Eclipse的DDMS中查看手机data文件夹中的内容

在模拟器状态下,在Eclipse的DDMS中的File Explorer下查看手机data/data中的内容是件非常轻松的事情,特别是查看databases 但是在真机模式下就全然不是那么一回事了,在DDMS中的data文件夹无法展开,why? 解决方法: 1.手机获取ROOT权限: 2.更改文件夹权限,获取文件夹读写权限: 传统模式: 1.打开运行,在命令行下键入cmd (我们假设你使用的window系统) 2.再键入adb shell(什么?你的竟然提示“不是内部或外部命令,也不是可运行的程