jsのゴミ収集メカニズム
1218 ワード
js中のゴミ収集:マーククリアと参照カウント(主流はマーククリア)ゴミ収集器は、実行時にメモリに格納されているすべての変数にマークを付けます.その後、環境中の変数や環境中の変数によって参照されている変数のタグが削除されます.この後、環境を離れる際にマークされた変数は、環境内の変数がこれらの変数にアクセスできなくなりました.最後に、ごみ収集器がメモリの消去を完了しました.どのマークが付いている値を廃棄し、彼らが使っているメモリ空間を回収しますか? 参照カウントとは、各値が参照された回数を追跡記録することを意味する.変数が他の変数を参照すると、この値は1を加算します.変数が他の変数に割り当てられたら、もう1を追加します.逆にこの値を参照する変数がないと、1を減算します.この値の参照回数が0の場合、この値にアクセスできないということです.メモリの空き領域を回収します.このように、ゴミ収集器は次回実行すると、それらの参照回数がゼロの値で占められているメモリを解放します.
参照カウントには大きなバグがあります.循環参照です.つまり、AオブジェクトにはオブジェクトBへのポインタが含まれ、オブジェクトBにはオブジェクトAへの参照も含まれている.
マーククリア策を採用した実装では、関数が実行された後も、それらの参照回数は永遠に0ではないので、この関数が何度も繰り返し起動されると、大量のメモリが回収されなくなります.
したがって、現在の主流戦略はマーククリアです.
参照カウントには大きなバグがあります.循環参照です.つまり、AオブジェクトにはオブジェクトBへのポインタが含まれ、オブジェクトBにはオブジェクトAへの参照も含まれている.
function problem(){
var objectA = new Object(); //objectA new Object , +1
var objectB = new Object(); //objectB new Object , +1
objectA.a = objectB; //objectA.a objectB , +1
objectB.b = objectA; //objectB.b objectA , +1
objectA = null; //ObjectA -1
objectB = null;//ObjectB -1
// ObjectA ObjectB
// 0,
//
}
2つのオブジェクトの属性は相互に参照されます.つまり、この2つのオブジェクトの参照回数はすべて2です.マーククリア策を採用した実装では、関数が実行された後も、それらの参照回数は永遠に0ではないので、この関数が何度も繰り返し起動されると、大量のメモリが回収されなくなります.
したがって、現在の主流戦略はマーククリアです.