问题:Linux查看程序内存占用详情
环境:
系统:centos 7.5
环境:
问题分析:
在linux下开发使用服务程序,经常需要查看某进程占用内存的详情,以便观察内存动态及是否泄露等情况。
解决步骤:
一、使用命令top 或者 top -p PID来进行观察,数据比较粗粒度,内存占比以百分比形式直观呈现。
二、使用命令 cat /proc/PID/status来查看,PID为当前程序或者服务的进程号。
1、查看服务或程序PID,以test服务为例,使用命令ps aux |grep test即可查看到。
2、观察proc中的内存信息,主要是以vmSize 虚拟内存大小;和vmRss 虚拟内存驻留大小来看对于内存的占用,其中vmRss可以直接理解为占用物理内存的大小。
proc信息中主要有VmSize|VmRSS|VmData|VmStk|VmExe|VmLib 这几指标,解释如下:
VmSize(KB):虚拟内存大小。整个进程使用虚拟内存大小,是VmLib, VmExe, VmData, 和 VmStk的总和。
VmRSS(KB):虚拟内存驻留集合大小。这是驻留在物理内存的一部分。它没有交换到硬盘。它包括代码,数据和栈。
VmData(KB):程序数据段的大小(所占虚拟内存的大小), 堆使用的虚拟内存。
VmStk(KB): 任务在用户态的栈的大小, 栈使用的虚拟内存
VmExe(KB):程序所拥有的可执行虚拟内存的大小,代码段,不包括任务使用的库
VmLib(KB) :被映像到任务的虚拟内存空间的库的大小
以test程序为例,使用下面命令可以轻松的查看test程序对于内存的占用
查看进程内存占用命令:
cat /proc/`ps -ef | grep test | grep -v grep | awk '{print $2}'`/status | grep -E 'VmSize|VmRSS|VmData|VmStk|VmExe|VmLib'
如果想要带上时间,命令如下:
cat /proc/`ps -ef | grep test | grep -v grep | awk '{print $2}'`/status | grep -E 'VmSize|VmRSS|VmData|VmStk|VmExe|VmLib' && date
如果想要长时间监控某个程序或者服务的内存占用,则可以用shell脚本来实现:
vim mem_check.sh
#!/bin/sh
touch ./mem_check.log
echo "内存监测: " >> ./mem_check.log
while true
do
cat /proc/`ps -ef | grep test | grep -v grep | awk '{print $2}'`/status | grep -E 'VmSize|VmRSS|VmData|VmStk|VmExe|VmLib' >> ./mem_check.log
date >> ./mem_check.log
echo " " >> ./mem_check.log
sleep 300
done