ホームページ  >  記事  >  ウェブフロントエンド  >  IEのメモリリークとJavaScriptのメモリ解放について

IEのメモリリークとJavaScriptのメモリ解放について

黄舟
黄舟オリジナル
2016-12-14 15:58:28864ブラウズ

最近、私は会社のビジネス システムにできるだけ近いものを要求しています。つまり、C/S と同じように、テキスト ボックスをクリックすると、このプロジェクトの関連コンテンツがポップアップ表示されます。選択して入力します。
ポップアップ ウィンドウを使用し、子ウィンドウで選択した項目をダブルクリックし、選択した値を親フォームに返しました。
システム完成後、顧客は 512m のメモリ構成を使用しているため、30 ~ 40 個のフォームを開くと、IE の仮想メモリ使用量が 200m 近くに達し、システムの変更が遅くなります。 JavaScriptも遅くなります。

Googleで検索したところ、IEのメモリリークが原因の可能性があることが分かりました。詳細については、www.cnblogs.com の関連記事を参照してください。

タスクマネージャーを使用してポップアップウィンドウを開くと、IEのメモリが1〜3m増加し、その後ウィンドウを閉じます。メモリが解放されない場合と、数十キロバイトしか解放されない場合があります。 。問題はメモリの解放にあるようです。 memoryメモリリリースのアイデアに従って、この問題を解決する方法を検索しました。メモリを解放するために使用される未公開の JavaScript 関数 CollectGarbage を見つけました。すべてのポップアップ ウィンドウが終了する前に、すべての自己定義 javasctip 変数を null に設定し、CollectGarbage 関数を呼び出します。

JavaScript で変数を null に設定すると、次回その変数が再度定義されるときに、JavaScript はメモリを解放せず、その変数が配置されているメモリは上書きされます。 null に設定されていない場合、JavaScript は変数を再度定義するときに新しいメモリ空間を開きます。

上記の処理を行った後、再びウィンドウを開くと、IE のメモリはそのたびに 1 ~ 3m ずつ増加しますが、ウィンドウを閉じると、IE は 500k ~ 2m の範囲の一定量のメモリを解放します。一定の役割を果たした。

ページ内でサードパーティ コントロールを使用しているため、サードパーティ コントロール内の JavaScript のメモリがどのように管理されるかは私の制御下にはありません。 ️ CollectGarbage の協力を得て。



<script> <p> <br> //32M </p> function AllocMem() <p> { <br> var str="12345678"; </p> str+=str; str; <p> } <br>関数A(a) <br> a=null; <br>関数r() <br> var f=A(AllocMem()); <br>CollectGarbage (); <br> //明らかに、リリースされました。 <br> r=null; <br> alter(2); <br> </script>

----------
メモリ解放ルール (スクリプト層) はよく理解しました。 。
(メニューの各レベルで ?M のメモリが割り当てられます。状況はタスク マネージャを見ることによってのみ確認できます)


注:
CollectGarbage() は、IE または NS の実行時に呼び出されるため、通常、コアのときにメモリを解放します。プログラムは終了します。これは安全です



注:
1) ウィンドウ内のオブジェクトの参照を別のウィンドウに保持すると、ウィンドウを閉じてもメモリは解放されません

ご存知かもしれませんが、ウィンドウは window.open() で開きます。つまり、デスクトップにこれら 2 つのウィンドウが表示されている場合でも、タスク マネージャーのプロセス テーブルを見ると、IEXPLORE.EXE が 1 つしか表示されない可能性があります。実行中のメモリは、プロセスが終了したときにのみ解放される可能性があります

2) さらに悪いことに、DOM オブジェクトへの参照を保持したまま、そのオブジェクトが配置されているウィンドウを閉じると、IE がクラッシュしてメモリ エラーが報告されます (または要求が発生します)。再起動)

これはバグのようです。Microsoft に報告したほうがいいかもしれません

その他の関連記事については、PHP 中国語 Web サイト (www.php.cn) にご注意ください。


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