V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
vevlins
V2EX  ›  前端开发

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

  •  
  •   vevlins · 2018-08-19 17:14:38 +08:00 · 1406 次点击
    这是一个创建于 2277 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    3 条回复    2018-08-20 14:42:32 +08:00
    vevlins
        1
    vevlins  
    OP
       2018-08-20 14:12:21 +08:00
    找到一个博客内的文章说道:

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

    闭包中的作用域链中 parentContext.vo 是对象,被放在堆中。栈中的会随着执行环境进出而销毁,堆中需要垃圾回收
    vevlins
        3
    vevlins  
    OP
       2018-08-20 14:42:32 +08:00
    修正,闭包内的自由变量会被分配到堆上
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5360 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 07:15 · PVG 15:15 · LAX 23:15 · JFK 02:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.