[コンピュータ工学]ごみ収集(Javascript)


💡 メモリ管理が必要な理由


ほとんどの言語では、メモリライフサイクルは메모리 할당 → 메모리 사용 → 메모리 해제段階を経験します.
Cのような低レベル言語では、開発者はmalloc()またはfree()を使用してライフサイクルを直接管理する必要がありますが、JavaScriptのような高度な言語ではGarbage Collection이라는 자동 메모리 관리を使用することが多いので、開発者は特に気にしません.

💡 ごみ収集

  • ゴミ収集は、使用されなくなったメモリを発見し、メモリを自動的に解放する役割を果たす.
  • ゴミ収集は自動的にメモリ管理を行い、開発者が全く気にしないとメモリ漏れが発生する可能性があります.
    メモリリークとは、アプリケーションで使用しなくてもメモリが解放されない状態です.
  • 💡 ごみ収集の主なアルゴリズム


    1. Reference-counting

  • アルゴリズムが任意の値をどこでも参照(参照)していない場合、GCはその値を不要な値と見なして削除する.
  • 📌 Case(1)
    // people 변수는 해당 object를 참조한다 .
      let people = {
        name: "Jane"
      };
      //null값을 재할당한다.
      people = null;
    {name: "Jane"}この値は参照されなくなり、GCによってメモリが解放されます.
    📌 Case(2)
      // people 변수는 해당 object를 참조한다 .
      let people = {
        name: "Jane"
      };
      //girl에 people의 참조중인 값의 주소를 할당한다.
      girl = people;
      //people에 null을 할당한다.
      people = null;
    peopleは{name: "Jane"}を参照しないが、girlはそれを参照しているため、object는 여전히 메모리에 남아있게 된다.📌 Case(3)
    // people 변수는 해당 object를 참조한다 .
    let people = {
      name: "Jane"
    };
    //girl에 people의 참조중인 값의 주소를 할당한다.
    girl = people;
    //people에 null을 할당한다.
    people = null;
    //girl에 null을 할당한다.
    girl = null;
    上記のコードのようにpeople,girlにnullが割り当てられている場合、{name: "Jane"}を参照する場所はないので、해당 값은 GC에 의해 처리된다.📣 しかし、循環参照(Circular reference)を使用すると、reference-カウント方式が大量の漏洩を招く要因になるという問題がある.次のサンプルコードです.
      function couple() {
          const jane = {};
          const sam = {};
    
          // jane.bf는 sam을 참조한다
          jane.bf = sam;
    
          // sam.gf는 jane을 참조한다
          sam.gf = jane;
    
          return 'circular';
      }
    
      couple();
    
    couple()関数は呼び出しが終了した後も必要な値ではありませんが、互いの参照がまだ存在するため、GCはこれらの値のメモリを解放するのではなく、メモリに残ります.これらのループリファレンスは、メモリの漏洩の主な原因と言えます.

    2. Mark-and-sweep


    上記のreference-カウントの問題は不要な値です
    参考資料があれば、その記憶は解除されません.これに対して、Mark and Sweepアルゴリズムは、その値が参照された値であるかどうかではなく、도달가능성(reachablility)に重点を置く.
  • 到達性とは、JavaScriptルートというグローバルオブジェクトから参照を開始するかどうかを意味します.すなわち,ルートから対応する値に到達できるかどうか.
  • したがって、値の参照がない場合は、メモリを解放する必要がある値とみなされ、参照されてもルートから取得できない場合は処理されます.

    2012年から、モダンブラウザはmark-and-sweep方式のGCを使用している.reference-カウント方式に問題がある例をもう一度見てみましょう.
    function Couple() {
        const jane = {};
        const sam = {};
    
        // jane.bf는 sam을 참조한다
        jane.bf = sam;
    
        // sam.gf는 jane을 참조한다
        sam.gf = jane;
    
        return 'circular';
    }
    
    Couple();
    
    例では、Couple()という名前の関数を呼び出すと、ループ値が返され、終了後にjaneと同じ値に達することができないため、해당 값들은 GC에 의해서 메모리가 해제된다.

    🔎 表示


    参照値
  • はルートから到達できません.
  • 参照−カウントのループ参照問題は、タグ−および−スキャン方式で補完することができる.
  • ごみ収集はエンジンによって自動的に実行され、開発者は強制的に実行したり阻止したりすることはできません.
  • オブジェクトは、到着時にメモリに保持されます.
  • 参照
  • は、到達可能であることを意味しない.相互に関連付けられたオブジェクトが到達できない場合もあります.
  • リファレンスリンク

  • https://sustainable-dev.tistory.com/158
  • https://ko.javascript.info/garbage-collection