同僚と私は(プロジェクトでブラウザーコントロールオブジェクトを使用して)ブラウザーについて話していましたが、すべてのブラウザー(Firefox、Chrome、IE、Opera)がその使用方法とそれは「メモリの漏洩」です。
誰かがその理由を説明できますか?確かに、あらゆる形式のコードと同様に、適切なガベージコレクションが必要ですか?
PS。なぜこれが開発者の観点から起こり得るのかについて、いくつかの防御パターンについて読みました。 IEでCrockfordが書いた記事を知っています。しかし、なぜすべてのブラウザで問題が発生するのでしょうか?ありがとう
ブラウザがメモリをリークする可能性のある場所は4つあります。
ウェブページ
最近のブラウザーでは、これは完全にWeb開発者に任されています。ガベージコレクションされた環境は、まだ参照されているメモリを収集しないため、意味を持たずにメモリの参照を維持する方法はたくさんあります(たとえば、イベントハンドラーとしてアタッチするクロージャーを作成し、誤って大量の変数をその中に含める)クロージャのスコープ)。 Web開発者は、コード内の変数参照を適切に処理することにより、これらのリークを完全に解決できます。通常、ページの再読み込みによってメモリが解放されます。
アドオン
アドオンもガベージコレクション言語(javascriptなど)で記述されている場合、アドオンは同じ問題に悩まされます。ただし、ページのリロードでは通常、このメモリが解放されないため、ブラウザがメモリをリークしているように見えますが、実際にはアドオン開発者の責任です。私の知る限り、これがブラウザリークの最大の原因です(そのため、デフォルトの推奨事項は、アドオンなしでリークが発生するかどうかをテストすることです)。
ブラウザエンジン
最新のブラウザエンジンはすべてC++で記述されています。 C++はガベージコレクションされませんが、代わりに明示的なメモリ割り当てを使用します。開発者がメモリを割り当てた後、割り当てを解除することを忘れると、エンジンはメモリをリークします。私の知る限り、すべてのブラウザメーカーは、この種のリークを見つけて解決するために、多くのテストとコードレビューを行っています。 100%修正されているわけではなく、今後も修正されることはありませんが、大きな問題ではなくなりました。
リークなし
最後に、ブラウザのプロセスが使用中に範囲が拡大することを意味するさまざまなキャッシュ機能があります。これらはリークではなく、利用可能なRAMを最適に利用することを目的としています。通常、メモリフットプリントは最大になり、そこでホバリングします。
これが私が 'Net、 Internet Explorerでのメモリリーク-再考 で見つけた最良の答えと、その理由を説明するスニペットです:
上記のパターンは、DOMノードとJS要素の間に作成された循環参照が原因でリークします。
JScriptガベージコレクターはマークアンドスイープGCであるため、循環参照を処理すると考えるかもしれません。そして実際にはそうです。ただし、この循環参照はDOMとJSの世界の間のものです。 DOMとJSには別々のガベージコレクタがあります。したがって、上記のような状況ではメモリをクリーンアップできません。
「リーク」として分類しているのが積極的なキャッシュであるとしても、私は驚かないでしょう。今日でも、ネットワークの往復時間は、メモリ内のキャッシュから何かをフェッチするのに比べて(時間的に)「高価」です。 FirefoxまたはChromiumのソースを入手して、キャッシュの管理方法を確認することをお勧めします。 Firefoxは少なくとも最近閉じたウィンドウ/タブを再び開くことをサポートしているので、サイトを完全に閉じても、キャッシュされた画像やスクリプトが削除されるとは限りません。