Linux下查看某一个程序运行所占用的内存

第一种方式

top -p 进程号

[root@localhost log]# top -p 20876
top - 15:45:46 up 115 days,  1:35,  3 users,  load average: 2.91, 3.35, 3.39
Tasks:   1 total,   0 running,   1 sleeping,   0 stopped,   0 zombie
Cpu(s): 73.2%us,  3.0%sy,  0.0%ni, 22.8%id,  0.9%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:  32827536k total, 30726792k used,  2100744k free,   287328k buffers
Swap: 10239992k total,  1690532k used,  8549460k free, 19633172k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                                                                        
20876 root      20   0 9557m  93m  11m S  0.0  0.3   0:12.57 java

第二种方式

    ps -aux | grep 进程名

[root@localhost log]# ps -aux | grep 20876
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
root     20876  0.0  0.2 9786428 95748 pts/0   Sl   11:54   0:12 java -jar patient_tag.jar
root     40356  0.0  0.0 103252   912 pts/0    S+   15:46   0:00 grep --color=auto 20876

第三种方式

cat /proc/进程号/status

[root@localhost log]# cat /proc/20876/status
Name:   java
State:  S (sleeping)
Tgid:   20876
Pid:    20876
PPid:   8123
TracerPid:      0
Uid:    0       0       0       0
Gid:    0       0       0       0
Utrace: 0
FDSize: 256
Groups: 0 
VmPeak:  9825576 kB
VmSize:  9786428 kB
VmLck:         0 kB
VmHWM:     96744 kB
VmRSS:     95748 kB
VmData:  9617268 kB
VmStk:        88 kB
VmExe:         4 kB
VmLib:     18112 kB
VmPTE:       496 kB
VmSwap:        0 kB
Threads:        14
SigQ:   2/256303
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000001001
SigCgt: 2000000181004cce
CapInh: 0000000000000000
CapPrm: ffffffffffffffff
CapEff: ffffffffffffffff
CapBnd: ffffffffffffffff
Cpus_allowed:   ffff,ffffffff
Cpus_allowed_list:      0-47
Mems_allowed:   00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001
Mems_allowed_list:      0
voluntary_ctxt_switches:        1
nonvoluntary_ctxt_switches:     6


VmSize(KB) 任务虚拟地址空间的大小 (total_vm-reserved_vm),其中total_vm为进程的地址空间的大小,reserved_vm:进程在预留或特殊的内存间的物理页 
VmLck(KB) 任务已经锁住的物理内存的大小。锁住的物理内存不能交换到硬盘 (locked_vm) 
VmRSS(KB) 应用程序正在使用的物理内存的大小,就是用ps命令的参数rss的值 (rss) 
VmData(KB) 程序数据段的大小(所占虚拟内存的大小),存放初始化了的数据; (total_vm-shared_vm-stack_vm) 
VmStk(KB) 任务在用户态的栈的大小 (stack_vm) 
VmExe(KB) 程序所拥有的可执行虚拟内存的大小,代码段,不包括任务使用的库 (end_code-start_code) 
VmLib(KB) 被映像到任务的虚拟内存空间的库的大小 (exec_lib) 
VmPTE 该进程的所有页表的大小,单位:kb 
Threads 共享使用该信号描述符的任务的个数,在POSIX多线程序应用程序中,线程组中的所有线程使用同一个信号描述符

1、VmRSS是真实正在占用的内存,而VmData是虚拟内存,大小差异大并没有什么问题。 
2、VmData是指数据段的内存大小,存放初始化了的数据; (total_vm-shared_vm-stack_vm) 
3、不调动态库的时候是不计算的(dlopen方式) 
4、静态库会编译为程序本身的一部分,不在VmLib的统计之内。 
5、参考上面的说明 
6、除非有非常明显的内存泄露,如内存一直大幅度增长并长时间不释放,否则单纯以来这些值是很判断真正的内在泄露。