この記事では、フロントエンド開発者に役立つことを望んでいるJavaScriptとIEブラウザーによるメモリ管理とリリースのタイミングと方法について詳しく説明します。
メモリリリースのインスタンス
コードコピーは次のとおりです。
<スクリプト言語= "javascript">
<! -
strtest = "1";
for(var i = 0; i <25; i ++)
{
strtest += strtest;
}
アラート(strtest);
Strtestを削除します。
collectgarbage();
//->
</script>
Collectgarbageは、メモリを解放するために使用されるIEのユニークな特性です。使用方法は次のとおりです。変数または参照オブジェクトをnullまたは削除に設定し、リリースアクションを実行します。
Collectgarbageを行う前に、2つの必要な条件を明確にする必要があります。
リファレンス - オブジェクトは、それが住んでいるコンテキストの外側に無効です。
- グローバルオブジェクトが実行されない場合は無効になります(参照)。
コードコピーは次のとおりです。
// --------------------------------------------------------------------
// JavaScriptオブジェクトはいつ失敗しますか
// --------------------------------------------------------------------
function testobject(){
var _obj1 = new object();
}
関数testObject2(){
var _obj2 = new object();
_obj2を返します。
}
//例1
testObject();
//例2
testObject2()
//例3
var obj3 = testObject2();
obj3 = null;
//例4
var obj4 = testObject2();
var arr = [obj4];
obj3 = null;
arr = [];
これらの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の複雑な関係によって引き起こされます。
Microsoftは、この問題を解決するための戦略を公開しました。これは、メモリリサイクルプロセスを積極的に呼びます。
CollectgarBage()プロセス(通常はGCプロセスと呼ばれます)が(Microsoft)JScriptで提供されます。 GCプロセスは、現在のIE、つまりオブジェクトを呼び出すデストラクタプロセスの「失敗したオブジェクトの不整合」をクリーンアップするために使用されます。
上記の例では、GCプロシージャを呼び出すコードは次のとおりです。
コードコピーは次のとおりです。
// --------------------------------------------------------------------
// ActiveXオブジェクトを処理するときのGC手順の標準呼び出し方法
// --------------------------------------------------------------------
関数writexls(){
//(わずかに...)
excel.quit();
Excel = null;
setimeout(collectgarbage、1);
}
コードの最初の行は、excel.quit()メソッドを呼び出して、Excelプロセスを中止して終了します。この時点で、JavaScript環境にはExcelオブジェクトインスタンスがあるため、Excelプロセスは実際には中止されません。
コードの2行目により、Excel Nullがオブジェクト参照をクリアするため、オブジェクトを「無効」します。ただし、オブジェクトはまだ関数コンテキストにあるため、GCプロシージャが直接呼び出された場合、オブジェクトはまだクリーニングされません。
コードの3行目はsettimeout()を使用してcollectgarbage関数を呼び出し、時間間隔は '1'に設定されます。これは、writexls()関数が実行された後にのみGCプロセスを実現させます。このようにして、Excelオブジェクトは「GCによってクリーンアップできる」という2つの条件を満たしています。参照なしでコンテキストを離れることです。
GC手順の使用は、ActiveXオブジェクトを使用したJS環境で非常に効果的です。潜在的なActiveXObjectには、XML、VML、OWC(Office Webコンポーネット)、Flash、さらにはJSのVBARRAYが含まれます。この観点から、AjaxアーキテクチャはXmlhttpを採用しており、「ページの切り替えなし」機能を満たす必要があるため、適切な時期にGCプロセスを積極的に呼び出すと、UIを使用した効率エクスペリエンスが向上します。
実際、GCプロセスがあっても、前述のExcel問題は完全には解決されません。 IEは許可資格情報もキャッシュするからです。ページの許可資格情報を更新する唯一の方法は、「新しいページに切り替える」ことです。
したがって、実際、上記のSPSプロジェクトでは、私が使用した方法はGCではなく、次のコードでした。
コードコピーは次のとおりです。
// --------------------------------------------------------------------
// ActiveXオブジェクトを処理するときに使用されるページの切り替えコード
// --------------------------------------------------------------------
関数writexls(){
//(わずかに...)
excel.quit();
Excel = null;
//次のコードは、IEコールExcelのバグを解くために使用されます。これは、MSDNで提供される方法です。
// setimeout(collectgarbage、1);
//信頼されたWebページをクリアできない(または同期)するため、SaveAS()および他の方法は
//次回電話するときに無効です。
location.reload();
}
マニュアルの削除演算子の説明
参照は、オブジェクトから属性を削除するか、配列から要素を削除します。
式を削除します
式パラメーターは有効なJScript式、通常はプロパティ名または配列要素です。
説明します
式の結果がオブジェクトであり、式で指定された属性が存在し、オブジェクトが削除されない場合、falseが返されます。
他のすべての場合において、trueを返します。
最後に、GCに関する補足的なメモ:IEフォームが最小化されると、IEはCollectgarBage()関数を1回積極的に呼び出します。これにより、IEウィンドウが最小化された後、メモリの使用量が大幅に改善されます