🌈看完这个,应该能让你了解垃圾回收和内存管理!!!🌈

519 阅读4分钟

本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金。


说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)

作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金

GitHub:P-J27、 CSDN:PJ想做前端攻城狮

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


为什么会有垃圾回收?

我们会分配出去很多内存,当这些内存不会再被用到时,又不能被释放,就会造成内存泄漏。如果这样的情况越来越多,会导致内存不够用而系统崩溃


垃圾回收

JavaScript 也是是使用垃圾回收的语言,也就是说在执行环境(浏览器) 负责在代码执行时管理内存。为了帮开发者卸下了这个负担,js通过自动内存管理实现内存分配和闲置资源回收。这里就不得不提到两种主要的标记策略:标记清理和引用计数


标记清理

JavaScript 最常用的垃圾回收策略是标记清理( mark-and-sweep)。

实现原理:通过判断一个变量是否在执行环境中被引用,来进行标记删除。

具体步骤:

  • 垃圾回收器给所有内存变量进行标记
  • 然后去掉执行环境中和被引用的标记
  • 剩余的都是不会被用到的变量,被垃圾回收器回收。

引用计数

实现原理:跟踪记录每个值被引用的次数,判断当前被引用次数来清理

具体步骤:

  • 当声明变量并将一个引用类型的值赋值给该变量时,则这个值的引用次数加 1。
  • 如果这个值又被赋予给其他变量,该值的引用计数又继续加 1 ,不会终止。
  • 当引用该值的变量被另一个值所取代即引用解除,则该值的引用计数减 1,另外一个值的引用计数加1
  • 计数为0的时候,说明无法在访问这个值了,所有系统将会收回该值所占用的内存空间。
存在的缺陷

两个对象的相互循环引用

在函数执行完成的时候,两个对象相互引用,导致两者的引用计数不等于 0 ,而是依然占据内存,无法回收,当该函数执行多次时,内存占用就会变多,直到系统崩溃


内存管理

我们都知道 分配给 Web 浏览器的可用内存数量通常比分配给桌面应用程序远远少得多

内存不够就不可能得到更好的性能,所以我们选择开源节流。我们尽量让变量占用最少的内存,一般是通过将不用的变量引用释放掉,也叫做解除引用,让其尽快被回收掉,释放内存。

  • 局部变量: 函数执行完变量将自动解除引用。
  • 全局变量: 对于全局变量我们需要进行手动解除。(注意:解除引用并不意味被收回,而是将变量 真正的脱离执行环境,下一次垃圾回收将其收回)
var a = 20; // 在栈内存中给数值变量分配空间 
var a = null; // 使用完毕之后,解除引用,等待回收♻

注意: 从标记清除法的原理分析,只有失去引用的变量才会被标记回收♻️,所用上述例子通过将对象的 引用设置为 null ,此变量也就失去了引用,等待回收♻️。


感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。

写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤

「欢迎在评论区讨论,掘金官方将在掘力星计划活动结束后,在评论区抽送100份掘金周边,抽奖详情见活动文章」。