1、status
#cat /proc/pid/status
Name: main
Umask: 0022
State: S (sleeping)
Tgid: 982
Ngid: 0
Pid: 982
PPid: 888
TracerPid: 0
Uid: 0 0 0 0
Gid: 0 0 0 0
FDSize: 256
Groups:
NStgid: 982
NSpid: 982
NSpgid: 91
NSsid: 91
VmPeak: 131640 kB
VmSize: 118824 kB
VmLck: 0 kB
VmPin: 0 kB
VmHWM: 80908 kB
VmRSS: 65864 kB
RssAnon: 59280 kB
RssFile: 6344 kB
RssShmem: 240 kB
VmData: 78120 kB
VmStk: 520 kB
VmExe: 152 kB
VmLib: 15924 kB
VmPTE: 114 kB
VmPMD: 0 kB
VmSwap: 0 kB
Threads: 2
SigQ: 0/1823
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000001000
SigCgt: 00000001800146ef
CapInh: 0000000000000000
CapPrm: 0000003fffffffff
CapEff: 0000003fffffffff
CapBnd: 0000003fffffffff
CapAmb: 0000000000000000
Cpus_allowed: 3
Cpus_allowed_list: 0-1
voluntary_ctxt_switches: 836161
nonvoluntary_ctxt_switches: 58316
VmRSS: 65864 kB 表示应用程序正在使用的物理内存的大小
2、smaps
#cat /proc/PID/smaps | grep '^Rss:'| awk '{sum +=$2} END{print sum}'
65864
结果与status相同
#cat /proc/pid/smaps | grep 'heap' -A19
00047000-00766000 rw-p 00000000 00:00 0 [heap]
Size: 7292 kB
Rss: 6956 kB
Pss: 6956 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 6956 kB
Referenced: 6956 kB
Anonymous: 6956 kB
AnonHugePages: 0 kB
ShmemPmdMapped: 0 kB
Shared_Hugetlb: 0 kB
Private_Hugetlb: 0 kB
Swap: 0 kB
SwapPss: 0 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
Locked: 0 kB
VmFlags: rd wr mr mw me ac
Size:表示该映射区域在虚拟内存空间中的大小。
Rss:表示该映射区域当前在物理内存中占用了多少空间
Shared_Clean:和其他进程共享的未被改写的page的大小
Shared_Dirty: 和其他进程共享的被改写的page的大小
Private_Clean:未被改写的私有页面的大小。
Private_Dirty: 已被改写的私有页面的大小。
Swap:表示非mmap内存(也叫anonymous memory,比如malloc动态分配出来的内存)由于物理内存不足被swap到交换空间的大小。
Pss:该虚拟内存区域平摊计算后使用的物理内存大小(有些内存会和其他进程共享,例如mmap进来的)。比如该区域所映射的物理内存部分同时也被另一个进程映射了,且该部分物理内存的大小为1000KB,那么该进程分摊其中一半的内存,即Pss=500KB。
[ stack ]表示进程用到的栈空间
[ heap ]表示进程用到的堆空间
SHR ≈ RES - [heap] - [stack]
3、监控
配合watch指令进行监控,查看内存是否持续上升
watch -n 10 cat /proc/pid/smaps | grep “heap” -A19