Nicholas Zakasの本で、Javascriptでガベージコレクションの参照カウントを使用するときの循環参照の問題について説明します。 2つのオブジェクトが、彼らは関数の内部でそれらの2つの参照を持っているので、それらに割り当てられたメモリが解放されていないことを説明するJavascript参照カウントの円参照
function problem(){
var objectA = new Object();
var objectB = new Object();
objectA.someOtherObject = objectB;
objectB.anotherObject = objectA;
}
:彼は、次の例を使用しています。私はこれがどのように機能するかを明確にしたいと思います。
明らかに、各オブジェクトには2つの参照があります。最初のオブジェクトはobjectA
とobjectB.anotherObject
の両方を指しています。したがって、各オブジェクトの参照カウントは2です。しかし、関数が終了するとどうなりますか?これは実際に本には書かれていません。彼は、参照カウントは、その値への参照が別の値で上書きされるたびに減少すると言います。私はこれが意味すると思います:
function problem(){
var objectA = new Object();
var objectB = new Object();
objectA.someOtherObject = objectB;
objectB.anotherObject = objectA;
objectA.someOtherObject = objectA; //<-- that if I were to do this,
//the reference count of the first object (A)
//would become 3, and 1 for the second object (B).
}
しかし、関数が終了するとどうなりますか?私が理解する限り、objectA
とobjectB
とそれらをそれぞれ参照するそれぞれのプロパティは破壊されるので、2つのオブジェクトの参照カウントは2ずつ減少します。私はZakasの "循環参照の問題"について話す。彼が何を言おうとしているのか、誰かが説明できるのだろうか?
まだ参照カウントに依存している実装はありますか? https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Managementによると、これらのオブジェクト*はすべての最新の実装では破棄されます。 – rici
@riciいいえ、参照カウントは、少なくともその素朴な形では、この欠点と[改善が必要]のために正確には使用されません(https://en.wikipedia.org/wiki/Reference_counting#Dealing_with_reference_cycles)。 MDNが述べるように、現代のすべてのエンジンは、いくつかのマークアンドスイープの実装を使用しています。しかしながら、単純化のためにより良い性能を発揮する可能性がある場合には、それほど循環していないかまたはそれほど循環していないことが知られている特定の局所構造にも、参照カウントを適用することができる。 – Bergi
ええ、それは私が思ったことです。私はMSIEの初期のバージョンがこの問題に悩まされていたと思うので、OPに記載されている本はやや古いと思います。しかし、私の印象は、現代のES実装は、この例では両方のオブジェクトを正しくガベージコレクションすることです。質問は、参照カウントされた環境で循環参照の問題を説明することであることを理解していますが、問題が実際には存在しなくなったという回答には必ず言及する価値があります。参照サイクルを手作業で壊す必要はありませんが、あなたは依然として浮動しているアドバイスとは異なります。 – rici