内存管理的总结(不同内存管理方式的聪明程度大)
内存管理的总结(不同内存管理方式的聪明程度大)
2024-06-01 01:48:24  作者:緈諨錠  网址:https://m.xinb2b.cn/tech/aqo323910.html

代码要在计算机上跑起来,需要一系列计算机资源:内存、网络端口、打开的文件等等,这些资源一起被叫做进程,接下来我们就来聊聊关于内存管理的总结?以下内容大家不妨参考一二希望能帮到您!

内存管理的总结(不同内存管理方式的聪明程度大)

内存管理的总结

代码要在计算机上跑起来,需要一系列计算机资源:内存、网络端口、打开的文件等等,这些资源一起被叫做进程。

进程有一个专门的控制块来记录这些资源,叫做进程控制块(PCB)。

这些资源里面最重要的就是内存了,进程启动的时候会向操作系统申请一些内存。

如果内存是无限的,那么我们在上面放数据、代码等,不用担心不够用,但可惜内存是有限的,我们要把用不到的内存及时的回收掉,用来放别的东西,这样代码才能正常的运行。

内存分为代码区、全局数据区、堆区、栈区等,这是操作系统可执行文件的内存模型,如果是 javascript、java 这种解释型语言,那还会再做自己的一些划分。但总体来说,都是分为这几部分。

图片

代码区的内容基本不变。

栈区存放随着函数调用而声明的局部变量,每个函数一个栈帧,它是有上限的,调用层次过深会栈溢出。

全局数据区存放全局变量。

栈区和全局数据区中的大对象会存放在堆上,只留一个引用。

堆区存放动态分配的大对象,占内存最多,我们内存管理也主要是管理堆内存。

为了管理好这一亩三分地的堆内存,不同的语言有不同的方式,聪明程度各不相同,我们来看一下谁更聪明吧:

C、c

C、C 的内存都是程序员手动管理的,比如 C 的 class 有构造函数和析构函数,构造函数里申请内存,析构函数里面就把这些内存释放掉。

图片

是否漏掉一些内存没释放取决于程序员,很看程序员水平。

腾讯之前是大规模用 C 做服务端开发的,但是后来也逐渐转向 go、java 了,因为 C 这种手动管理内存的方式,万一某个程序员漏掉了一些内存没释放,那就内存泄漏了。(内存泄漏就是不再使用的内存一直占用着,导致可用内存减少),而服务器是长时间跑的,轻微的内存泄漏逐渐积累最终都会导致进程崩溃。

靠程序员来保证释放掉不用的内存太难了,如果程序能自己回收这些垃圾内存就好了,那就解放了程序员了,代码可靠性也更高。所以后来的高级语言基本都有了自动的垃圾回收机制。

java、javascript

c 那种手动管理内存的方式太麻烦了,所以 java 和 javascript 设计之初就不让程序员操作内存,而是自己做了一套垃圾回收机制,定期把没用的内存释放下。

怎么检测哪些内存没用呢?最开始的思路是对每个对象都记录下引用数,如果没有被引用了,那就可以回收了,这种思路叫引用计数。

但是这个思路有个问题,万一两个对象你引用我我引用你,并且都没被别的对象引用,这种循环引用的问题检查不出来。

看来这种方式还不够聪明。怎么优化呢?

从全局的对象开始,把所有引用的对象标记一遍,没被标记的就清掉。这样不管是没被引用的,还是循环引用但是都没被别的对象引用的,都可以检查出来,这种思路叫做标记清除。

标记清除的思路更聪明些,所以现在的 js 引擎基本都用这个思路。

这样的内存管理思路其实也是存在问题的,万一有的不用的对象被放到全局了,那就永远不会回收了。这种也会内存泄漏。

这个只能靠程序员排查了,通过工具把一些不该放到全局的变量给找出来。

js 的内存泄漏排查一般都是用 chrome devtools 的 memory 工具,他可以取到某个时间点的内存快照,做一些操作后,再取一次内存快照,两个内存快照对比下就能找出增加了哪些全局变量。然后定位到那段内存泄漏的代码。

比如这样一段代码:

图片

5s 后在全局声明一个变量 aaa,是正则表达式类型。

我们用 chrome devtools 的 memory 工具分别取两次快照。

图片

这里有不同的视图,我们选择比较视图来对比两个快照:

图片

可以看到 delta 那一列,显示了正则表达式的对象 1,这就是我们定时器里声明的那个全局变量。

图片

通过这种内存快照的对比,就可以定位什么操作导致的内存泄漏,进而定位到代码。

自动的垃圾回收避免了程序员没有释放一些内存导致的泄漏,但是仍然会有把没用的对象放到全局导致的泄漏。这种方案比较聪明,但也是有问题的。

rust

rust 也不需要程序员手动管理内存,但也没有垃圾回收,却把内存管理的更好,而且能避免 99% 的内存泄漏问题。它是怎么做到的呢?

rust 觉得堆中的对象之所以难管理就是因为被太多地方引用了,如果限制了对象只能属于某个函数,只能有一个引用,别的引用自己复制一份去,这样函数调用结束就可以把用到的堆中的对象全部回收了,根本不会留下垃圾。这种思路叫做所有权机制。

所有权机制通过限制对象的引用的方式来做到了不需要垃圾回收器也能很好的管理内存。而且也没有 js 那种不小心把对象放到全局就会内存泄漏的问题。

rust 的所有权机制是更聪明的一种内存管理方式,也是因为这个原因,rust 正变得越来越火。

总结

进程的可用内存是有限的,需要及时把不再用到的变量的内存释放掉,不同语言对内存管理的方式不同,聪明程度不同:

c、c 是靠程序员自己管理内存的,万一不小心某个内存没释放就泄漏了。

java、javascript 则是不让程序员自己管理,有专门的垃圾回收器,最开始通过引用计数,后来改成了标记清除,通过这种方式来找到没用的内存释放掉。

但万一把没用的对象放到了全局,那就回收不了了,这种就是内存泄漏,需要用 chrome devtools 的 memory 工具记录两次快照,然后做 diff,通过看内存是否增加来定位到导致内存泄漏的代码。

rust 也不用程序员手动管理内存,但也没有垃圾回收器,它限制了对象只能有一个引用,这样函数调用结束就可以把对象回收掉,根本不会留下垃圾,而且也避免了把没用的对象放到全局的那种内存泄漏(因为只允许一个引用)。

语言的发展规律就是这样,让程序员做的事情更少,也让程序的健壮性更高。这需要更聪明的语言设计,更强大的编译器/解释器。

  • 京都动画作品有哪些(这些你都看过吗)
  • 2024-06-01这些你都看过吗《CLANNAD》-2007年根据Key社游戏改编的动画作品《CLANNAD》,是一部非常温馨的动画作品讲述的是男主因为家庭原因变成了不良少年,过着潦倒的生活,但在认识女主,跟她一起所经历的的日常后,。
  • 白鹤灵芝的功效与作用(白鹤灵芝的功效与作用是什么)
  • 2024-06-01白鹤灵芝的功效与作用是什么白鹤灵芝性凉味甘美芳香,主入肺、肝、胃、大小肠诸经,有降火、润肝、清肺热、消炎等功效,为最佳青草茶原料,冷热饮俱佳此外,本品还用于疮疖痈肿,有解毒消肿之功白鹤灵芝还可当刀伤出血外敷止血良药,据先祖指称。
  • 不同动漫角色明信片(不止是献给动画)
  • 2024-06-01不止是献给动画小编我是个喜欢瞎琢磨的人前几天打开微信,看到一个公众号上《小欢喜》的影评,说这个片子反应了时代当下国内普通中产阶级的焦虑和彷徨:家长生怕自己小孩会输在起跑线上,从小逼迫他们学这个那个,小孩没考第一名好。
  • 芝麻信用服务协议是什么(芝麻信用服务协议)
  • 2024-06-01芝麻信用服务协议文|邓学平突然之间,一条《小心!支付宝年度账单可能让你不知不觉签了个服务协议》的信息刷爆朋友圈不看不知道,一看吓一跳原来支付宝年度账单的下面,隐藏着一个《芝麻服务协议》,并且默认勾选了同意此事发酵后,。
  • pdd逆水寒还玩么(PDD时代变了逆水寒真成好玩不花钱了)
  • 2024-06-01PDD时代变了逆水寒真成好玩不花钱了PDD的老兵服之旅PDD回归《逆水寒》魔兽老兵服了,但似乎他的游戏生涯并非一帆风顺在一众主播里,PDD可以说是最知名的MMO死忠之一了而其中最为人熟知的,还是他《逆水寒》神壕的身份,当初为了打造账号“。
  • 四款公认无差评手机(当下最佳4款无差评)
  • 2024-06-01当下最佳4款无差评说来也是有趣,自从进入智能手机行业以来,身边很多朋友总会时不时咨询侃哥一些手机的事情,其中也会闹出不少笑话就比如最近大家都准备换新机,很多人就很疑惑,为什么各家都说好,但实际体验却并不怎么样其实这里面。
  • 肝脏最大的作用与功能(肝脏总是深藏功与名)
  • 2024-06-01肝脏总是深藏功与名如果把大脑比作人体的“司令部”,把心脏比作“动力泵中心”,那肝脏就是人体的“化学加工厂”那么,人们的肝脏到底是如何“工作”的呢?具体有哪些功能呢?3月16日,医护人员通过肝脏解剖图为居民讲解爱肝护肝知。
  • 动词变过去式30个(行为动词的一般过去时)
  • 2024-06-01行为动词的一般过去时M8语法:行为动词的一般过去时的构成;v原形变为v过去式的规则变化1.行为动词的一般过去时的构成肯定句:主语v过去式其他.否定句:主语didn'tv原形其他一般疑问句:Did主语v原形其他?肯。
  • 宋朝为什么南渡(第一次衣冠南渡后)
  • 2024-06-01第一次衣冠南渡后公元311年,匈奴大军攻破西晋京师洛阳,立国仅四十多年的西晋王朝就这样匆匆走向了历史的终点由于中原地区沦入外族之手,再加上战乱及局势动荡不安,许多原本定居在北方的汉人选择逃往南方,这便是中国历史上的第。
  • 青春期叛逆心理讲座演讲稿(博雅讲坛教师篇)
  • 2024-06-01博雅讲坛教师篇合肥一六八玫瑰园学校秉承“把每一位学生都放在心上”的办学理念学校着眼于学生终生可持续发展,为学生幸福人生奠基,自开设“博雅讲坛”以来,以专业知识引领家校共育,丰富了家长家庭教育知识,提高了家校共育的水。
  • 丰田rav4和大众途岳哪个值得入手(新车汉兰达小弟)
  • 2024-06-01新车汉兰达小弟文:懂车帝原创周桐[懂车帝原创2021广州车展]丰田卡罗拉在经历了55年12代车型的演变后,绝对称得上是汽车行业里的“常青藤”而在广州车展前夕,基于轿车打造而来的一汽丰田卡罗拉Cross版车型正式对外。
  • 回家不见爹和娘(走娘家陪爹娘去赶集)
  • 2024-06-01走娘家陪爹娘去赶集大姨一共两子两女,大表姐比我娘大许多,只是我与她从未见过面,听娘说她跟大姨很像二表姐我见过,跟娘年龄差不多,儿女双全,如今在县城生活,也已多年未见大表哥身体不好,一生未婚,而后早逝只有这个二表哥每年都。