当前位置:首页 > 科技  > 软件

彻底理解内存泄漏,你学会了吗?

来源: 责编: 时间:2024-02-02 09:20:57 273观看
导读大家好,我是小风哥,今天和大家聊一聊内存泄漏这个话题。在这些文章讲到内存申请时我很喜欢用停车场来做类比,内存申请就好比去停车场找停车位,找到停车位后你就可以把车停在这里。从这个类比看什么是内存泄漏呢?内存泄漏看

大家好,我是小风哥,今天和大家聊一聊内存泄漏这个话题。4mQ28资讯网——每日最新资讯28at.com

在这些文章讲到内存申请时我很喜欢用停车场来做类比,内存申请就好比去停车场找停车位,找到停车位后你就可以把车停在这里。4mQ28资讯网——每日最新资讯28at.com

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

然而这其实是不全面的。4mQ28资讯网——每日最新资讯28at.com

4mQ28资讯网——每日最新资讯28at.com

申请过多内存4mQ28资讯网——每日最新资讯28at.com

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

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

4mQ28资讯网——每日最新资讯28at.com

内存无法删除

另一类比较有趣的内存泄漏是说你申请了一些内存,但最终却没有什么指向它们:4mQ28资讯网——每日最新资讯28at.com

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

4mQ28资讯网——每日最新资讯28at.com

在这段代码中我们申请了1k内存,然而当memory_leak函数返回后你就再也不知道这段内存到底在哪里了!4mQ28资讯网——每日最新资讯28at.com

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

4mQ28资讯网——每日最新资讯28at.com

内存碎片

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

假定我们系统中宝贵的内存大小只有8字节,其中有两个字节已经分配出去了,就像这样:4mQ28资讯网——每日最新资讯28at.com

图片图片4mQ28资讯网——每日最新资讯28at.com

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

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

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

图片图片4mQ28资讯网——每日最新资讯28at.com

但在物理内存上可能是这样存放的:4mQ28资讯网——每日最新资讯28at.com

图片图片4mQ28资讯网——每日最新资讯28at.com

可以看到,利用虚拟内存我们可以更加充分灵活的利用“边边角角”的物理内存,从而减少内存碎片带来的影响。4mQ28资讯网——每日最新资讯28at.com

关于虚拟内存更详细的讲解你可以参考《深入理解操作系统》虚拟内存一章,关于公众号“码农的荒岛求生”并回复“操作系统”即可。4mQ28资讯网——每日最新资讯28at.com

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

4mQ28资讯网——每日最新资讯28at.com

内存泄漏带来的问题

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

4mQ28资讯网——每日最新资讯28at.com

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

你的系统会慢到炸是有可能的。4mQ28资讯网——每日最新资讯28at.com

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

当然,根据系统配置,像Linux系统,可能会将消耗内存很多的进程kill掉,这就是Out of Memory killer,简称oom killer。4mQ28资讯网——每日最新资讯28at.com

4mQ28资讯网——每日最新资讯28at.com

内存泄漏检测工具

内存泄漏问题通常比较难直接排查,尤其对于C/C++程序来说,这时我们将不得不借助必要的工具。4mQ28资讯网——每日最新资讯28at.com

有一些专门的工具可以帮助你检测内存泄漏,例如Valgrind、AddressSanitizer和MemorySanitizer。这些工具可以在运行时对程序进行检查,识别出内存泄漏和其他内存错误。4mQ28资讯网——每日最新资讯28at.com

此外针对特定的内存分配器,像jemalloc之类,这些内存分配器自带内存检测工具heap profile,能够有效分析进程内存分配到了地方,并细化到函数级别,非常方便。4mQ28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-71449-0.html彻底理解内存泄漏,你学会了吗?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Vue的缓存组件知道多少?实例代码详解KeepAlive

下一篇: 你真的了解package.json吗?

标签:
  • 热门焦点
  • 俄罗斯:将审查iPhone等外国公司设备 保数据安全

    iPhone和特斯拉都属于在各自领域领头羊的品牌,推出的产品也也都是数一数二的,但对于一些国家而言,它们的产品可靠性和安全性还是在限制范围内。近日,俄罗斯联邦通信、信息技术
  • Java NIO内存映射文件:提高文件读写效率的优秀实践!

    Java的NIO库提供了内存映射文件的支持,它可以将文件映射到内存中,从而可以更快地读取和写入文件数据。本文将对Java内存映射文件进行详细的介绍和演示。内存映射文件概述内存
  • 让我们一起聊聊文件的操作

    文件【1】文件是什么?文件是保存数据的地方,是数据源的一种,比如大家经常使用的word文档、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存数据,它既可以保
  • JVM优化:实战OutOfMemoryError异常

    一、Java堆溢出堆内存中主要存放对象、数组等,只要不断地创建这些对象,并且保证 GC Roots 到对象之间有可达路径来避免垃 圾收集回收机制清除这些对象,当这些对象所占空间超过
  • 共享单车的故事讲到哪了?

    来源丨海克财经与共享充电宝相差不多,共享单车已很久没有被国内热点新闻关照到了。除了一再涨价和用户直呼用不起了。近日多家媒体再发报道称,成都、天津、郑州等地多个共享单
  • 2299元起!iQOO Pad明晚首销:性能最强天玑平板

    5月23日,iQOO如期举行了新品发布会,除了首发安卓最强旗舰处理器的iQOO Neo8系列新机外,还在发布会上推出了旗下首款平板电脑——iQOO Pad,其最大的卖点
  • iQOO Neo8 Pro评测:旗舰双芯加持 最强性能游戏旗舰

    【Techweb评测】去年10月,iQOO推出了一款Neo7手机,该机搭载了联发科天玑9000+,配备独显芯片Pro+,带来了同价位段最佳的游戏体验,一经上市便受到了诸多用
  • 联想小新Pad Pro 12.6将要推出,搭载高通骁龙 870 处理器

    联想小新Pad Pro 12.6将于秋季新品会上推出,官方按照惯例直接在发布会前给出了机型的所有参数。联想小新 Pad Pro 12.6 将搭载高通骁龙 870 处理器,重量为 5
  • DRAM存储器10月价格下跌,NAND闪存本月价格与上月持平

    10月30日,据韩国媒体消息,自今年年初以来一直在上涨的 DRAM 存储器的交易价格仅在本月就下跌了近 10%,此次是全年首次降价,而NAND 闪存本月价格与上月持平。市
Top