服务粉丝

我们一直在努力
当前位置:首页 > 财经 >

大白话:聊一聊内存泄漏

日期: 来源:程序员泥瓦匠收集编辑:严长生

点蓝字关注,一起程序员弯道超车之路


内存泄漏是一个比较基础,也比较古老的话题,它是指程序中的无用内存持续堆积,但是又没有得到及时释放,从而导致程序内存占用过高,拖慢了它的运行速度,如果问题严重的话,程序还会直接卡死。


当然,其它程序以及操作系统也会跟着遭殃,都会因为计算机内存资源的耗尽而变成蜗牛,一动不动。

解决内存泄漏的办法也非常简单,就是退出程序,然后重启!

不过对于服务器上的程序,或者计算机的底层组件,频繁地重启是无法接受的,那将导致工作暂停,或者服务中断。所以,大量的内存泄漏是一个非常严重的 Bug,我们必须要足够重视,并且着手解决。

在了解内存泄漏之前,我们先来看一下程序的内存布局。下图是 32 位 Linux 系统下一个进程的内存分段示意图。
在 32 位环境下,一个程序占用 4GB 的内存,其中「内核空间」是被操作系统占用的,我们没法直接操作,只有剩下的那些内存才是被程序占用的,我们才能按需使用。

这里还要留意一下 ① 和 ② 两部分:
  • ② 在程序运行期间会一直存在,直到程序销毁才能被释放;

  • ① 在程序运行期间会不断变化,被不停地分配和释放。


在第①部分中,有一个分段叫做堆(Heap),这才是我们能够随意操作的内存,你可以随时分配,也可以随时释放,属于真正的自由空间。

操作系统不会干预堆区内存,我们只能自己手动管理,如果我们分配了一段内存,后来它用完了,但是我们却没有及时释放,这个时候就会发生内存泄漏。

被泄漏的内存,在程序运行期间会一直存在,并且会持续积累,直到程序运行结束后才会被操作系统一次性回收。

除了堆区,其它区域的内存都由操作系统管理,要么用完即毁,要么一直存在,从来不会发生内存泄漏。

还记得C语言中的 malloc() 和 free() 函数吧,它们就是在堆上分配和释放内存。

下面让我们看一段内存泄漏的代码:
#include #include int main(){    int *pOld = (int*) malloc( sizeof(int) );  //内存块1    int *pNew = (int*) malloc( sizeof(int) );  //内存块2    pNew = pOld;
//free(pOld)和free(pNew)只能调用一个 free(pOld); //free(pNew);
return 0;}
刚开始 pOld 和 pNew 指向两块不同的内存,但是把 pOld 赋值给 pNew 以后,它们就都指向内存块1了。

这个时候你会发现,内存块2没有指针指向它了!

这意味着,我们永远无法知道内存块2的地址了,它就像消失在堆区的海洋里一样,再也找不到了,再也没法释放了。然而,它又实实在在地存在于堆区之中,不能被其它数据占用。

这种内存丢失,就是一种典型的内存泄漏。

上面的代码比较简单,有经验的程序员可以轻松应对,但是在实际开发中,函数之间的调用关系非常复杂,有时候你搞不清应该在什么地方释放内存,所以你干脆就不释放了。

虽然这块内存没有丢失,但是你没有及时释放,它也会成为垃圾内存,随着程序的运行而持续堆积。这也是内存泄漏的一种常见情况。

搞清楚了内存泄漏的概念,你会发现,内存泄漏并不是一种错误,只是一种由于管理不善而导致的潜在隐患。

如果内存泄漏的不多,比如只有 10KB,或者 30MB,那么它就不会影响程序运行,问题就不算严重,甚至你都发现不了。有一些比较宽松的公司,可能压根都不把它当作一个问题。

只有当内存泄漏的足够多了,比如 1GB,或者3GB,这个时候才会影响程序运行,我们才必须要去解决。

内存泄漏是 C/C++ 中最难发现和解决的 Bug,即使非常有经验的程序员,也不能保证自己的程序没有内存泄漏。

帮助解决内存泄漏的办法有很多,比如 Valgrind、Windbg、Address Sanitizer(ASan)内存分析工具,以及 mtrace()、ccmalloc() 函数等,但是它们也只能解决一些常见的问题,对于那些复杂或者罕见的问题往往也力不从心。

另外,它们还比较考验程序员的功力,并不是傻瓜式操作。

总之,内存泄漏是一个困扰 C/C++ 程序员多年的问题,它无法彻底根治,只能去尽力避免。

后来的很多高级语言,比如 Java、Python、JavaScript、C#、PHP 等,都增加了垃圾内存回收机制,这从根本上避免了内存泄漏,程序员再也不用担心内存问题了。

不过垃圾内存回收是有代价的,你需要对内存进行标记,并及时改变它的值,另外还需要额外增加一个线程或者进程,对内存进行实时监控,发现没用的内存就及时回收。




↑ 点击即可关注 


关于我的近况

目前在 SaaS 创业中,如果你想成为技术高管或技术转创业,那必不可少的要懂商业、营销、产品等等。

也可以点击下方去阅读我 SaaS 创业的原创公号分享


相关阅读

  • 农康旅项目的成败在于策划!

  • ▎策划是一种策略、筹划、谋划或者计划、打算,它是个人、企业、组织结构为了达到一定的目的,充分调查市场环境及相关联的环境的基础之上,遵循一定的方法或者规则,对未来即将发生
  • 让键盘发出娇媚“老婆声”,这个神器好烧!

  • 说起来姬宝也算是一个灵魂键盘手,既能在劲舞团里噼里啪啦,也能在祖安文斗中守护全家,只要我敲键盘的速度够快,气势上就已经赢了,赢太多了。曾经有人说过敲键盘没有音效就如同看恐
  • 宝安科技馆在哪里?需要预约吗?

  • 之前我们给大家推送过深圳科技馆盘点(点此查看)今天来单独介绍一下深圳宝安科技馆交通及预约指南▼宝安科技馆简介图源:酷吧深圳市宝安区科技馆(简称:宝安科技馆)于1999年9月
  • 3月15日起,第二批试点恢复!

  • 近期文化和旅游部发布《关于试点恢复旅行社经营中国公民赴有关国家(第二批)出境团队旅游业务的通知》有出境游的宝子们别错过来自:中国政府官网自2023年3月15日起,试点恢复全国

热门文章

  • “复活”半年后 京东拍拍二手杀入公益事业

  • 京东拍拍二手“复活”半年后,杀入公益事业,试图让企业捐的赠品、家庭闲置品变成实实在在的“爱心”。 把“闲置品”变爱心 6月12日,“益心一益·守护梦想每一步”2018年四

最新文章

  • 【项目建议】政策已定调,高标准农田怎么建

  • 耕地是粮食的“命根子”,耕地数量和质量协同发展关乎我国粮食安全与社会稳定。高标准农田建设是巩固和提高粮食生产能力、保障国家粮食安全的关键举措。建设高标准农田,频频出
  • 【乡村振兴模式】乡村振兴的八种发展模式

  • 2023年中央一号文件提出,要“全面推进乡村振兴,加快发农业农村现代化”。要实现乡村产业振兴、文化振兴、人才振兴、生态振兴、组织振兴。全国各地,因地制宜,已涌现出许多新模式
  • 【聚焦新赛道】智慧养殖如何引爆农牧行业升级

  • 长期以来,畜牧业界的投资力度较为薄弱,管理粗放、效率低下、成本较高、环境污染、信息化、智能化程度低等问题较为突出。对于AI、大数据、物联网等新一代信息技术,传统养殖业的
  • 大白话:聊一聊内存泄漏

  • 点蓝字关注,一起程序员弯道超车之路内存泄漏是一个比较基础,也比较古老的话题,它是指程序中的无用内存持续堆积,但是又没有得到及时释放,从而导致程序内存占用过高,拖慢了它的运行
  • 景区规划:从吸引核打造到营运模式设计

  • 对于旅游景区,除了在产业层面进行规划和把控之外,还要从宏观结构下对旅游产品进行设计,包括景区设计、景点设计、旅游休闲体验过程设计、旅游休闲项目设计等,这些设计的核心是游