C/C++程序内存泄露排查
- 前言
- Linux系统内存泄露检查
- 系统内存监控
- 进程内存监控
- 进程内存泄露点定位
- 已有的内存泄露检查工具
- 制作一个内存泄露检查工具
前言
由于C/C++程序可以动态申请内存,动态申请的内存位于程序的队区,如果程序比较复杂,程序员在编写代码的时候不小心,可能会存在申请了内存没有释放的情况,程序长期运行,会导致系统中用户程序可分配堆内存越来越少的,最终程序OOM崩溃。
Linux系统内存泄露检查
系统内存监控
/proc/meminfo 文件保存了系统内存使用情况,
MemTotal: 498364224 kB
MemFree: 341371712 kB
MemAvailable: 431430528 kB
Buffers: 3456 kB
Cached: 89801856 kB
SwapCached: 0 kB
Active: 36263872 kB
Inactive: 78312192 kB
Active(anon): 24965120 kB
Inactive(anon): 212352 kB
Active(file): 11298752 kB
Inactive(file): 78099840 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 4194240 kB
SwapFree: 4194240 kB
Dirty: 512 kB
Writeback: 0 kB
AnonPages: 24776320 kB
Mapped: 157504 kB
Shmem: 406720 kB
Slab: 11619072 kB
SReclaimable: 3734336 kB
SUnreclaim: 7884736 kB
KernelStack: 34128 kB
PageTables: 69632 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 240269120 kB
Committed_AS: 59814336 kB
VmallocTotal: 549755813888 kB
VmallocUsed: 0 kB
VmallocChunk: 0 kB
HardwareCorrupted: 0 kB
AnonHugePages: 0 kB
ShmemHugePages: 0 kB
ShmemPmdMapped: 0 kB
CmaTotal: 25165824 kB
CmaFree: 25165824 kB
HugePages_Total: 12800
HugePages_Free: 12800
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
其中 MemAvailable 可以用来评估系统当前应用程序可用的内存,定时监控该数据并显示出来便可得到系统内存使用曲线。
进程内存监控
系统可用内存一直减少时,说明系统中正在运行的程序有内存泄露,但还需要进一步确定是哪个程序在泄露。
/proc/{pid}/cmdline 里面记录了某一个进程(进程号为pid)的启动名称,这个名称就是进程的名字,因此遍历/proc文件夹下的所有进程文件夹就能找到与进程名字对应的进程PID。
/proc/{pid}/status 文件记录了进程的详细信息,其中 VmSize代表进程现在正在占用的内存,VmRSS是程序现在使用的物理内存,VmData:表示进程数据段的大小,Threads:表示当前进程中的线程个数,/proc/{pid}/smaps也存有进程更加详细的内存信息,Rss:是实际分配的内存,这部分物理内存已经分配,不需要缺页中断就可以使用的,Pss(proportional set size):是平摊计算后的实际物理使用内存(有些内存会和其他进程共享,例如mmap进来的)。以上数据对于进程内存监控和排查都具有重要意义
进程内存泄露点定位
已有的内存泄露检查工具
常用的内存泄露检查工具
Linux官方网站推荐的内存泄露检查工具