Linux C/C++ 程序内存泄露排查

前言

由于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官方网站推荐的内存泄露检查工具

制作一个内存泄露检查工具

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值