ごみ収集


C言語のような低レベル言語では,開発者がメモリ割り当てを直接決定/無効にする.
ただし、アドバンスド言語JavaScriptでは、割り当てられたメモリを追跡し、これらのメモリが不要かどうかを判断し、Garbage Collectionを無効にします.しかし、これは非決定的な問題であり、すべての場合、無駄な集合は動作しません.要するに,JavaScriptのゴミ収集の誤った概念は混乱を招き,システム上の大きな浪費をもたらす可能性がある.
JavaScript開発者は、メモリの割り当てを明示的にキャンセルする必要があります.
JavaScriptごみ収集の核心概念は引用である.
参照しないとごみ収集が機能し,開発者はこの判断を助ける必要がある.判断の二つの条件を理解した.

  • 参考世紀
    世紀アルゴリズムを参照すると、他のオブジェクトを参照しないオブジェクトを使用しないメモリと判断し、不要なセットを実行します.하지만 서로 다른 객체가 서로를 순환하게 참조하면 가비지 컬렉션은 수행되지 않는다. 이를 "순환 참조"라고 한다.

  • Garbage Collectionのタグ付けと書き込み
    表示および書き込みアルゴリズムは、再アクセスできないオブジェクト(再アクセスできない->再参照できない)を不要なメモリと判断し、不要なセットを実行します.
    表示および書き込みアルゴリズムにはrootsという集合があり、rootsから参照されたオブジェクトとそのオブジェクトを参照したオブジェクトをループしてメモリを割り当て、再アクセスできないオブジェクトを判断することでゴミ収集を実行します.
    参照世紀は参照を基準として判断されるため問題となる.보통 함수는 생명 주기가 끝나면 해당 함수 안의 변수들의 메모리 할당도 해제된다. 그러나 클로저 같이 생명주기가 끝난 함수에서 스코프 체인을 타고 올라갔을때, 서로를 순환 참조하고 있는 변수가 있을 경우に割り当てられたメモリがまだ存在するため、ゴミ収集は実行できません.
    参照世紀とは異なり,書き込みアルゴリズムは再アクセスできないオブジェクトによって判断するため,この場合でも無駄な集合を実行する可能性がある.
    function f(){
      var x = {};
      var y = {};
      x.a = y;         // x는 y를 참조한다.
      y.a = x;         // y는 x를 참조한다.
    
      return function(){
        console.log('it works');
      }
    }
    
    const a = f();
    a();
    ループリファレンスの場合でも、アルゴリズムが再アクセスできないオブジェクトと判断した場合、メモリの割り当てが解除されます.
    したがって,これまで多くのブラウザでこのアルゴリズムが採用されてきた.
    しかし,メモリ漏洩の可能性が高く,開発者は明示的または直接的にゴミ収集を実行できない.
  • 2つのアルゴリズムの違いを再まとめます.
    世紀参照:参照できない->参照できるが、近づかないしかない.
    表示と書き込み:再アクセスできない場合->は参照できません.