各类文章都是说因为被引用所以内存没有被清楚,不是除了低版本的 IE 都采用标记清除吗?还是会有结合使用?
闭包内引用的上一级环境的变量对象 parentContext.vo 在 parentContext 出栈之后不应该被标记为无效吗?
还是我理解的标记清除算法有问题? 我的理解是 context 入栈则标记进入,context 出栈则标记无效。
1
vevlins OP 找到一个博客内的文章说道:
> 垃圾回收器在运行的时候会给存储在内存中的所有变量都加上标记(当然,可以使用任何标记方式)。然后,它会去掉环境中的变量以及被环境中的变量引用的变量的标记(闭包) |
2
vevlins OP 原因基本明白了,很多地方说的垃圾回收中标记清除算法是错误的。标记清除并非是标记执行栈的进出,而是从根开始遍历,也是一个找引用关系的过程,但是因为从根开始,相互引用的情况不会被计入。
闭包中的作用域链中 parentContext.vo 是对象,被放在堆中。栈中的会随着执行环境进出而销毁,堆中需要垃圾回收 |
3
vevlins OP 修正,闭包内的自由变量会被分配到堆上
|