文章详情页
javascript - JS垃圾回收机制
浏览:191日期:2023-02-23 08:49:53
问题描述
当我们给全局变量赋值null,从而主动解除引用,释放内存,那么这属于引用计数策略吗?不是说JS的垃圾回收机制只用标记清除吗?标记清除策略里就不涉及解除引用吗?
问题解答
回答1:变量声明会在堆上分配内存,将相应引用标记为 null 是可以告诉解释器,这个变量对应的内存空间是可以被回收的。
不过这是 JS 的语法设计,并不涉及到解释器实现中内存管理的细节。实际上,浏览器的 GC 策略也是存在差异的。Chrome / Firefox / Safari 采用标记清除,而旧版 IE 采用引用计数。
并且,解除引用也不仅仅只有赋值 null 的形式。解释器可以通过作用域的方式决定变量的生命周期,在离开变量作用域时回收变量的内存空间。
【标记清除】和【引用计数】是两种不同的 GC 算法,而【解除引用】则是 JS 中的语法特性,二者可以是正交(无关)的。
回答2:js规范是用标记清除,但是实现的话不一定都是标记清除。
而你这里疑惑的原因是因为只看到回收表象,没看清除本质。
引用计数顾名思义就是对对象的引用进行计数,当引用为0时则回收。
而标记清除则分两个阶段,标记阶段从根开始遍历,对于可以访问到的对象比较为可达对象,然后在清除阶段将那些没有被标记的对象回收。
实际上你除非去看源码实现,不然很难从表象看出用的是什么策略。
标签:
JavaScript
相关文章:
1. golang - 用IDE看docker源码时的小问题2. 在windows下安装docker Toolbox 启动Docker Quickstart Terminal 失败!3. python - 有哪些预测算法可以根据实时增量数据更新算法并预测后续数据?4. thinkPHP5中获取数据库数据后默认选中下拉框的值,传递到后台消失不见。有图有代码,希望有人帮忙5. 在应用配置文件 app.php 中找不到’route_check_cache’配置项6. mysql5.7就没有官方性质的详细配置文件吗?求大神告知7. javascript - 如何使用Canvas改变素材的颜色?8. mysql sum去除重复9. node.js - session怎么存到cookie,然后服务器重启后还能获取。数据库不用mongodb或redis,数据库是mysql10. 表单提交验证,没反应,求老师指点
排行榜

网公网安备