作者 | 码农的荒岛求生

来源 | 码农的荒岛求生

内存申请就好比去停车场找停车位,找到停车位后你就可以把车停在这里。

从这个类比看什么是内存泄漏呢?内存泄漏看上去是停车场的车辆只进不出导致最终找不到停车位,从程序员的角度看就是内存只申请取不释放,如果你去问,可能有不少人认为内存泄漏就是这么回事。

然而这其实是不全面的。

申请过多内存

首先内存只申请不释放未必就是内存泄漏,有可能是你的程序的确需要申请很多内存,这是正常的,然而如果是bug导致申请了很多内存,这就是内存泄漏了,或者也有人将其称为space leak,意思是申请的内存超过了正常所需;不管是有意无意,总之在这种情况下你依然保持对这些内存的引用,因此你总可以找到这些内存并删除它们,就看你删不删。

有很多情况会导致这一问题,像重复使用的某个结构体/对象,当再次复用时没有清理上一次使用遗留的数据、系统中存在cache,但cache的过期策略设置不得当等等。

内存无法删除

另一类比较有趣的内存泄漏是说你申请了一些内存,但最终却没有什么指向它们:

void memory_leak() {char* mem = (char*)malloc(1024);// just return
}

在这段代码中我们申请了1k内存,然而当memory_leak函数返回后你就再也不知道这段内存到底在哪里了

用停车场的示例来说就是有些司机太过土豪,家里的车太多以至于把将车放在停车场这件事忘掉了,导致这些车根本就不会有人再开走,因此白白浪费停车位,并导致可用车位越来越少,而对于编程来说就是粗心大意的程序员申请了一些内存后最终“忘掉”了,再也不会有什么东西(变量/指针)指向这些内存,因此在这种情况下你没有办法再找到这些内存并将其删除

内存碎片

这也算的上是一类特殊的内存泄漏,用停车场的例子来说就是两个停车位中间停靠了一辆小型老年代步车,导致尽管这两个停车位剩余的空间足够大但又恰好都没有办法再停靠一辆小汽车。

假定我们系统中宝贵的内存大小只有8字节,其中有两个字节已经分配出去了,就像这样:

现在,系统中空闲的内存是6字节,下一次的内存申请需要分配5字节,糟糕,我们已经没有办法再找到连续的5个字节大小的内存空间了,尽管全部空间的内存还有6字节,这就是所谓的内存碎片问题。

而对于内存分配器来说如果出现这种情况那么将不得不借助操作系统的帮助来扩大堆区,因此看起来我们的程序占据的内存越来越多,尽管实际上程序可能并不需要那么多内存,仅仅是因为内存碎片的原因导致一部分内存无法被再次被利用起来。

然而对于现代操作系统尤其具备虚拟内存能力的系统来说,内存碎片问题通常可能并不会和我们想象的那样严重,原因就在于分配的内存只需要在虚拟地址空间上连续而不必在物理内存上也连续,假定我们在虚拟内存地址空间需要存放“aabbccdd”这样的字符串,在虚拟地址空间上看这是连续的就像这样:

但在物理内存上可能是这样存放的:

可以看到,利用虚拟内存我们可以更加充分灵活的利用“边边角角”的物理内存,从而减少内存碎片带来的影响。

如果你的程序需要重复申请很多对象/数据/结构体,并在最后一次性全部释放,那么内存池是一个避免内存碎片不错的选择,原理在于尽管从内存池的角度看会有碎片,但当我们以内存池大小为单位从堆区中申请释放内存时,这种碎片将不复存在。

内存泄漏带来的问题

在现代操作系统中除非你的程序运行时间足够长或者申请的内存足够快足够多否则内存泄漏可能并不是什么大问题,你甚至可能都察觉不出来有内存泄漏,因为当进程运行结束后其占据的内存会被操作系统收回,在这种情况下你可能不必过于关心这个问题,但对于长时间运行的服务器端程序、数据库程序、操作系统等,内存泄漏就属于比较严重的问题了,因为这些程序必须时刻在线,任何微小的内存泄漏在时间的加持下都会非常明显。

内存持续泄漏会发生什么?

如果内存持续泄漏那么你的电脑可能会爆炸。。。这。。。当然是不可能的。

你的系统会慢到炸是有可能的。

内存的申请速度会对系统性能产生很大的影响,当系统内存不足时,内存分配器找到一块满足要求的空闲内存块将更加困难耗时更多,当程序消耗的内存超过物理内存大小时虚拟内存系统(如果有的话)开始发挥作用,将进程地址空间中不常用的一部分swap出去,此时系统性能将快速下降,表现出来的就是程序员运行变慢、卡顿。

当然,根据系统配置,像Linux系统,可能会将消耗内存很多的进程kill掉,这就是Out of Memory killer,简称oom killer。

内存泄漏检测工具

不像程序崩溃Core dump,这类问题通过debug通常能获取一些线索,但内存泄漏问题就没那么直接了,尤其对于C/C++程序来说,这时我们将不得不借助必要的工具。

往期推荐

虚幻引擎5上的《黑客帝国》全新体验,爱了爱了

低代码发展专访系列之七:低代码的火爆需要不一样的声音么?

Log4j 第三次发布漏洞补丁,漏洞或将长存

5G专网,路在何方?

点分享

点收藏

点点赞

点在看

彻底理解内存泄漏,memory leak相关推荐

  1. Windows程序内存泄漏(Memory Leak)分析之UMDH

    小木发现线上的程序通过任务管理器发现内存不断的增长,怀疑是不是内存泄漏呢?用户态内存泄漏可能是句柄泄漏,堆内存泄露,Socket, GDI对象等等.而对于C++程序员来说,碰到最多的无疑是堆内存泄露: ...

  2. Pytorch内存泄漏Memory Leak

    文章目录 1. 问题描述 2. 问题排查 3. 参考 1. 问题描述 在运行程序是,通过要进行压力测试,在程序的各项性能稳定时才可以进行上线,其中主要的性能指标包含cup,内存,显存,这里遇到的问题就 ...

  3. Windows程序内存泄漏(Memory Leak)分析之Windbg

    一.背景 近期有一个项目在运行当中出现一些问题,程序顺利启动,但是观察一阵子后发现内存使用总量在很缓慢地升高, 虽然偶尔还会往下降一些,但是总体还是不断上升:内存运行6个小时候从33M上升到80M: ...

  4. Android 内存管理 Memory Leak OOM 分析

    转载博客:http://blog.csdn.net/vshuang/article/details/39647167 1.Android 进程管理&内存 Android主要应用在嵌入式设备当中 ...

  5. android内存溢出和内存泄漏的区别,Android 内存溢出和内存泄漏以及Leak Canary的使用...

    一.内存泄漏和内存溢出的区别 内存溢出 out of memory:是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory:比如申请了一个integer,但给它存了long才 ...

  6. SQL Server 内存泄露(memory leak)——游标导致的内存问题

    原文:SQL Server 内存泄露(memory leak)--游标导致的内存问题 转自:http://blogs.msdn.com/b/apgcdsd/archive/2011/07/01/sql ...

  7. 性能优化之内存泄露(Memory Leak)常用分析工具(另3种)

    1 LeakCanary(最常用,能监控整个App内存泄漏情况) 1.1 使用LeakCanary // 仅在debug包启用LeakCanary debugImplementation 'com.s ...

  8. 什么是内存溢出(Out Of Memory---OOM)和内存泄露 (Memory Leak)

    1.内存溢出:(Out Of Memory---OOM) 系统已经不能再分配出你所需要的空间,比如系统现在只有1G的空间,但是你偏偏要2个G空间,这就叫内存溢出 例子:一个盘子用尽各种方法只能装4个果 ...

  9. 内存溢出(Memory Overflow)和内存泄露(Memory Leak)的区别

    内存泄漏指你用malloc或new申请了一块内存,但是没有通过free或delete将内存释放,导致这块内存一直处于占用状态 内存溢出指你申请了10个字节的空间,但是你在这个空间写入11或以上字节的数 ...

最新文章

  1. 实例 | 利用犯罪记录聚类和分类暴力行为(附步骤解析)
  2. 国外10大IT网站和博客网站
  3. hdu 3987(最小割的边数)
  4. 推荐一款多功能时间管理神器
  5. uml类图用什么软件画_为什么需要UML类图建模?
  6. css 动态rem_HTML + CSS 为何得不到编程界的认可?
  7. C++学生信息管理系统1.0
  8. Entity Framework 延伸系列目录
  9. Android studio 老虎机小游戏
  10. 伪静态 全站php 跳到html,IIS下万能301跳转方法:URL伪静态重写+PHP301
  11. python处理Excel数据串行串列问题
  12. web控件安装问题解决办法
  13. 超详细|开关电源电路图及原理讲解
  14. 31页智慧文旅云服务平台建设方案【附下载】
  15. JPEG算法 格式压缩方案
  16. 72 ----直纹面、二次直纹面、单叶双曲面、双曲抛物面
  17. MySQL慢SQL探究
  18. 翻译:Pong Game Tutorial
  19. hyperparameters 超参数
  20. [随笔]解决高分屏下软件显示模糊

热门文章

  1. 【学习笔记】第三章——内存 I(交换技术、进程七状态模型、动态分区分配、动态分区算法)
  2. apple ii 模拟器 mac_苹果自研芯片Mac价格曝光
  3. php时间戳本周,php获取今天,昨天,本周,上周,本月,上月的起止时间戳
  4. 改革以来计算机应用发展总结,计算机应用基础总结论文
  5. android属性动画缩放和平移同时,Android 实现属性动画平移,旋转,缩放,渐变 《H》...
  6. 京东广告联盟android,京东APP联盟SDKAndroid版接口说明文档1.0.PDF
  7. python脚本式编程_Python编程入门(一)
  8. 新版:全世界最前沿的125科学问题
  9. EM算法的九层境界:​Hinton和Jordan理解的EM算法
  10. python中lowerright_python字符串,从入门到高阶看这篇就够了