内存泄露分析

文章介绍了内存泄漏问题,特别是在用户空间和内核空间中的发生情况。通过malloc/free等函数申请和释放内存,并提到了内核层的kmalloc/kfree以及vmalloc/vfree。文章提供了计算内存使用情况的公式和命令,用于监控进程和slab内存,以及未统计的内存。排查内存泄漏的方法是定位问题类型并追踪相关函数调用。文章还引用了一次内核内存泄漏实战案例作为参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 背景介绍

内存泄漏问题是内存在申请后没有被及时释放导致,这种情况可能发生在用户空间,也可能在内核空间。
在这里插入图片描述

  • 应用层通过 malloc/free 函数,通过 libc 库向 buddy 系统申请/释放内存
  • 内核层通过 kmalloc/kfree 函数,通过 slab 模块向 buddy 系统申请/释放内存
  • 内核层通过 vmalloc/vfree 函数直接向 buddy 系统申请内存,注意这一部分的内存不会被系统统计

2 初步分析

计算公式:MemTotal = MemFree +【Slab+ VmallocUsed + PageTables + KernelStack + HardwareCorrupted + Bounce + X】+【Cached + AnonPages + Buffers + (HugePages_Total * Hugepagesize)】

# 查看进程使用的物理内存
while true; do ps -e -o pid,comm,%mem | sort -n -r -k 3  | head -n 10 ;echo "----------"; sleep 1; done

# 计算使用的slab的内存并排序
while true; do cat /proc/slabinfo | awk '{name=$1; size=$2*$4/4096; printf "%s %lu\n", name, size;}'  | sort -n -r -k 2 | head -n 20; echo "--------------"; sleep 1;done;

# 计算未统计的内存
while true;do cat /proc/meminfo | awk '{if($1=="Active:" || $1=="Inactive:" || $1=="Unevictable:" || $1=="Slab:" || $1=="KernelStack:" || $1=="PageTables:") u+=$2; if($1=="MemTotal:") used+=$2; if ($1=="MemFree:") used-=$2;}END{print used-u}'; sleep 1;done

3 排查思路

首先定位是哪一种内存泄漏,然后根据 trace 手段直接对函数进行分析,找出导致内存泄漏的接口调用。

4 参考资料

  1. 一次解决Linux内核内存泄漏实战全过程 | 谢欢
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hinzer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值