《Linux内核技术实战课》总结二:内存泄漏

本文主要探讨了Linux内核内存泄漏问题,包括内存泄漏的定义、系统假死的场景、Shmem的匿名共享内存特性。文章指出,内存泄漏可能导致系统假死,尤其是堆和匿名共享内存的泄漏。解决方案包括减少OOM时的日志打印,限制内核消耗的内存,以及使用工具如kmemleak分析内核内存泄漏。通过观察/proc/meminfo、top、pidstat等工具,可以帮助定位和解决内存问题。
摘要由CSDN通过智能技术生成

总览

内存泄漏:内存被分配出去后 一直没有被释放,导致这部分内存无法被再次使用,更严重的是,指向这块内存空间的指针都不存在了,进而再也无法访问这块内存空间

场景:服务器中的后台任务持续运行,系统中可用内存越来越少; 应用程序正在运行时忽然被 OOM kill 掉了; 进程看起来没有消耗多少内存,但是系统内存就是不够用了

在遇到系统内存不足时,首先要做的是查看 /proc/meminfo 中哪些内存类型消耗较多,然后再去做针对性分析

泄漏的内存可能是应用程序的内存泄漏、内核(操作系统)的内存泄漏;
应用程序的内存泄漏可能是堆内存(heap)的泄漏,也可能是内存映射区 (Memory Mapping Region)的泄漏;
不同的内存类型都可以理解为是进程地址空间 (Address Space) 的一部分:
在这里插入图片描述

四种内存类型:从是不是文件映射, 以及是不是私有内存这两个不同的维度来做区分
1 私有匿名内存:进程的堆、栈,以及 mmap(MAP_ANON | MAP_PRIVATE) 这种方式申请的内存都属于这种类型的内存。其中栈是由操作系统来进行管理的,应用程序无需关注它的申请和释放;堆和私有匿名映射则是由应用程序(程序员)来进行管理的,它 们的申请和释放都是由应用程序来负责的,所以它们是容易产生内存泄漏的地方。
2 共享匿名内存:进程通过 mmap(MAP_ANON | MAP_SHARED) 这种方式来申请的内 存,比如说 tmpfs 和 shm。这个类型的内存也是由应用程序来进行管理的,所以也可能会发生内存泄漏
3 私有文件映射:进程通过 mmap(MAP_FILE | MAP_PRIVATE) 这种方式来申请的内存, 比如进程将共享库(Shared libraries)和可执行文件的代码段(Text Segment)映射到自己的地址空间就是通过这种方式。对于共享库和可执行文件的代码段的映射&

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值