Linux 内核技术实战课
邵亚方
前蘑菇街技术专家,Linux Kernel 活跃贡献者
23704 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 26 讲
Linux 内核技术实战课
15
15
1.0x
00:00/00:00
登录|注册

06 基础篇 | 进程的哪些内存类型容易引起内存泄漏?

查看进程内存的方法
进程内存类型的区分
进程的虚拟内存与物理内存
/proc/meminfo
pmap命令
top命令
Paging(分页)过程
内存类型汇总表
库函数和系统调用
内存申请释放相关的函数
课后作业
课堂总结
观察进程的内存
物理内存分配
进程地址空间
进程的内存类型容易引起内存泄漏

该思维导图由 AI 生成,仅供参考

你好,我是邵亚方。今天我们进入课程的第二个模块,来聊一下内存泄漏的话题。
相信你在平时的工作中,应该遇到过下面这些场景:
伴随着服务器中的后台任务持续地运行,系统中可用内存越来越少;
应用程序正在运行时忽然被 OOM kill 掉了;
进程看起来没有消耗多少内存,但是系统内存就是不够用了;
……
类似问题,很可能就是内存泄漏导致的。我们都知道,内存泄漏指的是内存被分配出去后一直没有被释放,导致这部分内存无法被再次使用,甚至更加严重的是,指向这块内存空间的指针都不存在了,进而再也无法访问这块内存空间。
我们平时遇到的内存泄漏可能是应用程序的内存泄漏,也可能是内核(操作系统)的内存泄漏;而应用程序的内存泄漏可能是堆内存(heap)的泄漏,也可能是内存映射区(Memory Mapping Region)的泄漏。这些不同类型的内存泄漏,它们的表现形式也是不一样的,解决方案也不一样,所以为了更好地处理内存泄漏问题,我们首先就需要去了解这些不同的内存类型。
这些不同的内存类型都可以理解为是进程地址空间 (Address Space) 的一部分,那地址空间是怎么工作的呢?

进程的地址空间

我们用一张图,来表示进程的地址空间。图的左侧是说进程可以通过什么方式来更改进程虚拟地址空间,而中间就是进程虚拟地址空间是如何划分的,右侧则是进程的虚拟地址空间所对应的物理内存或者说物理地址空间。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文详细介绍了进程的内存泄漏可能涉及的类型和相关知识。首先介绍了进程的地址空间、内存申请释放相关的函数以及不同的内存类型,包括私有匿名内存、共享匿名内存、私有文件映射和共享文件映射。进程虚拟地址空间通过Paging方式映射为物理内存,而虚拟地址空间同样存在内存泄漏的问题。了解了地址空间的相关知识后,读者可以对进程的地址空间做合理规划和控制。文章还介绍了观察进程内存的工具,如top和pmap,以及如何通过/proc/meminfo观察进程分配的内存和系统指标的关联。最后,总结了进程内存管理相关的基础知识,包括进程的虚拟内存与物理内存、进程内存类型的区分以及查看进程内存的方法。整体而言,本文为读者提供了深入了解和处理内存泄漏问题的基础,对于需要处理进程内存泄漏问题的技术人员具有重要参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Linux 内核技术实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(8)

  • 最新
  • 精选
  • Geek_9bf0b0
    邵老师,对于私有文件映射的页面是file page还是anon page,是要区分文件本身是否可写入权限的吧。 如果该文件是不可写的,那么内核应该会把该页面归为file page。 do_read_fault() do_set_pte(vma, address, fault_page, pte, false, false) 如果该文件是可写入的,那么内核会将相应文件高速缓存页面的内容复制到新的页面中,并将新页面归为anon page。 do_cow_fault() do_set_pte(vma, address, new_page, pte, true, true)

    作者回复: 很赞!你理解的很对,如果是读的话,那读出来的内存其实是跟file cache共享的,只有真正去写他的时候,才会真正分配给进程地址空间private的内存,这个细节我疏于描述了,你在这里能够指出来很赞!另外,看得出来你对内核代码研究的也很深入,加油!

    2020-09-03
    3
    20
  • jssfy
    凡是私有的内存都会体现在 /proc/meminfo 中的 AnonPages 这一项: 私有的也有文件映射,感觉体现在anonpages里有点想不通

    作者回复: 私有文件映射会把文件内容给读到进程地址空间,但是由于这个映射是私有的,也就是其他进程不可见,所以它的内容不会回写到文件,所以内核会把它的属性设置为anonpage。你可以写个测试用例来看看是不是这样。

    2020-09-01
    7
  • ray
    老师您好, 请问我们平常看到的RSS(进程实际占用的物理内存)会包含shared memory吗? 谢谢老师的解答^^

    作者回复: 会包含的。RSS是指进程地址空间已映射的物理内存,这个物理内存有可能是Shared方式来映射的,那这块物理内存就是Shared memory。也就是说RSS的本质是物理内存是否映射到了进程的地址空间,而和映射属性无关。

    2020-09-05
    5
  • 伟伟
    老师好,想请问一下c的函数名后面带个小括号,里面有个数字,这个是什么意思呢,比方说malloc(3),其他内核的书里也经常看到

    作者回复: 后面的数字代码该函数/命令所属的领域,比如: 1 - 用户命令 2 - 系统调用 3 - 库函数 等等 可以参考: https://www.kernel.org/doc/man-pages/

    2021-08-20
    2
    3
  • 我能走多远
    mmap映射了1g的虚拟内存。在使用中,如果大页是2M大小。哪是不是物理内存不是连续的

    作者回复: 嗯 只能保证2M是物理内存连续的 整个的1G是由很多2M连续物理内存组成。

    2020-10-20
    2
  • Geek_b8749d
    邵老师,在代码中调用read接口读文件,文件的内容会进入pagecache吧,这部分内存包含在top中的VIRT中吗?可以让read接口读文件时文件内容不进入pagecache吗?
    2021-01-30
    1
    1
  • Bachue Zhou
    老师,请教下,00007ffd9d30f000 132 40 40 rw--- [ stack ] 像这种 stack 内存,一定不会是文件映射吧?那这种情况下,为什么 dirty pages 不是 0 呢?Dirty page 对于非文件映射的内存代表什么含义呢?
    2022-06-17
  • 姑射仙人
    RES和RSS是怎样的关系?
    2021-11-08
    2
收起评论
显示
设置
留言
8
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部