JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptのガベージコレクション(GC)とは?仕組みとアルゴリズムを解説

ガベージコレクション(GC)とは

ガベージコレクション(GC)とは、自動メモリ管理の一種です。ガベージコレクタ(単に「コレクタ」とも呼ばれます)は、プログラムがもう使用していないオブジェクト、つまり「ゴミ」が占有しているメモリを回収します。ただし、あるメモリが「もう不要かどうか」を自動的に判定するという一般的な問題は、理論的に決定不能(undecidable)であることが証明されています。そのため、ガベージコレクタはこの一般的な問題に対する制限付きの解決策を実装しています。

ガベージコレクションのアルゴリズムが依存する中心的な概念は「参照」です。メモリ管理の文脈では、あるオブジェクトが別のオブジェクトに暗黙的または明示的にアクセスできる場合、前者は後者を参照していると言います。

コード例

let a = []
function addToA() {
    let x = {name: "John"}
    a.push(x)
}
console.log(a[0])

出力結果

{name: "John"}

ここで注目すべきは、変数 x はスコープ外になっているにもかかわらず、配列 a を通じて依然としてアクセス可能だという点です。つまり、x への参照が存在する限り、そのオブジェクトはメモリ上に保持され続ける必要があります。もし配列から pop() で取り除けば、そのオブジェクトは不要となり、ガベージコレクションの対象になります。

GCで使われる主なアルゴリズム

1. 参照カウント方式(Reference-counting garbage collection)

あるオブジェクトへの参照数がゼロになったとき、そのオブジェクトは「ゴミ」、つまり回収可能とみなされます。この方式は古いブラウザで採用されていました。しかし、循環参照しているオブジェクトには対応できません。互いに相手を参照し合っているため、常にどこかから参照が存在することになり、回収されないという問題があるからです。

2. マーク・アンド・スイープ方式(Mark-and-sweep algorithm)

このアルゴリズムは、「オブジェクトが不要になった」という定義を「オブジェクトが到達不可能である」という定義へと置き換えます。この方式は「ルート(roots)」と呼ばれるオブジェクトの集合を前提としており、JavaScriptではグローバルオブジェクトがルートに相当します。GCは定期的にこれらのルートから出発し、そこから参照されているすべてのオブジェクトを再帰的に探索します。こうしてルートから辿れるすべての到達可能なオブジェクトを特定し、到達不可能なオブジェクトだけを回収します。

JavaScriptにおけるGCについてさらに詳しく知りたい方は、MDN Web Docs(Memory Management)をご覧ください。

  1. JavaScriptのRegExp(正規表現)オブジェクトとは?基本の使い方をわかりやすく解説

    RegExp(正規表現)オブジェクトは、テキストに対してパターンマッチングを行い、目的の文字列部分を検索・抽出するために使用されます。JavaScriptでは、RegExpオブジェクトを「RegExpコンストラクタ」または「リテラル構文」の2通りの方法で作成できます。 RegExpオブジェクトの作成方法 コンストラクタを使用する場合: new RegExp(pattern) リテラル構文を使用する場合: /pattern/ 主なメソッド test():文字列がパターンに一致するかどうかを真偽値(true / false)で返します。 exec():パターンに一致した文字列を返します。

  2. JavaScriptのオブジェクト初期化子とは?使い方をサンプルコードで解説

    オブジェクト初期化子とは オブジェクト初期化子(Object Initializer)は、新しく生成したオブジェクトを初期化するための式です。波括弧 {} の中に、「プロパティ名」と「それに対応する値」のペアを0個以上、カンマ区切りで列挙して記述します。 これにより、変数宣言と同時にオブジェクトの中身を簡単に定義することができます。 以下は、JavaScriptでオブジェクト初期化子を使用したサンプルコードです。 サンプルコード <!DOCTYPE html> <html lang="en"> <head> <meta chars