JavaScript垃圾回收策略

举报
青年码农 发表于 2022/08/25 00:49:57 2022/08/25
【摘要】 前段时间,面了不少公司,不少面试官都会问到JavaScript垃圾回收。说实话,平时还真的了解不多,最近正在看“JavaScript高级程序设计”,从头把基础再巩固下。 JavaScript 是使用垃圾回收的语言,通过自动内存管理实现内存分配和闲置资源回收。基本思路很简单:垃圾收集器会按照固定的时间间隔或代码执行中预定...

前段时间,面了不少公司,不少面试官都会问到JavaScript垃圾回收。说实话,平时还真的了解不多,最近正在看“JavaScript高级程序设计”,从头把基础再巩固下。

JavaScript 是使用垃圾回收的语言,通过自动内存管理实现内存分配和闲置资源回收。基本思路很简单:垃圾收集器会按照固定的时间间隔或代码执行中预定的收集时间,周期性地执行操作--找出不再继续使用的变量,然后释放其占用的内存。如何找出不再继续使用的变量,浏览器发展怎么多年,出现了几种不同的实现方案,标记清理和引用计数。今天简单说说 JavaScript 最常用的垃圾回收策略 -【标记清理】。

标记清理

标记清理(mark-and-sweep)。当变量进入上下文,比如在函数内部声明一个变量时,

let a = 1
  

这个变量会被加上存在于上下文中的标记。而在上下文中的变量,逻辑上讲,永远不应该释放它们的内存,因为只要上下文中的代码在运行,就有可能用到它们。当变量离开上下文时,也会被加上离开上下文的标记。

我们可以手动释放:


   
  1. let a = 1
  2. // 释放
  3. a = null

给变量加标记的方式有很多种。比如,当变量进入上下文时,反转某一位;或者可以维护“在上下文中”和“不在上下文中”两个变量列表,可以把变量从一个列表转移到另一个列表。标记过程的实现并不重要,关键是策略。垃圾回收程序运行的时候,会标记内存中存储的所有变量(记住,标记方法有很多种)。然后,它会将所有在上下文中的变量,以及被在上下文中的变量引用的变量的标记去掉。在此之后再被加上标记的变量就是待删除的了,原因是任何在上下文中的变量都访问不到它们了。随后垃圾回收程序做一次内存清理,销毁带标记的所有值并收回它们的内存。

还有种不太常用的垃圾回收策略-引用计数(reference counting)。引用计数的含义是跟踪记录每个值被引用的次数。由于不太常用,我们这里就不多介绍。

上面的内容,基本可以在“JavaScript高级程序设计”找到,感兴趣的可以读一读这本书,收获还是蛮大的,之后有时间,我会把书中的知识点整理,总结在公众号中,现在已经整理了一部分,后期会不定时更新。

文章来源: blog.csdn.net,作者:NMGWAP,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/NMGWAP/article/details/125067347

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。