保证闭包中被引用的自由变量不被垃圾回收的方法是引用计数吗?

2018-08-19 17:14:38 +08:00
 vevlins

各类文章都是说因为被引用所以内存没有被清楚,不是除了低版本的 IE 都采用标记清除吗?还是会有结合使用?

闭包内引用的上一级环境的变量对象 parentContext.vo 在 parentContext 出栈之后不应该被标记为无效吗?

还是我理解的标记清除算法有问题? 我的理解是 context 入栈则标记进入,context 出栈则标记无效。

1412 次点击
所在节点    前端开发
3 条回复
vevlins
2018-08-20 14:12:21 +08:00
找到一个博客内的文章说道:

> 垃圾回收器在运行的时候会给存储在内存中的所有变量都加上标记(当然,可以使用任何标记方式)。然后,它会去掉环境中的变量以及被环境中的变量引用的变量的标记(闭包)
vevlins
2018-08-20 14:34:02 +08:00
原因基本明白了,很多地方说的垃圾回收中标记清除算法是错误的。标记清除并非是标记执行栈的进出,而是从根开始遍历,也是一个找引用关系的过程,但是因为从根开始,相互引用的情况不会被计入。

闭包中的作用域链中 parentContext.vo 是对象,被放在堆中。栈中的会随着执行环境进出而销毁,堆中需要垃圾回收
vevlins
2018-08-20 14:42:32 +08:00
修正,闭包内的自由变量会被分配到堆上

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/481191

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX