私が作業しているアプリケーションのUIは最近Ext.jsで再作成されましたが、IEを表示するとIEのメモリ使用量が非常に多いように見えることに気付きました。IEを使用する場合のExt.jsの既知のメモリの問題はありますか?
4 に答える
あなたの質問で私に最初に飛び出すのは、IEでこれを見ているということです。私のチームは最近同じ問題を経験しました(IEのExtjs)。Extが原因ではなく、IEが原因である可能性が高いことがわかりました。
「IEクロージャメモリリーク」の簡単なグーグルはあなたにたくさんの説明を見つけるでしょう、しかし基本的な要点は次の通りです:
IEは、2つの別個のエンジンを使用してDOMとJavaScriptを管理します。JavaScriptがDOM要素を作成するための呼び出しを行うと、Javascriptエンジンは他の要素に到達してそれを作成します。JavaScriptをDOM要素のイベントにアタッチすると、DOM側からJavaScript側へのリンクが作成されます。
問題は、各エンジンに独自のガベージコレクションがあり、他のエンジンを見渡すことができないという事実にあります。したがって、循環参照は非常に簡単に見つけられ、大量のメモリをすぐに消費する可能性があります。
経験の浅いプログラマー向けにExtJSでプログラミングする場合、メモリリークが発生するのは非常に簡単だと思います。これ自体はExtJSの問題ではありません。これは、プログラマーがそのような間違いを簡単に犯すことができるExtJSプログラミングパラダイムです。
私の経験から、ExtJSを使用して単純なAJAXチャットを作成しようとすると、メモリリークが発生しました。一部のオブジェクトがAJAXコールバック内で常に作成されている場合(データストア、グリッド操作など)、これらのオブジェクトは解放および破棄されません。ExtJSでのメモリリークを回避するために使用される特別で非常に巧妙な手法が必要であり、それはAJAXやコールバックに関連しているだけではありません。
全体として、ExtJSは優れたライブラリですが、慎重に使用する必要があります。
私に関する限り、ExtJSでの顕著なメモリリークについては聞いたことがありません。いくつかあると思いますが、通常はかなり早く修正され、コミュニティは非常に大きいため、ほとんどのバグが知られています。
ほとんどの場合、ExtJS Webページは1回だけ読み込まれ、memは指定した追加のコンポーネントでいっぱいになるため、デザインが個々のコンポーネントに基づいていることを確認してください。コンポーネントの使用が終了したら、Ext.destroy(this.el)を使用して一部のメモリを解放できます。
また、Firebugを使用して、削除する必要のあるコンポーネントまたはオブジェクトを追跡していることを確認してください。
孤立した要素によって引き起こされるExt2.2の多くのリークをカバーする、フォーラムのこのスレッドをチェックしてください。Ext2.2.1はそれらのほとんどを修正したようです。
ところで、問題はまだ開いています。;)