android查看内存使用情况
1.cat /proc/meminfo
MemTotal: 所有可用RAM大小 (即物理内存减去一些预留位和内核的二进制代码大小)MemFree: LowFree与HighFree的总和Buffers: 用来给块设备做的缓冲大小(只记录文件系统的metadata以及 tracking in-flight pages,就是说 buffers是用来存储,目录里面有什么内容,权限等等。)Cached: 用来给文件做缓冲大小(直接用来记忆我们打开的文件). 它不包括SwapCachedSwapCached: 已经被交换出来的内存,但仍然被存放在swapfile中。用来在需要的时候很快的被替换而不需要再次打开I/O端口。Active: 最近经常被使用的内存,除非非常必要否则不会被移作他用.Inactive: 最近不经常被使用的内存,非常用可能被用于其他途径.HighTotal:HighFree: 高位内存是指所有在860MB以上的内存空间,该区域主要用于用户空间的程序或者是缓存页面。内核必须使用不同的手法使用该段内存,因此它比低位内存要慢一些。LowTotal:LowFree: 低位可以达到高位内存一样的作用,而且它还能够被内核用来记录一些自己的数据结构。Among many other things, it is where everything from the Slab isallocated. Bad things happen when you're out of lowmem.SwapTotal: 交换空间的总和SwapFree: 从RAM中被替换出暂时存在磁盘上的空间大小Dirty: 等待被写回到磁盘的内存大小。Writeback: 正在被写回到磁盘的内存大小。Mapped: 影射文件的大小。Slab: 内核数据结构缓存VmallocTotal: vmalloc内存大小VmallocUsed: 已经被使用的虚拟内存大小。VmallocChunk: largest contigious block of vmalloc area which is freeCommitLimit:Committed_AS:
2、dumpsys meminfo
更多关于dumpsys的使用信息,可以查看:
https://blog.csdn.net/shift_wwx/article/details/42464293
可以dump的这些service都是在ServiceManager里面添加上的,例如meminfo是在:frameworks/base/services/java/com/android/server/am/ActivityManagerService.java的函数setSystemProcess添加的:
public static void setSystemProcess() {try {ActivityManagerService m = mSelf;ServiceManager.addService(Context.ACTIVITY_SERVICE, m, true);ServiceManager.addService(ProcessStats.SERVICE_NAME, m.mProcessStats);ServiceManager.addService("meminfo", new MemBinder(m));ServiceManager.addService("gfxinfo", new GraphicsBinder(m));ServiceManager.addService("dbinfo", new DbBinder(m));if (MONITOR_CPU_USAGE) {ServiceManager.addService("cpuinfo", new CpuBinder(m));}ServiceManager.addService("permission", new PermissionController(m));ApplicationInfo info =mSelf.mContext.getPackageManager().getApplicationInfo("android", STOCK_PM_FLAGS);mSystemThread.installSystemApplicationInfo(info);synchronized (mSelf) {ProcessRecord app = mSelf.newProcessRecordLocked(info,info.processName, false);app.persistent = true;app.pid = MY_PID;app.maxAdj = ProcessList.SYSTEM_ADJ;app.makeActive(mSystemThread.getApplicationThread(), mSelf.mProcessStats);mSelf.mProcessNames.put(app.processName, app.uid, app);synchronized (mSelf.mPidsSelfLocked) {mSelf.mPidsSelfLocked.put(app.pid, app);}mSelf.updateLruProcessLocked(app, false, null);mSelf.updateOomAdjLocked();}} catch (PackageManager.NameNotFoundException e) {throw new RuntimeException("Unable to find android system package", e);}}
来看一下MemBinder:
@Overrideprotected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {if (mActivityManagerService.checkCallingPermission(android.Manifest.permission.DUMP)!= PackageManager.PERMISSION_GRANTED) {pw.println("Permission Denial: can't dump meminfo from from pid="+ Binder.getCallingPid() + ", uid=" + Binder.getCallingUid()+ " without permission " + android.Manifest.permission.DUMP);return;}mActivityManagerService.dumpApplicationMemoryUsage(fd, pw, " ", args, false, null);
}
最终调用的是:
mActivityManagerService.dumpApplicationMemoryUsage
具体的source code这里暂不作分析了。
通过code可以看出meminfo的几个参数如下:
t7-p1:/ # dumpsys meminfo -h
meminfo dump options: [-a] [-d] [-c] [-s] [--oom] [process]-a: include all available information for each process.-d: include dalvik details.-c: dump in a compact machine-parseable representation.-s: dump only summary of application memory usage.-S: dump also SwapPss.--oom: only show processes organized by oom adj.--local: only collect details locally, don't call process.--package: interpret process arg as package, dumping allprocesses that have loaded that package.--checkin: dump data for a checkin
If [process] is specified it can be the name or
pid of a specific process to dump.
adb shell dumpsys meminfo <package_name>
其中,package_name 也可以换成程序的pid,pid可以通过 adb shell top | grep app_name 来查找,下图是某个程序的内存使用情况:
130|t7-p1:/ # dumpsys meminfo com.neo.dsm
Applications Memory Usage (in Kilobytes):
Uptime: 3964700 Realtime: 3964700** MEMINFO in pid 4230 [com.neo.dsm] **Pss Private Private Swap Heap Heap HeapTotal Dirty Clean Dirty Size Alloc Free------ ------ ------ ------ ------ ------ ------Native Heap 58751 58644 0 0 160640 137494 23145Dalvik Heap 7461 7424 0 0 15397 9239 6158Dalvik Other 2220 2220 0 0 Stack 1668 1668 0 0 Ashmem 3470 3452 0 0 Other dev 4 0 4 0 .so mmap 2215 340 552 0 .apk mmap 8224 404 7312 0 .ttf mmap 11 0 0 0 .dex mmap 4652 4 4648 0 .oat mmap 2435 0 488 0 .art mmap 1673 1348 0 0 Other mmap 497 4 184 0 Unknown 1618 1616 0 0 TOTAL 94899 77124 13188 0 176037 146733 29303App SummaryPss(KB)------Java Heap: 8772Native Heap: 58644Code: 13748Stack: 1668Graphics: 0Private Other: 7480System: 4587TOTAL: 94899 TOTAL SWAP (KB): 0ObjectsViews: 9 ViewRootImpl: 0AppContexts: 3 Activities: 1Assets: 2 AssetManagers: 2Local Binders: 14 Proxy Binders: 20Parcel memory: 30 Parcel count: 120Death Recipients: 0 OpenSSL Sockets: 1WebViews: 0SQLMEMORY_USED: 0PAGECACHE_OVERFLOW: 0 MALLOC_SIZE: 62
130|t7-p1:/ # top | grep com.neo.dsm4230 system 20 0 9% S 237 1551484K 139732K fg com.neo.dsm4230 system 20 0 9% S 237 1551484K 139776K fg com.neo.dsm
adb shell dumpsys meminfo PID
130|t7-p1:/ # dumpsys meminfo 4230
Applications Memory Usage (in Kilobytes):
Uptime: 4204302 Realtime: 4204302** MEMINFO in pid 4230 [com.neo.dsm] **Pss Private Private Swap Heap Heap HeapTotal Dirty Clean Dirty Size Alloc Free------ ------ ------ ------ ------ ------ ------Native Heap 58795 58688 0 0 160128 137568 22559Dalvik Heap 9945 9908 0 0 15424 9255 6169Dalvik Other 2296 2296 0 0 Stack 1644 1644 0 0 Ashmem 3470 3452 0 0 Other dev 4 0 4 0 .so mmap 2217 340 552 0 .apk mmap 8224 404 7312 0 .ttf mmap 11 0 0 0 .dex mmap 4652 4 4648 0 .oat mmap 2494 0 520 0 .art mmap 1935 1376 224 0 Other mmap 497 4 184 0 Unknown 1618 1616 0 0 TOTAL 97802 79732 13444 0 175552 146823 28728App SummaryPss(KB)------Java Heap: 11508Native Heap: 58688Code: 13780Stack: 1644Graphics: 0Private Other: 7556System: 4626TOTAL: 97802 TOTAL SWAP (KB): 0ObjectsViews: 9 ViewRootImpl: 0AppContexts: 3 Activities: 1Assets: 2 AssetManagers: 2Local Binders: 14 Proxy Binders: 20Parcel memory: 30 Parcel count: 120Death Recipients: 0 OpenSSL Sockets: 3WebViews: 0SQLMEMORY_USED: 0PAGECACHE_OVERFLOW: 0 MALLOC_SIZE: 62
重点关注如下几个字段:
(1) Native/Dalvik 的 Heap 信息
具体在上面的第一行和第二行,它分别给出的是JNI层和Java层的内存分配情况,如果发现这个值一直增长,则代表程序可能出现了内存泄漏。
(2) Total 的 PSS 信息
这个值就是你的应用真正占据的内存大小,通过这个信息,你可以轻松判别手机中哪些程序占内存比较大了。
其它部分的说明:
其他类型 smap 路径名称 描述Ashmem /dev/ashmem 匿名共享内存用来提供共享内存通过分配一个多个进程可以共享的带名称的内存块
Other dev /dev/ 内部driver占用的在 “Other dev”
.so mmap .so C 库代码占用的内存
.jar mmap .jar Java 文件代码占用的内存
.apk mmap .apk apk代码占用的内存
.ttf mmap .ttf ttf 文件代码占用的内存
.dex mmap .dex Dex 文件代码占用的内存
Other mmap 其他文件占用的内存
————————————————
Lost RAM = Total RAM - Free RAM - Used RAM
使用adb shell procrank
手机中的sh是经过精简过的,有些手机可能没有 procrank 命令,可以使用genymotion模拟器,或是自己安装procrank命令。使用procrank时,命令行的输出入下图:
t7-p1:/ # procrank PID Vss Rss Pss Uss cmdline4230 1573056K 140188K 93428K 88680K com.neo.dsm2390 1593916K 101028K 58147K 51300K system_server4616 1095468K 96800K 50089K 44624K com.neo.xunfei4572 1046628K 74408K 33713K 30472K com.neo.mqtt3444 1019260K 68924K 30019K 26620K com.android.systemui3469 1018664K 65128K 25558K 22804K com.neo.launcher4673 1053624K 57588K 24411K 22832K com.neo.chat4353 1065292K 59252K 23753K 21724K com.neo.n14689 1053712K 54524K 22698K 21292K com.neo.camap1716 263808K 33128K 21695K 20368K /system/bin/cameraserver1711 1559472K 69612K 16489K 8832K zygote3769 1010088K 52932K 16268K 13640K com.android.phone5079 1015688K 53028K 16008K 12960K com.android.settings3536 1006580K 52160K 14706K 12224K com.google.android.inputmethod.pinyin5460 1004180K 50680K 13428K 11112K com.softwinner.dvr1729 163844K 23736K 11420K 9308K /system/bin/mediaserver5580 986864K 46500K 11029K 8888K android.process.acore6713 990088K 46732K 10784K 8896K com.neo.radio1708 24748K 10708K 9737K 9688K /system/bin/logcat4879 984788K 43264K 8754K 7076K com.neo.update4172 984236K 43232K 8237K 6232K android.process.media4978 990080K 37016K 7410K 6232K com.android.dialer1714 95524K 17952K 7385K 6160K /system/bin/audioserver1724 79424K 17260K 6780K 5676K media.codec5538 985716K 39532K 6676K 4320K com.neo.xunfei:remote4533 981756K 38960K 6495K 5096K com.neo.ble1725 69912K 17792K 6354K 4664K /system/bin/mediadrmserver1728 89616K 17304K 6271K 5140K media.extractor5294 984784K 35412K 6230K 4988K cn.kuwo.kwmusiccar1719 64336K 16504K 5823K 4764K /system/bin/drmserver4654 980312K 35484K 5800K 4628K com.neo.blemusic3517 978072K 36312K 5557K 4276K com.android.printspooler4837 976568K 35636K 5411K 2596K android.ext.services5412 980168K 33832K 5403K 4312K com.neo.music4193 977756K 34312K 4894K 3704K com.android.keychain3900 978116K 33576K 4801K 3684K com.android.smspush1685 59580K 14820K 4798K 3896K /system/bin/displayservice2421 78744K 5572K 3280K 1408K /system/bin/gocsdk1703 64068K 14908K 3090K 328K /system/bin/gocsdk1595 15792K 3820K 2820K 2772K /system/bin/logd1690 40504K 5388K 2666K 2328K /system/bin/surfaceflinger1709 9124K 3356K 2409K 2360K /system/bin/logcat
11643 6484K 3144K 2350K 2332K procrank1600 11776K 3328K 1474K 1300K /system/bin/vold1733 35764K 3012K 1428K 1340K /system/bin/netd3961 8240K 2260K 1339K 1304K /system/bin/sdcard4211 8240K 2176K 1255K 1220K /system/bin/sdcard1760 13716K 4464K 1224K 1008K /system/bin/neomcu1722 8052K 2780K 1052K 956K /system/bin/keystore1705 14024K 2300K 995K 952K /system/bin/rild1 8372K 1068K 801K 600K /init1702 12820K 708K 679K 676K /sbin/adbd1686 4568K 1624K 655K 628K /system/bin/lmkd1057 2820K 848K 614K 388K /sbin/ueventd4332 4844K 1580K 584K 556K pppd1682 3548K 1308K 545K 528K /system/bin/sh1720 5004K 1632K 539K 504K /system/bin/installd
11619 4736K 1464K 480K 452K sleep1688 4596K 1488K 467K 432K /system/bin/servicemanager1743 4104K 1416K 452K 424K /system/xbin/perfprofd1681 2996K 416K 408K 408K /sbin/healthd1761 1456K 336K 336K 336K /sbin/busybox1599 5348K 1580K 291K 72K /system/bin/debuggerd1613 5092K 532K 245K 56K debuggerd:signaller------ ------ ------648966K 559376K TOTALRAM: 1793368K total, 558392K free, 3192K buffers, 671620K cached, 8536K shmem, 65080K slab
可以看到,在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
查看进程占用cpu的情况:adb shell top -n 1 -d 0.5 | grep proc_ id
127|t7-p1:/ # top -n 1 -d 0.5 | grep 42304230 system 20 0 6% S 262 1576156K 136492K fg com.neo.dsm
t7-p1:/ #
adb shell top -m 数字 : 查看应用内存占用率,其中数字为返回的应用数量,从高到低排序 如:
adb shell top -m 10 查看10个进程的内存情况
系统强制释放内存:
页内存释放:
To free pagecache:
echo 1 > /proc/sys/vm/drop_caches
To free dentries and inodes:
echo 2 > /proc/sys/vm/drop_caches
To free pagecache, dentries and inodes:
echo 3 > /proc/sys/vm/drop_caches
如android在ActuvutyManageServer中解析meminfo信息,当caches值大于某个值,或者剩余内存小于内存总数的20%时,发起强制释放缓存,如下:
flushcache.sh文件内容:
#!/system/bin/busybox sh
/system/bin/log -t pagecache "flush page cache"
echo 1 > /proc/sys/vm/drop_caches
android查看内存使用情况相关推荐
- android 如何 查看内存使用详情,android 查看内存使用情况
对android 内存分析比较好的Blog: 主要介绍 1.进程的地址空间. 2.进程内存空间和RAM之间的关系. 3.Android中的进程. 4.Android中进程的堆内存. 5.Android ...
- [轉]MS SQL Server启用AWE用查看内存使用情况
轉自 : http://www.path8.net/tn/archives/4508 MS SQL Server启用AWE用查看内存使用情况,使用SQL命令 DBCC MemoryStatus 3G以 ...
- 进阶指令——df指令(作用:查看磁盘的空间)、free指令(作用:查看内存使用情况)、head指令(作用:查看一个文件的前n行,如果不指定n,则默认显示前10行)、tail指令、less指令
1.df指令 作用:查看磁盘的空间 语法:#df -h -h表示以可读性较高的形式展示大小 2.free指令 作用:查看内存使用情况 语法:#free -m -m表示以mb为单位查看 剩余的真实可 ...
- 【linux】查看内存使用情况
内存使用量排序显示 top命令查看 top命令能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.使用top命令可以轻松查看各个应用的内存使用情况. # top -d 1 在t ...
- 如何查看服务器资源占用情况,云服务器如何查看内存占用情况
云服务器如何查看内存占用情况 发布时间:2020-05-26 15:28:18 来源:亿速云 阅读:508 作者:栢白 云服务器如何查看内存占用情况?云 我们以 Linux 云服务器为例,介绍几个常用 ...
- Linux下查看内存使用情况方法总结
关注.星标公众号,直达精彩内容 来自:Specs'Blog 链接:http://9iphp.com/linux/1247.html 原文:http://ask.xmodulo.com/check-me ...
- android手机内存使用情况分析
android手机内存使用情况分析 通常客户经常纠结手机内存的使用率不合理,占有的内存太大,可用内存很少,客户往往需要给出解决方案或在给出原因,那么你首先需要知道手机的内存都被什么应用 ...
- linux系统命令-查看内存使用情况
1.查看系统内存占用 free -m [root@localhost ~]# free -mtotal used free shared buffers cached Mem: 2004 573 14 ...
- Linux_查看内存使用情况
1./proc/meminfo 查看RAM使用情况最简单的方法是通过/proc/meminfo.这个动态更新的虚拟文件实际上是许多其他内存相关工具(如:free / ps / top)等的组合显示./ ...
最新文章
- Linux用户环境变量
- 【工具篇】利用DBExportDoc V1.0 For MySQL自动生成数据库表结构文档(转
- 【Android 高性能音频】Oboe 开发流程 ( 导入 Oboe 库 | 使用预构建的二进制库和头文件 | 编译 Oboe 源码 )
- 【知识发现】隐语义模型LFM算法python实现(二)
- 响应式微服务 in java 译 十五 Microservices in OpenShift
- android主题编辑器,使用 Theme Editor 设计应用主题背景
- 洛谷4400 BlueMary的旅行(分层图+最大流)
- 漫步数理统计七——随机变量(上)
- Linux守护进程的启动方法
- 【mongoDB实战】mongo集群---主从复制篇
- 微信小程序使用iconfont在线icon
- Android 自定义字体(otf,ttf等等)
- java房屋出租系统
- openstackdvr模式
- KETTLE相关问题处理
- Oracle中insert into select和select into的用法(异常0RA-00905:missing keyword的解决)
- 以某SCI期刊为例说明该期刊投稿须知和流程
- html正则表达式判断手机号,js正则表达式根据手机号判断校验运营商
- layui table 获取单元格总是多一个
- VRChat火了,但VR社交还没迎来最好的时代
热门文章
- 统计力学练习: Ising模型的平均场解以及严格求解
- 关于如何在sublime text3中添加字体问题解决,保姆级教程
- 远控免杀专题(13)-zirikatu免杀(VT免杀率39/71)
- 2023注会电子版教材
- java导出excel限制大小_解决java poi导出excel2003不能超过65536行的问题
- linux修改宽带拨号密码,linux 下 adsl 拨号设置
- 第二届2011年国信蓝点杯软件设计大赛预赛的试题7
- Kali Linux信息收集之nbtscan-unixwiz
- Swagger注释@API详细说明
- 飞信迷你首页疑似被黑?