smap文件
smaps文件是Linux的proc文件系统提供的查看系统下运行进程内存使用情况的方法,Linux给每个进程都提供了一个这样的文件,学会查看并分析smaps文件有助于定位和解决诸如内存泄漏、性能瓶颈等内存资源相关问题
利用smap分析进程内存泄漏
测试程序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
printf("hellow memleak test\r\n");
while(1)
{
char * test = (char *)malloc(1024);
memset(test,'1', 1024);
sleep(1);
}
}
代码申请每间隔1S申请一块1024Byte内存
持续打印进程smap文件
00afc000-00b3e000 rw-p 00000000 00:00 0 [heap]
Size: 264 kB
Rss: 136 kB
Pss: 136 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 136 kB
Referenced: 136 kB
Anonymous: 136 kB
AnonHugePages: 0 kB
Swap: 0 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
Locked: 0 kB
间隔几分钟后打印
00afc000-00b5f000 rw-p 00000000 00:00 0 [heap]
Size: 396 kB
Rss: 288 kB
Pss: 288 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 288 kB
Referenced: 288 kB
Anonymous: 288 kB
AnonHugePages: 0 kB
Swap: 0 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
Locked: 0 kB
结论
发现Size,Rss,Pss ,Private_Dirty,Referenced, Anonymous字段大小一直持续增长
Size:表示该映射区域在虚拟内存空间中的大小
Rss:驻留内存大小,是进程当前实际占用的物理内存大小,包括进程独自占用的物理内存、和其他进程共享的内存
Private_Dirty:已被改写的私有页面的大小。
referenced:当前能够被引用到的内存,以及当前可达的内存
Anonymous:表示当前没有与文件联系在一块的内存,也就是说没有作为交换
可以初步定位该进程存在内存泄漏,进而对其使用asan,Valgrind