Linux内存分为物理内存和虚拟内存。
物理内存是指实际的内存。
虚拟内存是指根据系统需要从硬盘中虚拟的划出一部分存储空间。是一种计算机系统的管理技术。
一般内存泄漏是指虚拟内存使用后没被释放,导致映射的实际存储空间被占用后释放不了,不能再次被使用。所以内存泄漏是看虚拟内存有没有持续增加。
内存使用情况可以用 ps aux命令查看,执行后可以看到以下结果:
==========================================
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1921 0.4 0.6 11384 1036 ? Sl 11:10 0:00 process
==========================================
※VSZ就是虚拟内存,RSS就是实际内存。
一般产品发布前会做running测试,看看有没有内存泄漏的倾向。
running时,可以写个脚本(sh),把内存情况记录在文件中方便查看,简单例:
=========================================================================
while true;
do
path="/home/mem/memchk.txt"
touch "/home/mem/memchk.txt"
echo "USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND">>$path
ps aux | grep -m 1 process1>> $path
ps aux | grep -m 1 process2>> $path
ps aux | grep -m 1 process3 >> $path
# 100min once
sleep 6000
fi
done
※注意存储容量,限定退出时间或超过一定容量后覆盖
=========================================================================
结果:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1921 0.4 0.6 11384 1036 ? Sl 11:10 0:00 process1
root 1924 1.1 0.4 10244 652 ? Sl 11:10 0:00 process2
root 1942 0.9 1.0 7112 1684 ? Sl 11:10 0:00 process3
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1921 0.1 0.6 11384 1036 ? Sl 11:10 0:00 process1
root 1924 1.1 0.4 10244 652 ? Sl 11:10 0:07 process2
root 1942 0.7 1.0 7112 1684 ? Sl 11:10 0:04 process3
=========================================================================※如果数据比较多可以拷贝到excel上生成折线图来看会直观一点。
running时,虚拟内存是稳定的,有增减,但不会一直增加。
如果发现虚拟内存有持续增加的倾向,就有可能内存泄漏,可以分析有没有使用完没有释放的做法。
比如
open没做close,Malloc没做Free等。
养成好的编程习惯会减少很多内存泄漏的错误,大量减少后续开发时间。
※物理内存有时也会增加,这是因为有些路径还没有被跑到过,新跑时使用的内存会新分配,重复跑到不会增加,就没有问题。