1.cat /proc/meminfo
MemTotal: 所有可用RAM大小 (即物理内存减去一些预留位和内核的二进制代码大小)
MemFree: LowFree与HighFree的总和
Buffers: 用来给块设备做的缓冲大小(只记录文件系统的metadata以及 tracking in-flight pages,就是说 buffers是用来存储,目录里面有什么内容,权限等等。)
Cached: 用来给文件做缓冲大小(直接用来记忆我们打开的文件). 它不包括SwapCached
SwapCached: 已经被交换出来的内存,但仍然被存放在swapfile中。用来在需要的时候很快的被替换而不需要再次打开I/O端口。
Active: 最近经常被使用的内存,除非非常必要否则不会被移作他用.
Inactive: 最近不经常被使用的内存,非常用可能被用于其他途径.
HighTotal:
HighFree: 高位内存是指所有在860MB以上的内存空间,该区域主要用于用户空间的程序或者是缓存页面。内核必须使用不同的手法使用该段内存,因此它比低位内存要慢一些。
LowTotal:
LowFree: 低位可以达到高位内存一样的作用,而且它还能够被内核用来记录一些自己的数据结构。
Among many other things, it is where everything from the Slab is
allocated. 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 free
CommitLimit:
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:
@Override
protected 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 all
processes 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 Heap
Total Dirty Clean Dirty Size Alloc Free
------ ------ ------ ------ ------ ------ ------
Native Heap 58751 58644 0 0 160640 137494 23145
Dalvik Heap 7461 7424 0 0 15397 9239 6158
Dalvik 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 29303
App Summary
Pss(KB)
------
Java Heap: 8772
Native Heap: 58644
Code: 13748
Stack: 1668
Graphics: 0
Private Other: 7480
System: 4587
TOTAL: 94899 TOTAL SWAP (KB): 0
Objects
Views: 9 ViewRootImpl: 0
AppContexts: 3 Activities: 1
Assets: 2 AssetManagers: 2
Local Binders: 14 Proxy Binders: 20
Parcel memory: 30 Parcel count: 120
Death Recipients: 0 OpenSSL Sockets: 1
WebViews: 0
SQL
MEMORY_USED: 0
PAGECACHE_OVERFLOW: 0 MALLOC_SIZE: 62
130|t7-p1:/ # top | grep com.neo.dsm
4230 system 20 0 9% S 237 1551484K 139732K fg com.neo.dsm
4230 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 Heap
Total Dirty Clean Dirty Size Alloc Free
------ ------ ------ ------ ------ ------ ------
Native Heap 58795 58688 0 0 160128 137568 22559
Dalvik Heap 9945 9908 0 0 15424 9255 6169
Dalvik 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 28728
App Summary
Pss(KB)
------
Java Heap: 11508
Native Heap: 58688
Code: 13780
Stack: 1644
Graphics: 0
Private Other: 7556
System: 4626
TOTAL: 97802 TOTAL SWAP (KB): 0
Objects
Views: 9 ViewRootImpl: 0
AppContexts: 3 Activities: 1
Assets: 2 AssetManagers: 2
Local Binders: 14 Proxy Binders: 20
Parcel memory: 30 Parcel count: 120
Death Recipients: 0 OpenSSL Sockets: 3
WebViews: 0
SQL
MEMORY_USED: 0
PAGECACHE_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 cmdline
4230 1573056K 140188K 93428K 88680K com.neo.dsm
2390 1593916K 101028K 58147K 51300K system_server
4616 1095468K 96800K 50089K 44624K com.neo.xunfei
4572 1046628K 74408K 33713K 30472K com.neo.mqtt
3444 1019260K 68924K 30019K 26620K com.android.systemui
3469 1018664K 65128K 25558K 22804K com.neo.launcher
4673 1053624K 57588K 24411K 22832K com.neo.chat
4353 1065292K 59252K 23753K 21724K com.neo.n1
4689 1053712K 54524K 22698K 21292K com.neo.camap
1716 263808K 33128K 21695K 20368K /system/bin/cameraserver
1711 1559472K 69612K 16489K 8832K zygote
3769 1010088K 52932K 16268K 13640K com.android.phone
5079 1015688K 53028K 16008K 12960K com.android.settings
3536 1006580K 52160K 14706K 12224K com.google.android.inputmethod.pinyin
5460 1004180K 50680K 13428K 11112K com.softwinner.dvr
1729 163844K 23736K 11420K 9308K /system/bin/mediaserver
5580 986864K 46500K 11029K 8888K android.process.acore
6713 990088K 46732K 10784K 8896K com.neo.radio
1708 24748K 10708K 9737K 9688K /system/bin/logcat
4879 984788K 43264K 8754K 7076K com.neo.update
4172 984236K 43232K 8237K 6232K android.process.media
4978 990080K 37016K 7410K 6232K com.android.dialer
1714 95524K 17952K 7385K 6160K /system/bin/audioserver
1724 79424K 17260K 6780K 5676K media.codec
5538 985716K 39532K 6676K 4320K com.neo.xunfei:remote
4533 981756K 38960K 6495K 5096K com.neo.ble
1725 69912K 17792K 6354K 4664K /system/bin/mediadrmserver
1728 89616K 17304K 6271K 5140K media.extractor
5294 984784K 35412K 6230K 4988K cn.kuwo.kwmusiccar
1719 64336K 16504K 5823K 4764K /system/bin/drmserver
4654 980312K 35484K 5800K 4628K com.neo.blemusic
3517 978072K 36312K 5557K 4276K com.android.printspooler
4837 976568K 35636K 5411K 2596K android.ext.services
5412 980168K 33832K 5403K 4312K com.neo.music
4193 977756K 34312K 4894K 3704K com.android.keychain
3900 978116K 33576K 4801K 3684K com.android.smspush
1685 59580K 14820K 4798K 3896K /system/bin/displayservice
2421 78744K 5572K 3280K 1408K /system/bin/gocsdk
1703 64068K 14908K 3090K 328K /system/bin/gocsdk
1595 15792K 3820K 2820K 2772K /system/bin/logd
1690 40504K 5388K 2666K 2328K /system/bin/surfaceflinger
1709 9124K 3356K 2409K 2360K /system/bin/logcat
11643 6484K 3144K 2350K 2332K procrank
1600 11776K 3328K 1474K 1300K /system/bin/vold
1733 35764K 3012K 1428K 1340K /system/bin/netd
3961 8240K 2260K 1339K 1304K /system/bin/sdcard
4211 8240K 2176K 1255K 1220K /system/bin/sdcard
1760 13716K 4464K 1224K 1008K /system/bin/neomcu
1722 8052K 2780K 1052K 956K /system/bin/keystore
1705 14024K 2300K 995K 952K /system/bin/rild
1 8372K 1068K 801K 600K /init
1702 12820K 708K 679K 676K /sbin/adbd
1686 4568K 1624K 655K 628K /system/bin/lmkd
1057 2820K 848K 614K 388K /sbin/ueventd
4332 4844K 1580K 584K 556K pppd
1682 3548K 1308K 545K 528K /system/bin/sh
1720 5004K 1632K 539K 504K /system/bin/installd
11619 4736K 1464K 480K 452K sleep
1688 4596K 1488K 467K 432K /system/bin/servicemanager
1743 4104K 1416K 452K 424K /system/xbin/perfprofd
1681 2996K 416K 408K 408K /sbin/healthd
1761 1456K 336K 336K 336K /sbin/busybox
1599 5348K 1580K 291K 72K /system/bin/debuggerd
1613 5092K 532K 245K 56K debuggerd:signaller
------ ------ ------
648966K 559376K TOTAL
RAM: 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 4230
4230 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