大家好,我是小风哥,当天和大家聊一聊内存走漏这个话题。
我之前写过好几篇关于内存的文章,在这些文章讲到内寄存开时我很青睐用停车场来做类比,内寄存开就好比去停车场找停车位,找到停车位后你就可以把车停在这里。
从这个类比看什么是内存走漏呢?内存走漏看上去是停车场的车辆只进不出造成最终找不到停车位,从程序员的角度看就是内存只放开取不监禁,假设你去问,或许有不少人以为内存走漏就是这么回事。
但是这其实是不片面的。
首先内存只放开不监禁未必就是内存走漏,有或许是你的程序确实须要放开很多内存,这是反常的,但是假设是bug造成放开了很多内存,这就是内存走漏了,或许也有人将其称为spaceleak,意思是放开的内存超越了反常所需;不论是有意有意,总之在这种状况下你依然坚持对这些内存的援用,因此你总可以找到这些内存并删除它们,就看你删不删。
有很多状况会造成这一疑问,像重复经常使用的某个结构体/对象,当再次复用时没有清算上一次性经常使用遗留的数据、系统中存在cache,但cache的过时战略设置不切当等等。
另一类比拟幽默的内存走漏是说你放开了一些内存,但最终却没有什么指向它们:
在这段代码中咱们放开了1k内存,但是当memory_leak函数前往后你就再也不知道这段内存究竟在哪里了!
用停车场的示例来说就是有些司机太过土豪,家里的车太多以致于把将车放在停车场这件事忘掉了,造成这些车基本就不会有人再开走,因此白白糜费停车位,并造成可用车位越来越少,而关于编程来说就是大意大意的程序员放开了一些内存后最终“忘掉”了,再也不会有什么物品(变量/指针)指向这些内存,因此在这种状况下你没有方法再找到这些内存并将其删除。
这也算的上是一类不凡的内存走漏,用停车场的例子来说就是两个停车位两边停泊了一辆小型老年代步车,造成虽然这两个停车位残余的空间足够大但又恰恰都没有方法再停泊一辆小汽车。
假设咱们系统中贵重的内存大小只要8字节,其中有两个字节曾经调配进来了,就像这样:
如今,系统中闲暇的内存是6字节,下一次性的内寄存开须要调配5字节,蹩脚,咱们曾经没有方法再找到延续的5个字节大小的内存空间了,虽然所有空间的内存还有6字节,这就是所谓的内存碎片疑问。
而关于内存调配器来说假设出现这种状况那么将不得不借助操作系统的协助来扩展堆区,因此看起来咱们的程序占据的内存越来越多,虽然实践上程序或许并不须要那么多内存,仅仅是由于内存碎片的要素造成一局部内存无法被再次被应用起来。
但是关于现代操作系统尤其具有虚构内存才干的系统来说,内存碎片疑问通常或许并不会和咱们构想的那样重大,要素就在于调配的内存只要要在虚构地址空间上延续而不用在物理内存上也延续,假设咱们在虚构内存地址空间须要寄存“aabbccdd”这样的字符串,在虚构地址空间上看这是延续的就像这样:
但在物理内存上或许是这样寄存的:
可以看到,应用虚构内存咱们可以愈加充沛灵敏的应用“边边角角”的物理内存,从而缩小内存碎片带来的影响。
关于虚构内存更具体的解说你可以参考《深化了解操作系统》虚构内存一章,关于群众号“码农的荒岛求生”并回复“操作系统”即可。
假设你的程序须要重复放开很多对象/数据/结构体,并在最后一次性性所有监禁,那么内存池是一个防止内存碎片不错的选用,原理在于虽然从内存池的角度看会有碎片,但当咱们以内存池大小为单位从堆区中放开监禁内存时,这种碎片将不复存在。
关于内存池你可以参考这篇《高性能主机内存池是如何成功的》。
在现代操作系统中除非你的程序运转期间足够长或许放开的内存足够快足够多否则内存走漏或许并不是什么大疑问,你甚至或许都发觉不进去有内存走漏,由于当进程运转完结后其占据的内存会被操作系统收回,在这种状况下你或许不用过于关心这个疑问,但关于长期间运转的主机端程序、数据库程序、操作系统等,内存走漏就属于比拟重大的疑问了,由于这些程序必定时辰在线,任何庞大的内存走漏在期间的加持下都会十分清楚。
假设内存继续走漏那么你的电脑或许会爆炸。。。这。。。当然是无法能的。
你的系统会慢到炸是有或许的。
内存的放开速度会对系统性能发生很大的影响,当系统内存无余时,内存调配器找到一块满足要求的闲暇内存块将愈加艰巨耗时更多,当程序消耗的内存超越物理内存大小时虚构内存系统(假设有的话)开局施展作用,将进程地址空间中不罕用的一局部swap进来,此时系统性能将极速降低,体现进去的就是程序员运转变慢、卡顿。
当然,依据系统性能,像Linux系统,或许会将消耗内存很多的进程kill掉,这就是Out of Memory killer,简称oomkiller。
不像程序解体Coredump,这类疑问经过debug通常能失掉一些线索,但内存走漏疑问就没那么间接了,尤其关于C/C++程序来说,这时咱们将不得不借助必要的工具。
这个群众号里一切的文章都曾经汇总在了Github上,地址,你也可以点击左下方“阅读原文”中转,欢迎访问,求star,哈哈。
本网站的文章部分内容可能来源于网络和网友发布,仅供大家学习与参考,如有侵权,请联系站长进行删除处理,不代表本网站立场,转载联系作者并注明出处:https://clwxseo.com/wangluoyouhua/8791.html