Android 中查看内存的使用情况集常用adb命令

1. 在IDE中查看Log信息

当程序运行垃圾回收的时候,会打印一条Log信息,其格式如下:

D/dalvikvm: <GC_Reason> <Amount_freed>, <Heap_stats>, <External_memory_stats>, <Pause_time>

GC_Reason表示导致垃圾回收的原因以及当前的回收类型,包括以下几类:

GC_CONCURRENT:当堆中对象数量达到一定是触发的垃圾收集

GC_FOR_MALLOC:在内存已满的情况下分配内存,此时系统会暂停程序并回收内存

GC_HPROF_DUMP_HEAP:创建FPFOR文件来分析Heap时所造成的垃圾收集

GC_EXPLICIT: 程序调用了垃圾收集函数System.gc

GC_EXTERNAL_ALLOC: 出现在API 10及以下,为外部分配内存(native memory or NIO buffer)所造成的垃圾回收,高版本全部分配在Dalvik Heap中。

Amount_freed 表示此次回收的内存

Heap_stats 表示空闲内存百分比和存活对象大小/堆的总大小

External_memory_stats 表示API 10及以下的外部分配内存,已分配内存/导致垃圾回收的界限

Pause_time 暂停时间,一个表示开始回收垃圾的时间,另一个表示回收结束的暂停时间

D/dalvikvm( 9050): GC_CONCURRENT freed 2049K, 65% free 3571K/9991K, external 4703K/5261K, paused 2ms+2ms

注意这条信息中的 “ 3571K/9991K” 值,这代表着程序使用的heap大小。

2.使用DDMS

Eclipse中的DDMS提供了一个观察内存使用情况的GUI,当我们不断点击Cause GC时,就会看到当前程序的Heap,使用比较方便,具体用法可以Google一下。

3.使用adb dumpsys 命令

adb是一个非常强大的工具,使用adb查看应用程序内存使用情况可按如下格式在命令行里查看内存使用情况:

adb shell dumpsys meminfo <package_name>

其中,package_name 也可以换成程序的pid,pid可以通过 adb shell top | grep app_name 来查找,下图是某个程序的内存使用情况:

重点关注如下几个字段:

(1) Native/Dalvik 的 Heap 信息

具体在上面的第一行和第二行,它分别给出的是JNI层和Java层的内存分配情况,如果发现这个值一直增长,则代表程序可能出现了内存泄漏。

(2) Total 的 PSS 信息

这个值就是你的应用真正占据的内存大小,通过这个信息,你可以轻松判别手机中哪些程序占内存比较大了。

4. 使用adb shell procrank

手机中的sh是经过精简过的,有些手机可能没有 procrank 命令,可以使用genymotion模拟器,或是自己安装procrank命令。使用procrank时,命令行的输出入下图:

可以看到,在linux下表示内存的耗用情况有四种不同的表现形式:

VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)

RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)

PSS - Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)

USS - Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)

VSS:VSS表示一个进程可访问的全部内存地址空间的大小。这个大小包括了进程已经申请但尚未使用的内存空间。在实际中很少用这种方式来表示进程占用内存的情况,用它来表示单个进程的内存使用情况是不准确的。

RSS:表示一个进程在RAM中实际使用的空间地址大小,包括了全部共享库占用的内存,这种表示进程占用内存的情况也是不准确的。

PSS:表示一个进程在RAM中实际使用的空间地址大小,它按比例包含了共享库占用的内存。假如有3个进程使用同一个共享库,那么每个进程的PSS就包括了1/3大小的共享库内存。这种方式表示进程的内存使用情况较准确,但当只有一个进程使用共享库时,其情况和RSS一模一样。

USS:表示一个进程本身占用的内存空间大小,不包含其它任何成分,这是表示进程内存大小的最好方式!

可以看到:VSS>=RSS>=PSS>=USS

5.其它常用命令命令:

adb shell kill PIDNumber  死你想杀死的后台进程来模拟某种 bug 的复现条件。

adb shell ps  查看当前终端中的进程信息

那么如何在代码中判断当前的硬件系统有多少的 RAM 呢?在 Framework  ProcessList.java 中有如下代码可用:

ProcessList() {

MemInfoReader minfo = new MemInfoReader();

minfo.readMemInfo();

mTotalMemMb = minfo.getTotalSize()/(1024*1024);

}

查看进程占用cpu的情况:adb shell top -n 1 -d 0.5 | grep proc_ id

Android 中查看内存的使用情况集常用adb命令,布布扣,bubuko.com

时间: 2024-08-02 11:04:06

Android 中查看内存的使用情况集常用adb命令的相关文章

Android 中查看内存的使用情况集经常使用adb命令

1. 在IDE中查看Log信息 当程序执行垃圾回收的时候,会打印一条Log信息.其格式例如以下: D/dalvikvm: <GC_Reason> <Amount_freed>, <Heap_stats>, <External_memory_stats>, <Pause_time> GC_Reason表示导致垃圾回收的原因以及当前的回收类型,包含下面几类: GC_CONCURRENT:当堆中对象数量达到一定是触发的垃圾收集 GC_FOR_MALLO

查找并修复Android中的内存泄露—OutOfMemoryError

[编者按]本文作者为来自南非约翰内斯堡的女程序员 Rebecca Franks,Rebecca 热衷于安卓开发,拥有4年安卓应用开发经验.有点完美主义者,喜爱美食. 本文系国内ITOM管理平台 OneAPM 编译呈现,以下为正文. Android 程序中很容易出现内存泄露问题.毫无戒心的开发者可能每天都会造成一些内存泄露,却不自知.你可能从未注意过这类错误,或者甚至都不知道它们的存在.直到你遇到下面这样的异常: java.lang.OutOfMemoryError: Failed to allo

Android中的内存管理机制以及正确的使用方式

概述 从操作系统的角度来说,内存就是一块数据存储区域,属于可被操作系统调度的资源.现代多任务(进程)的操作系统中,内存管理尤为重要,操作系统需要为每一个进程合理的分配内存资源,所以可以从两方面来理解操作系统的内存管理机制. 第一:分配机制.为每一个进程分配一个合理的内存大小,保证每一个进程能够正常的运行,不至于内存不够使用或者每个进程占用太多的内存. 第二:回收机制.在系统内存不足打的时候,需要有一个合理的回收再分配的机制,以保证新的进程可以正常运行.回收的时候就要杀死那些正在占有内存的进程,操

nodejs查看内存的使用情况

nodejs查看内存的使用情况 by 伍雪颖 var showMem = function() { var mem = process.memoryUsage(); var format = function(bytes) { return (bytes/1024/1024).toFixed(2)+'MB'; }; console.log('Process: heapTotal '+format(mem.heapTotal) + ' heapUsed ' + format(mem.heapUse

在Android中查看和管理sqlite数据库

http://www.cnblogs.com/walkingp/archive/2011/03/28/1997437.html 在Android中查看和管理sqlite数据库 在Android中可以使用Eclipse插件DDMS来查看,也可以使用Android工具包中的adb工具来查看.android项目中的sqlite数据库位于/data/data/项目包/databases中. 使用DDMS导出sqlite数据库. 1.首先打开android项目的调试模式,然后找到显示DDMS: 选择DDM

Android常用adb命令总结

Android 常用 adb 命令总结 首发个人博客 http://xuxu1988.com/2015/05/15/android-adb-commands , 转载请注明出处. 针对移动端 Android 的测试, adb 命令是很重要的一个点,必须将常用的 adb 命令熟记于心, 将会为 Android 测试带来很大的方便,其中很多命令将会用于自动化测试的脚本当中. Android Debug Bridge adb 其实就是 Android Debug Bridge, Android 调试桥

android中的内存优化

内存泄露可以引发很多的问题: 1.程序卡顿,响应速度慢(内存占用高时JVM虚拟机会频繁触发GC) 2.莫名消失(当你的程序所占内存越大,它在后台的时候就越可能被干掉.反之内存占用越小,在后台存在的时间就越长) 3.直接崩溃(OutOfMemoryError) ANDROID内存面临的问题: 1.有限的堆内存,原始只有16M 2.内存大小消耗等根据设备,操作系统等级,屏幕尺寸的不同而不同 3.程序不能直接控制 4.支持后台多任务处理(multitasking) 5.运行在虚拟机之上 我主要通过以下

【转】Android中的内存管理--不错不错,避免使用枚举类型

原文网址:http://android-performance.com/android/2014/02/17/android-manage-memory.html 本文内容翻译自:http://developer.android.com/training/articles/memory.html 随机存取存储器(RAM)再任何软件开发环境中都是宝贵的资源,但是在移动操作系统中,内存资源更为宝贵,使用时也会收到限制.虽然Android的Dalvik虚拟机有运行时的垃圾回收机制,但是这不意味着你的A

【Android】查看内存

[文章来源]http://blog.csdn.net/hudashi/article/details/7050897 查看内存使用的方式有很多种,但是各个方式查看到的结果可能会有微略不同. 方式一,Running services 通过手机上Running services的Activity查看,可以通过Setting->Applications->Running services进. 关于Running services的详细内容请参考<Android中使用"running