JavaScript CollectGarbage 関数の例

JavaScript CollectGarbage 関数の例

まず、メモリ解放の例を見てみましょう。

<スクリプト言語="JavaScript">
<!--
strTest = "1";
( var i = 0; i < 25; i ++ ) の場合
{
 strTest += strTest;
}
アラート(strTest);
strTest を削除します。
ゴミを収集します();
//-->
</スクリプト>

CollectGarbage は IE の固有のプロパティで、メモリを解放するために使用されます。変数または参照オブジェクトを null に設定するか削除してから解放するために使用します。CollectGarbage を実行する前に、次の 2 つの条件が満たされている必要があります。

- オブジェクトは、それが存在するコンテキスト外では無効になります。
- グローバル オブジェクトは、使用 (参照) されない場合、無効になります。

//--------------------------------------------------------
// JavaScript オブジェクトが無効になるのはいつか //--------------------------------------------------------


関数testObject() {
var _obj1 = 新しいオブジェクト();
}

関数testObject2() {
var _obj2 = 新しいオブジェクト();
_obj2 を返します。
}

// 例1
テストオブジェクト();

// 例 2
テストオブジェクト2()

// 例3
var obj3 = testObject2();
obj3 = null;

// 例4
var obj4 = testObject2();
var arr = [obj4];
obj3 = null;
arrr = [];

次の 4 つの例では、

- 「例1」では関数testObject()内で_obj1を構築しますが、関数が終了すると、
関数のコンテキストを離れているため、_obj1 は無効です。

- 「例 2」では、オブジェクト _obj2 も構築され、testObject2() に渡されるため、オブジェクトには「関数の外部」のコンテキスト環境 (およびライフ サイクル) があります。ただし、関数の戻り値は他の変数によって「保持」されないため、_obj2 はすぐに無効になります。

- 「例 3」では、testObject2() によって構築された _obj2 が外部変数 obj3 によって使用されます。
このとき、コード行「obj3 = null」が有効になるまでは、参照関係がなくなるため、_obj2 は無効になります。

- 例 3 と同じ理由で、例 4 の _obj2 は "arr = []" の行以降は無効になります。

ただし、オブジェクトの「無効化」は、それが「解放」されることを意味するものではありません。 JavaScript ランタイム内では、オブジェクトがいつ解放されるかをユーザーに正確に伝える方法はありません。これはJavaScriptに依存しています
メモリリサイクルメカニズム。 ——この戦略は、.NET のリサイクル メカニズムに似ています。

前述の Excel 操作サンプル コードでは、オブジェクトの所有者、つまりプロセス「EXCEL.EXE」は、「ActiveX オブジェクト インスタンスが解放された」後にのみ実行できます。ファイル ロックとオペレーティング システムのアクセス許可資格情報は、プロセスに関連しています。したがって、オブジェクトが「解放」されるのではなく「無効化」されるだけの場合、
これにより、ファイルを処理し、オペレーティング システムのアクセス許可資格情報を参照する他のプロセスに問題が発生します。

——これは JavaScript または COM メカニズムのバグだと言う人もいます。実は違います。これは OS と IE です。
これは独立した問題ではなく、JavaScript と JavaScript の複雑な関係によって発生します。

Microsoft は、この問題を解決するための戦略として、メモリのリサイクル プロセスを積極的に呼び出すことを公開しました。

(Microsoft の) JScript では、CollectGarbage() プロシージャ (通常は GC プロシージャと呼ばれます) が提供されています。
GC プロセスは、現在の IE、つまり呼び出し元オブジェクトの破棄プロセス内の「失敗したオブジェクト インスタンス」をクリーンアップするために使用されます。

上記の例で GC プロセスを呼び出すコードは次のとおりです。

//--------------------------------------------------------
// ActiveX オブジェクトを処理する場合、GC プロセスの標準呼び出し方法 //----------------------------------------------------------------------

関数writeXLS() {
//(わずかに...)

excel.Quit();
エクセル = null;
タイムアウトを設定します(ガベージ収集、1);
}

コードの最初の行は excel.Quit() メソッドを呼び出して、Excel プロセスを終了し、終了します。
環境は Excel オブジェクト インスタンスを保持するため、Excel プロセスは実際には終了しません。

2 行目のコードでは、Excel を null にしてオブジェクト参照をクリアし、オブジェクトを「無効」にします。ただし、オブジェクトはまだ関数コンテキスト内にあるため、GC プロセスが直接呼び出されると、オブジェクトはクリーンアップされません。

3 行目のコードでは、setTimeout() を使用して CollectGarbage 関数を呼び出し、時間間隔を '1' に設定して、writeXLS() 関数の実行後にのみ GC プロセスが発生するようにします。このようにして、Excelオブジェクトは「
「GC クリーンアップ」には、参照がないこととコンテキストを離れることという 2 つの条件があります。

ActiveX オブジェクトを使用する JS 環境では、GC プロセスの使用が非常に効果的です。潜在的なActiveX
オブジェクトには、XML、VML、OWC (Office Web コンポーネント)、フラッシュ、さらには JS の VBArray が含まれます。
この観点から見ると、Ajax アーキテクチャは XMLHTTP を使用し、同時に「ページを切り替えない」という特性を満たしているため、適切なタイミングで GC プロセスを積極的に呼び出すことで、より優れた効率と UI エクスペリエンスが得られます。

実際、GC プロセスを使用しても、上記の Excel の問題は完全に解決されません。 IE も権限資格情報をキャッシュするためです。ページの資格情報を更新する唯一の方法は、「新しいページに切り替える」ことです。
そのため、実際、前述の SPS プロジェクトで使用した方法は GC ではなく、次のコードでした。

//--------------------------------------------------------
//ActiveX オブジェクトの処理時に使用するページ切り替えコード//----------------------------------------------------------------------

関数writeXLS() {
//(わずかに...)

excel.Quit();
エクセル = null;

// 次のコードは、MSDN で提供されているメソッドを使用して Excel を呼び出し、IE のバグを解決するために使用されます。
// SetTimeout(CollectGarbage, 1);
// Web ページの信頼された状態はクリア (または同期) できないため、SaveAs() などのメソッドは次回呼び出されたときに無効になります。
場所を再読み込みします。
}

削除演算子についてはマニュアルに記載されています

参考文献

オブジェクトからプロパティを削除するか、配列から要素を削除します。

式を削除

式パラメータは有効な JScript 式であり、通常はプロパティ名または配列要素です。

例示する

式の結果がオブジェクトであり、式で指定された属性が存在し、オブジェクトが削除を許可していない場合は、false が返されます。

それ以外の場合は true を返します。

最後に、GC に関する補足事項: IE ウィンドウが最小化されると、IE は CollectGarbage() 関数を 1 回アクティブに呼び出します。これにより、IE ウィンドウが最小化された後のメモリ使用量が大幅に改善されます。

JavaScript CollectGarbage 関数の詳細なケースに関するこの記事はこれで終わりです。より関連性の高い js CollectGarbage 関数の内容については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • JSの矢印関数におけるこのポイントの詳細な説明
  • JavaScript 関数構文の説明
  • Vue.jsのレンダリング関数の使い方の詳しい説明
  • JavaScript 基礎シリーズ: 関数とメソッド
  • JavaScript 関数呼び出し、適用、バインド メソッドのケース スタディ
  • JavaScript関数導入の詳しい説明

<<:  Linux システム MySQL8.0.19 クイックインストールと構成チュートリアル図

>>:  Linux に MySQL 8.0.19 をインストールするための詳細な手順と問題解決方法

推薦する

Centos7 FFmpeg オーディオ/ビデオ ツールのインストールに関する簡単なドキュメント

ffmpeg は非常に強力なオーディオおよびビデオ処理ツールです。公式 Web サイトは http:...

CSSはletter-spacingプロパティを通じて単語間の間隔を制御します。

letter-spacing プロパティ: 文字間のスペース (文字間隔) を増減します。このプロ...

Vue コンポーネントでのアンチシェイクとスロットリングの使用例の分析

入力ボックスへのユーザー入力、ウィンドウのサイズ変更、スクロール、Intersection Obse...

HTML で #include ファイルを使用する例

a.htmとb.htmの2つのファイルがあります。同じディレクトリ内のa.htmの内容は次のとおりで...

HTMLテキストの一般的なイベントとメソッドの詳細な説明

イベントの説明onactivate: オブジェクトがアクティブ要素として設定されたときに発生します。...

MySQL8インストーラーバージョングラフィックチュートリアル

インストール必要な書類は下部に記載されていますステップ1 mysql-installer-web-c...

LeetCode の SQL 実装 (177. 給与が N 番目に高い)

[LeetCode] 177. 最も高い給与従業員テーブルからn番目に高い給与を取得する SQL ...

MySQLのネストされたトランザクションで発生する問題

MySQL はネストされたトランザクションをサポートしていますが、それを実行する人は多くありません....

HTMLはマーキーを使用してテキストを左右にスクロールします

コードをコピーコードは次のとおりです。 <本文> //マーキーの助けを借りて<MA...

要素テーブルヘッダー行の高さの問題の解決

目次序文1. 問題の原因2. 解決策VueはelementUIテーブルtr thの高さと背景色を変更...

カレンダー効果を実現するための Bootstrap+JQuery

この記事では、カレンダー効果を実現するためのBootstrap+Jqueryの具体的なコードを参考ま...

クラウド サーバー Ubuntu_Server_16.04.1 に MySQL をインストールしてリモート接続を有効にする方法

1. MySQLをインストールします。対応するソフトウェアをインストールするには、次の 3 つのコマ...

docker イメージのプル速度が遅い問題の解決策

現在、Docker には中国向けの公式ミラーがあります。詳細については、https://www.do...

共有サイドバーを実装するためのネイティブJS

この記事では、ネイティブ JS で実装された共有サイドバーを紹介します。効果は次のとおりです。 以下...

親要素に対する CSS 子要素の配置の実装

解決親要素に position:relative を追加します。子要素に position:abso...