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

JavaScriptでメモリはどうやって解放される?ガベージコレクションの仕組みを解説

プログラミング言語を問わず、メモリのライフサイクルはほぼ共通しており、次の3つの段階で構成されます。

  • 必要なメモリを割り当てる(アロケート)
  • 割り当てたメモリを使用する(読み取り・書き込み)
  • 不要になったメモリを解放する

このうち2番目の「使用する」段階は、すべての言語において開発者が明示的に行う必要があります。

一方、1番目の「割り当て」と3番目の「解放」については、Cのような低レベル言語では開発者が明示的に制御しますが、JavaScriptのような高レベル言語ではほぼ暗黙的に処理されます。

そのため、JavaScriptにはメモリを明示的に確保したり解放したりするための構文が存在しません。オブジェクトを初期化すると自動的にメモリが割り当てられ、変数がスコープ外に出ると、そのオブジェクトはガベージコレクションの対象となり、占有していたメモリが自動的に解放されます。

コード例

function test() {
    // メモリを割り当てて使用する
    let x = {
        name: "John",
        age: 24
    }
    console.log(x);
    return null;
    // メソッドがスコープ外に出ると同時に
    // ガベージコレクションが実行され、メモリが解放される
}
test();

コメントに記載した一連のサイクルは、このメソッドが呼び出されるたびに実行されます。

補足:ガベージコレクションの仕組み

多くのJavaScriptエンジン(V8など)は、「マーク・アンド・スイープ」と呼ばれるアルゴリズムによって不要なメモリを特定しています。これは、グローバルオブジェクトなどのルートから参照をたどり、そこから到達できないオブジェクトを「不要」と判断して回収する方式です。

ただし、意図せずグローバル変数やイベントリスナー、クロージャなどへの参照を保持し続けると、オブジェクトが回収されずメモリリークが発生することがあります。不要になった参照は解除する(nullを代入する、removeEventListenerでリスナーを削除するなど)ことが、実践的なメモリ管理のポイントです。

  1. JavaScriptで日付の「日」を設定する方法|setDate()の使い方を解説

    JavaScriptでは、DateオブジェクトのsetDate()メソッドを使うことで、日付の「日」(1〜31)を設定・変更できます。この記事では、実際のコード例と実行結果をもとに、setDate()の基本的な使い方をわかりやすく解説します。 setDate()メソッドとは setDate()は、Dateオブジェクトの「日」の値だけを変更するためのメソッドです。年や月はそのままに、日にちだけを差し替えたい場合に便利です。引数には1〜31の整数を指定しますが、範囲外の値を渡してもエラーにはならず、自動的に月をまたいだ日付へと調整されます。また、このメソッドは元のDateオブジェクト自体を書き換え

  2. Macのメモリ(RAM)を解放する方法:動作が重い時の対処法と最適化テクニック

    Macの動作が異常に遅い、アプリがフリーズした、「アプリケーションメモリが不足しています」というメッセージが表示された、あるいは恐怖のレインボーカーソル(くるくる回る待機カーソル)が出た──これらはすべて、メモリ(RAM)が限界まで使われているサインかもしれません。この記事では、MacのRAMを解放する方法と、メモリをクリーンアップ・最適化するための様々なヒント、さらに「MacのRAMが常にいっぱい」という状況への対処法を解説します。 RAM(メモリ)とは? まず基礎知識から。RAMは「Random Access Memory」の略で、進行中のタスクやプロセスのための一時的な作業領域を提供し