11

私は現在、qooxdooJavaScriptフレームワークのオブジェクト処理処理を再考しています。
次の図を見てください(Aは現在スコープ内にあります)。

図http://yuml.me/51747906.jpg

Bを削除したいとします。通常、すべてのオブジェクト間のすべての参照を切り取ります。これは、例では接続1から5を切断することを意味します。これは本当に必要ですか?私がここ
で 読んだ限りでは、ブラウザはマークアンドスイープアルゴリズムを使用しています。その場合、参照1(スコープへの接続)と5(DOMへの接続)をカットする必要があります。これははるかに高速です。 しかし、すべてのブラウザがマークアンドスイープアルゴリズムまたは同様のものを使用していることを確認できますか?

4

2 に答える 2

2

適切なガベージコレクター(マークアンドスイープだけでなく)の場合、接続1を切断するだけでB(およびCとDとウィンドウ)を解放できます。参照カウントに基づく割り当ては、循環参照(B参照DおよびD参照B)のためにBおよびDの解放に失敗しますが、参照カウントは実際にはガベージコレクションではありません。

すべてのブラウザーが適切なガベージコレクターを使用していると想定するのは安全だと思います(ブラウザーでは、本当に安全なものはありませんが、適切なガベージコレクターを使用しないJavaScript実装はありそうにありません)。

于 2010-04-19T15:12:21.793 に答える
2

重要なのは、理想的な世界では、基本的にDOMノードとネイティブイベントリスナーを切断するだけでよいということです。ただし、問題は、qooxdooの元のシステムがIE6のようなバグのあるブラウザーを中心に設計されていることです。自分で可能な限り削除すると、メモリ使用量が大幅に削減されました。しかし、今日の世界では、IE6で問題がないように再設計しますが、問題に対して最適化されていません。

また、アプリケーション全体を完全にシャットダウンする(すべてを破棄する)ことと、アプリケーションの一部を破棄することの違いもあります。最後のシナリオでは、まだ必要なものを処分しないように非常に注意深く行動する必要があります。

于 2010-04-20T07:01:09.297 に答える