1 介绍
像使用C/C++内存管理器不会帮我们自动回收不再使用的内存,如果忘记释放不再使用的内存而不能再被重用,就造成了所谓的内存泄露。
2 进程/proc/{pid}/status文件
- VmSize:
虚拟内存大小。
整个进程使用虚拟内存大小,是VmLib, VmExe, VmData, 和 VmStk的总和。 - VmLck:
虚拟内存锁。
进程当前使用的并且加锁的虚拟内存总数 - VmRSS:
虚拟内存驻留集合大小。
这是驻留在物理内存的一部分。它没有交换到硬盘。它包括代码,数据和栈。 - VmData:
虚拟内存数据。
堆使用的虚拟内存。 - VmStk:
虚拟内存栈
栈使用的虚拟内存 - VmExe:
可执行的虚拟内存
可执行的和静态链接库所使用的虚拟内存 - VmLib:
虚拟内存库
动态链接库所使用的虚拟内存
3 内存泄漏检查工具
3.1 smem
(1)smem是一款命令行下的内存使用情况报告工具,他能够给用户提供Linux系统下的内存使用的多种报告,seme与现有工具不同的是,可以报告PSS情况(实际使用的物理内存(PSS),从而可以衡量虚拟内存系统库和应用程序所占用的内存数量.
(2)大部分的物理内存通常在多个应用程序之间共享的,
- linux系统使用了virtual memory(虚拟内存) ,如果要准确的计算出一个进程实际使用的物理内存就不是那么的简单能做到的.只知道进程的虚拟内存大小其实没有多大的用处,因为没有办法获取到实际分配的物理内存大小.
3.1.1 显示参数说明
RSS-(resident set size):进程占用物理内存大小
- RSS是驻留集合大小,即进程所使用的非交换区的物理内存。
- top命令也可以查询到,最常用的内存指标
- 将各个进程中的RSS值相加后,一般都会超出整个系统的内存消耗,这是因为RSS中包含了各个进程之间的共享内存
PSS-(proportion set size):比例集大小
- 所有使用某共享库的程序均分该共享库占用的内存时,显然所有进程的PSS之和就是系统的内存的使用量,会更准确一些,他将共享内存的大小进行平均后,在分摊到各个进程上去.
USS-(unique set size): 进程独自占用内存
- 只计算进程独自占用的内存大小,不包含任何共享的部分
3.1.2 命令行参数
- smem -p
以百分比的形式报告内存使用情况,可以清楚观察每个进程占用西永的比重是多少* - smem -u
显示系统用户占用内存信息大小
# report
-m, --mappings Report memory usage by mapping.
-u, --users Report memory usage by user.
-w, --system Report systemwide memory usage summary.
# Filter
-M MAPFILTER, --mapfilter=MAPFILTER Mapping filter regular expression.
-P PROCESSFILTER, --processfilter=PROCESSFILTER Process filter regular expression.
-U USERFILTER, --userfilter=USERFILTER User filter regular expression.
# 输出格式
-c COLUMNS, --columns=COLUMNS Columns to show.
-H, --no-header Disable header line.
-k, --abbreviate Show unit suffixes.
-n, --numeric Show numeric user IDs instead of usernames.
-p, --percent Show percentages.
-r, --reverse Reverse sort.
-s SORT, --sort=SORT Field to sort on.
-t, --totals Show totals.
# 输出图形
--bar=BAR Show bar graph.
--pie=PIE Show pie graph.
3.1.3 安装
- 官网http://www.selenic.com/smem下载压缩包或者点击此处下载链接
- unzip smem-1.4.zip
- cp /tmp/smem-1.4/smem /usr/local/bin/
参考
1、Linux 下几款程序内存泄漏检查工具
2、Linux命令smem-内存状态监测工具smem命令
3、linux用smem分析内存占用情况
4、深度讲解Linux内存管理和Linux进程调度-打通任督二脉
5、Linux用户进程内存泄露一种检测方法