、JavaScriptのガベージコレクションのメカニズム
javascriptの自動ガベージコレクションのメカニズム、つまり、メモリ使用量の手続きのコードの実行には、環境管理のための責任を負うことになります。CおよびC ++クラスのような言語では、開発者の基本的なタスクは、手動で多くの問題の根本的な原因であるメモリ使用量を追跡することです。JavaScriptのプログラムを書くとき、開発者は、もはや自動管理の完全な実現をリサイクルするメモリ使用量の問題、必要なメモリの割り当てとガベージを心配する必要はありません。
最も一般的に使用されるJavaScriptのガベージコレクションは、クリア(マークアンドスイープ)標識されています。環境への変数(例えば、関数内で宣言された変数)は、この変数はとしてマークされます場合は、「環境に。」論理的に、それらを使用することが可能である限り、対応する実行環境に流れ込むよう、環境への変数によって占有されていたメモリを解放することはありません。それをマークする環境変数、離れるときは「環境を残しています。」
第二に、メモリリークは何ですか
メモリリークは、我々が使用することはできません割り当てられたメモリを指し、それはブラウザプロセスの終わりまで回復することはできません。それは手動でメモリを管理するためのものであるため、C ++では、メモリリークが頻繁に起こります。そして今、自動メモリー管理を使用して、このようなC#とJavaのガベージコレクション方法として一般的な言語は、ほとんどのメモリリークが、通常の使用では発生しません。ブラウザは、メモリを管理するための自動ガベージコレクションのメソッドを使用しますが、ブラウザのガベージコレクションのメソッドのバグので、メモリリークを持っています。
第三に、いくつかの例、メモリリーク
ページ要素を削除または置換されている場合1は、結合要素のイベントはまだ削除されていない場合は、IEで適切な治療をしない、最初のイベントを手動で削除する必要があり、この時間は、それ以外の場合はメモリリークが発生します。
<div id="myDiv">
<input type="button" value="Click me" id="myBtn">
</div>
<script type="text/javascript">
var btn = document.getElementById("myBtn");
btn.onclick = function(){
document.getElementById("myDiv").innerHTML = "Processing...";
}
</script>
以下に置き換える必要があります
<div id="myDiv">
<input type="button" value="Click me" id="myBtn">
</div>
<script type="text/javascript">
var btn = document.getElementById("myBtn");
btn.onclick = function(){
btn.onclick = null;
document.getElementById("myDiv").innerHTML = "Processing...";
}
</script>
またはイベントの委任を使用して
<div id="myDiv">
<input type="button" value="Click me" id="myBtn">
</div>
<script type="text/javascript">
document.onclick = function(event){
event = event || window.event;
if(event.target.id == "myBtn"){
document.getElementById("myDiv").innerHTML = "Processing...";
}
}
</script>
2は、純粋なECMAScriptのオブジェクトのために、限り他のオブジェクト参照は、Bオブジェクトないよう、それは、ガベージコレクションのシステムがまだ認識され、処理されます、彼らはお互いにだけ言及していると言うことです。しかし、Internet Explorerで、DOMノードまたはActiveXオブジェクト内の循環参照内の任意のオブジェクト場合、ガベージコレクションシステムは、それらとシステムの間に他のオブジェクトの円形関係が隔離されている見つけ、それらを解放しません。ブラウザを閉じるまで、最終的に彼らは、メモリ内に残ります。
var a=document.getElementById("xx");
var b=document.getElementById("xxx");
a.r=b;
b.r=a;
var a=document.getElementById("xx");
a.r=a;
3
function bindEvent()
{
var obj=document.createElement("XXX"); // 被闭包所引用,不会被回收
obj.onclick=function(){
//Even if it's a empty function
}
}
クロージャは、関数内のローカル変数を維持することができ、それが解放されません。
関数が定義されているので、機能、および内部機能、イベントコールバック実施形態を定義-参照イベントコールバック外部嵐、形成された閉鎖
液は、イベントハンドラは、外部閉鎖を解除する定義され
function bindEvent()
{
var obj=document.createElement("XXX");
obj.onclick=onclickHandler;
}
function onclickHandler(){
//do something
}
または外部のイベントハンドラ関数の定義、DOMへの参照を削除(タイトル、導入、閉鎖で「JavaScriptのDefinitive Guideの」外で、無用スコープ属性はメモリ消費量を削減するために削除することができます。)
function bindEvent()
{
var obj=document.createElement("XXX");
obj.onclick=function(){
//Even if it's a empty function
}
obj=null;
}
4、忘れたり、タイマーコールバック関数
var someResource = getData();
setInterval(function() {
var node = document.getElementById('Node');
if(node) {
// 处理 node 和 someResource
node.innerHTML = JSON.stringify(someResource));
}
}, 1000);
ノードに関連付けられたデータやタイマーがもはや必要とされ、ノードオブジェクトは、全体のコールバック関数が必要とされていません削除することができます。この例は、どのような説明します。しかし、タイマーコールバック関数は、まだ(停止され、タイマーがリサイクルされます)回収されていません。一方、someResourceあなたは大量のデータを保存する場合は、だけでなく、リサイクルすることができません。
例えば、それらはもはや必要(または関連するオブジェクトが到達不能になる)されると観察者は、明らかに非常に重要なそれらを削除します。古いIE 6は、循環参照を扱うことができません。オブザーバオブジェクトが到達不能になると、明示的にそれらを削除しない場合でも、今日、ほとんどのブラウザは、観察者のハンドラを再利用することができます。
5、
a = {p: {x: 1}};
b = a.p;
delete a.p;
このコードの実行後にBXの値には、JavaScriptの一部の実施形態においては、このため、厳密なコード原因メモリリークがないかもしれないので、プロパティは、参照がまだ存在して削除されたので、まだ1です。オブジェクトを破壊するときに、プロパティを横断し、[削除]をクリックしますし属性。
6、自動ボクシング変換型
インターネット上の情報を参照するには、最初に神を置く、または特定の問題を開示しないこと、すなわち、メモリリークが発生し、直列に次のコードを言いました
var s=”lalala”;
alert(s.length);
sが、それ自体ではなく、文字列オブジェクトであり、それは訪問の長さは、JSエンジンは自動的に一時的なStringオブジェクトがSをカプセル化作成されますが、このオブジェクトがリークしますのでとき、lengthプロパティを持っていません。このバグは信じられない、しかし、すべての値の型が、その前に最初の明示的な変換操作を行う覚え解決するために、幸いにも非常に簡単です:
var s="lalala";
alert(new String(s).length);
7、いくつかのDOM操作
ページのDOMを離れるときにすべてを回復する:IE7のメモリリークのようなルックスを向上させるためには、IE7は極端なソリューションを使用して、IEシリーズに固有の問題は、単に不在のDOMツリーDOM要素のappendChildであることを意味しますツリー要素、他のではない問題。