javascriptメモリ問題を検討する

3131 ワード

ごみの収集戦略
自動ごみ収集メカニズムの原理
実行環境はコード実行中に使用するメモリを担当します.例えばvar a = 1は、スタック上にメモリを占有して、もう使用しない変数を探し出し、その後、その占有メモリを解放する.ごみ収集器は、一定の時間間隔(またはコード実行中の所定の収集時間に応じて時間間隔を設定する)で、定期的にメモリの放出を実行します.
クリアポリシーをマーク
javascriptの最も常用するごみの収集方式はマークが環境に入る時に変数を一掃するので、たとえば
function(){
var a2=111;
}
a 2変数は環境に入る変数としてマークされます.変数が環境から離れると、変数は環境から離れるとマークされます.
ゴミ収集器は運転中に「環境に入る」とメモリに格納されているすべての変数にマークを付けます.
var a3=111;
変数が環境から離れる時、
function fn(){
var c = 111;
}
fn()
ローカル変数は、関数が実行された後、環境から離れる変数と変数によって参照される変数のタグが削除されます.これらの変数は、環境内の変数がこれらの変数にアクセスできなくなり、最後にメモリ整理作業を完了し、対応する変数のメモリを破壊します.2008年までブラウザではこのマークのクリア型のゴミ収集戦略を使っています.
参照カウントポリシー
各値が参照された回数を追跡します.変数を宣言し、参照タイプの値を変数に割り当てた場合、
var a4 ;
object = new Object()
a4 = object
この値がobjectの引用回数は1です.同じ値が別の変数に割り当てられている場合、
var a5;
a5 = object;
この値はobjectの引用回数にもう1を加えて、参照回数は2になります.逆に、この値を含むobjectが参照する変数a 5はまた別の値object 2に与えられ、
object2 = new Object();
a5 = object2;
この値がobjectの参照回数は1を減らし、参照回数は1になります.値object 2の参照回数は1を加算し、参照回数は1です.この値がobjectの参照回数が0の場合、
object3 =new Object()
a4 = object3
もう二度とこの値にアクセスできないということです.実際には値new Object()を変数objectに与えていません.上にはその値に対する参照をよりよく理解するためだけに書いてあります.IEブラウザの一部のオブジェクトは、元のjavascriptオブジェクトではないので、そのBOM、DOMのオブジェクトはCOM(コンポーネントオブジェクトモデル)を使用して実装され、この部分のオブジェクトは参照カウントポリシーを使用し、元のjavascriptオブジェクトはタグポリシーを使用する(他のブラウザはこのポリシーを使用する).
カウントポリシーの欠陥を参照
function(){
var element =document.getElementById('box')
var myObject = new Object();
myObject.someElement = element;
element.someObject = myObject;
}
マーククリア策では、
この関数が実行されると、この2つの変数はスコープから離れ、両方の変数のマークもクリアされますので、両方の値があるメモリはリリースされます.しかし、
参照カウントポリシーでは、
関数が実行された後も、2つの値は循環的に参照され、参照回数は2であり、メモリは解放されないので、この関数は繰り返し呼び出された後、大量のメモリが占有されて回収できなくなります.上記の例では、elementはDOM元素のオブジェクトで、myObjectは元のjavascriptオブジェクトです.DOM元素のオブジェクトは参照計数術を使うので、メモリが回収できなくなります.
ソリューション
myObject.someElement = null;
element.someObject = null;
変数がNullに設定されると、変数と参照値の接続が切断されます.ごみ収集器が次の運転をすると、これらの値を削除してメモリを回収します.
注意
IE 9は上記の欠陥を解決し、DOMとDOMオブジェクトをすべてオリジナルのjavascriptオブジェクトに変換する.
メモリの管理
ブラウザに割り当てられたメモリはデスクトップアプリケーションよりも少ないです.一つのスレッドで同時に実行できる語句の数が減少します.メモリを最適化する方法:参照を解除すると、実行環境から離れると、自動的に参照を解除し、メモリを解放します.グローバル変数とグローバルオブジェクトの属性は、手動で参照を解除する必要があります.そうでないと、ゴミ収集器の運転時間を待ってから参照を解除します.
function createPerson(name){
var localPerson = new Object();
//    
localPerson.name = name
return localPerson;
}
var globalPerson = createPerson('jack');
//    
globalPerson = null;
//        ,      
createPerson関数が宣言されたとき、function createPerson(name){...}は、タイプ(new Object)の値を参照する.ローカル変数local Personによって参照され、値はメモリに格納され、ローカル変数local Personは環境に入り、マークされる.
createPerson関数を実行すると、createPerson('jack')、局所変数local Personは環境を離れてマークをクリアし、その値を格納しているメモリを解放する.var globalPerson = createPerson('jack');、すなわち値がグローバル変数に割り当てられた場合、参照タイプの値はグローバル変数globalPersonによって参照され、値はメモリに格納され、グローバル変数global Personは環境に入り、マークされる.globalPerson = null;の場合、グローバル変数は参照を解除し、メモリを解放する.