検索
ホームページウェブフロントエンドjsチュートリアルJavaScriptのメモリ管理を詳しく分析_基礎知識

はじめに

C などの低レベル言語には、malloc() や free() などの低レベルのメモリ管理コマンドがあり、開発者は手動でメモリを解放する必要があります。ただし、JavaScript などの高級言語では状況が異なります。オブジェクト (オブジェクト、文字列など) は作成時にメモリを割り当て、使用されなくなったメモリは自動的にリサイクルされます。この自動リサイクルプロセスはガベージコレクションと呼ばれます。 JavaScript などの高級言語の開発者は、ガベージ コレクションの存在により、メモリ管理を気にする必要がないと誤解しています。

メモリのライフサイクル

どのようなプログラミング言語であっても、メモリのライフサイクルは基本的に同じです。

1. 必要なメモリを割り当てます

2. 読み取りおよび書き込み操作に使用します

3. メモリが不要になったらリソースを解放します

ステップ 1 と 2 はすべての言語で同じであり、明確に気づくことができます。ステップ 3 に関しては、低レベル言語では開発者がこれを明示的に実行する必要があります。 JavaScript のような高水準言語の場合、操作のこの部分はパーサーによって実行されるため、気付かれることはありません。

JavaScript での代入操作

値の初期化

変数に値を代入すると、JavaScript によってメモリの割り当てが完了します。

コードをコピーします コードは次のとおりです。

var n = 123; // メモリを割り当てます。数値の場合
var s = "azerty"; // 文字列にメモリを割り当てます

var o = {
a: 1,
b: null
}; // 属性を含みますvalue オブジェクト object はメモリを割り当てます

var a = [1, null, "abra"] // 値を含む配列にメモリを割り当てます

function f(a){
; return a 2;
} // 関数にメモリを割り当てます (関数は呼び出し可能なオブジェクトです)

// 関数式もオブジェクトであり、メモリを割り当てる場合があります
someElement。 addEventListener('click' , function(){
someElement.style.backgroundColor = 'blue';
}, false);

関数呼び出しにより割り当てが完了しました

いくつかの関数が実行された後、オブジェクトの割り当ても行われます。

コードをコピー コードは次のとおりです。

var d = new Date();
var e = document.createElement('div'); // DOM 要素を割り当てます

一部のメソッドは新しい値またはオブジェクトを割り当てます。
コードをコピー コードは次のとおりです。

var s = "azerty";
var s2 = s.substr(0, 3); // s2 は新しい文字列です
// 文字列は変更されていないため、JavaScript は範囲 [0, 3]
var a = ["ouais ouais", "nan nan"];
var a2 = ["世代", "nan nan"];
var a3 = a.concat(a2) / / a と a2 を組み合わせて新しい配列を生成します


値の使用

値の使用は、実際には、割り当てられたメモリ上で読み取りおよび書き込み操作を実行することです。これらの操作には、変数またはオブジェクト プロパティに対する読み取りおよび書き込み操作、または関数へのパラメーターの受け渡しが含まれます。

不要になったらメモリを解放します

メモリ管理の問題のほとんどはこの段階で発生します。最も難しいのは、割り当てられたメモリがいつ不要になるかを判断する方法です。このため、開発者は多くの場合、プログラムがメモリを必要としなくなった時期を判断し、メモリが占​​有しているリソースを解放する必要があります。

「ガベージ コレクター」と呼ばれるプログラムは、高級言語パーサーに組み込まれており、メモリの割り当てと使用状況を追跡し、メモリが必要かどうかを判断し、メモリが不要になった場合はリソースの解放操作を実行します。必要です。メモリが必要かどうかの判断は不確実な問題である (アルゴリズムでは解決できない) ため、彼は近似値を取得することしかできません。

ガベージコレクション

上で述べたように、「メモリが不要になった」と正確かつ自動的に判断することはできません。したがって、この問題の解決策としてガベージ コレクションには限界があります。このセクションでは、主要なガベージ コレクション アルゴリズムとその制限事項を理解するために必要な概念について説明します。

引用

ガベージ コレクションの主要な概念は参照です。メモリ管理では、オブジェクトが明示的または暗黙的に別のオブジェクトを使用することを、そのオブジェクトが別のオブジェクトを参照すると言います。たとえば、JavaScript オブジェクトには、そのプロトタイプへの暗黙的な参照と、そのプロパティ値への明示的な参照があります。

ここでのオブジェクトの概念は、JavaScript における従来のオブジェクトの概念を超えており、関数スコープとグローバル スコープも含まれています。

参照カウント アルゴリズムを使用したガベージ コレクション

以下に紹介するのは、「オブジェクトが不要になった」、「他のオブジェクトがそのオブジェクトを参照しない」という概念を導入した最適なアルゴリズムです。オブジェクトの参照ポインタが 0 になると、リサイクルの準備ができたとみなされます。

例:

コードをコピー コードは次のとおりです。

var o = {
a: {
b:2
}
}; // 2 つのオブジェクトが作成され、1 つのオブジェクト (a) が別のオブジェクト (o で参照されるオブジェクト) によって参照されます。その属性
// オブジェクトは変数 o によって再び参照されます
// 明らかに、現時点ではオブジェクトをリサイクルできません


var o2 = o; // 変数 o2 は、再びオブジェクト
o = 1; // o はオブジェクトを参照しなくなり、o2 のみが引き続きオブジェクトを参照します

var oa = o2.a; // oa は o2 の属性オブジェクト a を参照します
// このオブジェクトは、他の 2 つのオブジェクト、つまり o2 の属性 a と oa 変数によって参照されています。

o2 = "yo"; // このオブジェクトは他のオブジェクトから参照されなくなりました。属性 a はまだ oa 変数によって参照されているため、まだ解放できません

oa = null; // これで属性 a は他のオブジェクトから参照されなくなり、オブジェクトはリサイクルできるようになります


制限: ループ

このアルゴリズムには制限があります。オブジェクトが別のオブジェクトを参照し、循環参照が形成されると、それらが不要になった場合でも、ガベージ コレクターはそれらを再利用しません。

コードをコピー コードは次のとおりです。

function f(){
var o = { };
var o2 = {};
o.a = o2; // o2 は o2
を参照します。 o2.a = o; // o2 は o

を参照します。 azerty";
}

f();
// 2 つのオブジェクトが作成され、相互参照を形成します
// 関数呼び出しが終了した後、それらは関数スコープから出ません。使用されませんが、解放されません
// これは、オブジェクトが参照されている限り、ガベージ コレクションを実行できないと参照カウント アルゴリズムが判断するためです

現実
ie6 および 7 の例では、DOM オブジェクトに対して参照カウント アルゴリズムが使用されており、メモリ リークの問題が発生します。

コードをコピー コードは次のとおりです。

var div = document.createElement("div ");
div.onclick = function(){
doSomething();
}; // div は click 属性を通じてイベント ハンドラーを参照します
// div 変数がアクセスされたときイベント ハンドラー関数は循環参照を形成し、両方のオブジェクトがリサイクルされなくなり、メモリ リークが発生します

タグ - アルゴリズムのクリア

彼は、「不要になったオブジェクト」と「到達不能なオブジェクト(オブジェクト到達不能)」という概念を導入しました。このアルゴリズムは、一連のルート オブジェクトが存在することを前提としています (JavaScript のルート オブジェクトはグローバル オブジェクトです)。ガベージ コレクターはルート オブジェクトから開始し、参照するすべてのオブジェクトを走査し、次に、ルート オブジェクトを走査します。参照オブジェクトによって参照されるオブジェクトなど。このアプローチを使用すると、ガベージ コレクターはアクセス可能なすべてのオブジェクトを取得し、アクセスできないオブジェクトを再利用できます。

このアルゴリズムは、0 によって参照されるオブジェクトがアクセス不可能なオブジェクトとして設定されると同時に、循環参照によって引き起こされる問題も回避します。

2012 年現在、ほとんどの最新ブラウザはこの「マーク アンド スイープ」ガベージ コレクターを使用しています。 JavaScript のガベージ コレクション (世代別/増分/同時/並列ガベージ コレクション) の分野は、ここ数年でそれに関連するアルゴリズムが改良されてきましたが、ガベージ コレクションのアルゴリズムそのもの (マークスイープ アルゴリズム) や「オブジェクトかどうかを判断する方法」は、はもう必要ありません」は改善されていません。

生理周期はもう問題ではありません

最初の例では、関数呼び出しが終了すると、これら 2 つのオブジェクトはグローバル オブジェクトによって参照されなくなり、グローバル オブジェクトによって参照されるオブジェクトからも参照されなくなります。したがって、これらは JavaScript ガベージ コレクターによってアクセス不可能なオブジェクトとしてマークされます。 2 番目の例でも同じことが起こり、div とイベント ハンドラーがガベージ コレクターによってアクセス不能としてマークされると、それらは解放されます。

制限事項: オブジェクトは明示的にアクセス不可としてマークする必要があります

このマーキング方法には制限がありますが、プログラミングでこの方法に触れたことがないため、ガベージ コレクション関連のコンテンツについてはほとんど気にしません。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
JavaScriptはCで書かれていますか?証拠を調べるJavaScriptはCで書かれていますか?証拠を調べるApr 25, 2025 am 12:15 AM

はい、JavaScriptのエンジンコアはCで記述されています。1)C言語は、JavaScriptエンジンの開発に適した効率的なパフォーマンスと基礎となる制御を提供します。 2)V8エンジンを例にとると、そのコアはCで記述され、Cの効率とオブジェクト指向の特性を組み合わせて書かれています。3)JavaScriptエンジンの作業原理には、解析、コンパイル、実行が含まれ、C言語はこれらのプロセスで重要な役割を果たします。

JavaScriptの役割:WebをインタラクティブでダイナミックにするJavaScriptの役割:WebをインタラクティブでダイナミックにするApr 24, 2025 am 12:12 AM

JavaScriptは、Webページのインタラクティブ性とダイナミズムを向上させるため、現代のWebサイトの中心にあります。 1)ページを更新せずにコンテンツを変更できます。2)Domapiを介してWebページを操作する、3)アニメーションやドラッグアンドドロップなどの複雑なインタラクティブ効果、4)ユーザーエクスペリエンスを改善するためのパフォーマンスとベストプラクティスを最適化します。

CおよびJavaScript:接続が説明しましたCおよびJavaScript:接続が説明しましたApr 23, 2025 am 12:07 AM

CおよびJavaScriptは、WebAssemblyを介して相互運用性を実現します。 1)CコードはWebAssemblyモジュールにコンパイルされ、JavaScript環境に導入され、コンピューティングパワーが強化されます。 2)ゲーム開発では、Cは物理エンジンとグラフィックスレンダリングを処理し、JavaScriptはゲームロジックとユーザーインターフェイスを担当します。

Webサイトからアプリまで:JavaScriptの多様なアプリケーションWebサイトからアプリまで:JavaScriptの多様なアプリケーションApr 22, 2025 am 12:02 AM

JavaScriptは、Webサイト、モバイルアプリケーション、デスクトップアプリケーション、サーバー側のプログラミングで広く使用されています。 1)Webサイト開発では、JavaScriptはHTMLおよびCSSと一緒にDOMを運用して、JQueryやReactなどのフレームワークをサポートします。 2)ReactNativeおよびIonicを通じて、JavaScriptはクロスプラットフォームモバイルアプリケーションを開発するために使用されます。 3)電子フレームワークにより、JavaScriptはデスクトップアプリケーションを構築できます。 4)node.jsを使用すると、JavaScriptがサーバー側で実行され、高い並行リクエストをサポートします。

Python vs. JavaScript:ユースケースとアプリケーションと比較されますPython vs. JavaScript:ユースケースとアプリケーションと比較されますApr 21, 2025 am 12:01 AM

Pythonはデータサイエンスと自動化により適していますが、JavaScriptはフロントエンドとフルスタックの開発により適しています。 1. Pythonは、データ処理とモデリングのためにNumpyやPandasなどのライブラリを使用して、データサイエンスと機械学習でうまく機能します。 2。Pythonは、自動化とスクリプトにおいて簡潔で効率的です。 3. JavaScriptはフロントエンド開発に不可欠であり、動的なWebページと単一ページアプリケーションの構築に使用されます。 4. JavaScriptは、node.jsを通じてバックエンド開発において役割を果たし、フルスタック開発をサポートします。

JavaScript通訳者とコンパイラにおけるC/Cの役割JavaScript通訳者とコンパイラにおけるC/Cの役割Apr 20, 2025 am 12:01 AM

CとCは、主に通訳者とJITコンパイラを実装するために使用されるJavaScriptエンジンで重要な役割を果たします。 1)cは、JavaScriptソースコードを解析し、抽象的な構文ツリーを生成するために使用されます。 2)Cは、Bytecodeの生成と実行を担当します。 3)Cは、JITコンパイラを実装し、実行時にホットスポットコードを最適化およびコンパイルし、JavaScriptの実行効率を大幅に改善します。

JavaScript in Action:実際の例とプロジェクトJavaScript in Action:実際の例とプロジェクトApr 19, 2025 am 12:13 AM

現実世界でのJavaScriptのアプリケーションには、フロントエンドとバックエンドの開発が含まれます。 1)DOM操作とイベント処理を含むTODOリストアプリケーションを構築して、フロントエンドアプリケーションを表示します。 2)node.jsを介してRestfulapiを構築し、バックエンドアプリケーションをデモンストレーションします。

JavaScriptとWeb:コア機能とユースケースJavaScriptとWeb:コア機能とユースケースApr 18, 2025 am 12:19 AM

Web開発におけるJavaScriptの主な用途には、クライアントの相互作用、フォーム検証、非同期通信が含まれます。 1)DOM操作による動的なコンテンツの更新とユーザーインタラクション。 2)ユーザーエクスペリエンスを改善するためにデータを提出する前に、クライアントの検証が実行されます。 3)サーバーとのリフレッシュレス通信は、AJAXテクノロジーを通じて達成されます。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)