suchen

Heim  >  Fragen und Antworten  >  Hauptteil

javascript – JS-Garbage-Collection-Mechanismus

Wenn wir einer globalen Variablen Null zuweisen, um den Speicher aktiv zu dereferenzieren und freizugeben, handelt es sich dabei um eine Strategie zur Referenzzählung? Bedeutet das nicht, dass der Garbage-Collection-Mechanismus von JS nur Mark und Clear verwendet? Beinhaltet die Mark-Clearing-Strategie keine Dereferenzierung?

扔个三星炸死你扔个三星炸死你2703 Tage vor1076

Antworte allen(2)Ich werde antworten

  • 仅有的幸福

    仅有的幸福2017-07-05 11:04:09

    变量声明会在堆上分配内存,将相应引用标记为 null 是可以告诉解释器,这个变量对应的内存空间是可以被回收的。

    不过这是 JS 的语法设计,并不涉及到解释器实现中内存管理的细节。实际上,浏览器的 GC 策略也是存在差异的。Chrome / Firefox / Safari 采用标记清除,而旧版 IE 采用引用计数。

    并且,解除引用也不仅仅只有赋值 null 的形式。解释器可以通过作用域的方式决定变量的生命周期,在离开变量作用域时回收变量的内存空间。

    【标记清除】和【引用计数】是两种不同的 GC 算法,而【解除引用】则是 JS 中的语法特性,二者可以是正交(无关)的。

    Antwort
    0
  • 代言

    代言2017-07-05 11:04:09

    js规范是用标记清除,但是实现的话不一定都是标记清除。

    而你这里疑惑的原因是因为只看到回收表象,没看清除本质。

    引用计数顾名思义就是对对象的引用进行计数,当引用为0时则回收。

    而标记清除则分两个阶段,标记阶段从根开始遍历,对于可以访问到的对象比较为可达对象,然后在清除阶段将那些没有被标记的对象回收。

    实际上你除非去看源码实现,不然很难从表象看出用的是什么策略。

    Antwort
    1
  • StornierenAntwort