4

アプリケーションに、サーバーから一部のコンテンツ (現在サインインしているユーザーのリスト) を 10 秒ごとに更新するページがあります。このデータはmootools フレームワークのAjaxクラスを使用してロードされます。具体的には次のような Javascript を使用します。

var xmldata = (function() {
    new Ajax('xmldata.jsp?time='+$time(), {method: 'get', onComplete: dataLoaded, autoCancel: true}).request();
}).periodical(10000);

(10 秒ごとにAjaxオブジェクトを作成し、そのメソッドを呼び出します。このメソッドは、完了するとメソッドrequest()を呼び出しdataLoaded()ます)。

ユーザーがブラウザ ウィンドウを開いたままこのページを約 45 ~ 60 分間開いたままにしておくと、別の場所に移動しようとすると、IE (確かに v7、v6 も同様で、Firefox または Chrome にはこの問題はありません) が次のように表示されます。現れる:

このスクリプトの実行を停止しますか?
このページのスクリプトが原因で、Internet Explorer の実行速度が低下しています。実行し続けると、コンピューターが応答しなくなる可能性があります。

さて、これは mootools フレームワークの基礎となるスクリプトのある種のリークが原因である可能性が高いと思われます - あまりにも多くのAjax.request()呼び出しが呼び出されるためにキューに入れられているか、いくつかのオブジェクトが適切にクリーンアップされていません。いくつかのガベージコレクション機能が含まれているはずです。

IE の Javascript エンジンが裏で行ったことを分析する最善の方法は何ですか? 私の仮説のいずれかが正しいかどうかを判断する方法はありますか?

同様の質問で、誰かが IBM Page Profiler を使用してこの問題をデバッグすることを提案したことがわかりました。Page Profiler を使用してみましたが、あまり成功していません - ページの初期読み込みに問題がある場合 (どのコンポーネントが過度の読み込み遅延を引き起こしているかを分析するため) に役立つようですが、そうではないようですページが完全にロードされた、ページ内で実行されている Javascript で何が起こっているかを分析できるようにします。ページ プロファイラーで、xmldata.jsp への非同期呼び出しが 10 秒ごとに要求されていることがわかりますが、ページ プロファイラーは、サーバーが (約 600 ミリ秒で) 正常に応答したことだけを示していますが、親ページのスクリプトがこのデータをどのように使用しているかについての洞察はありません。

さらに、閉鎖された mootools ディスカッション リストのこの投稿unloadで、誰かがこの問題を解決するためにガベージ コレクション メソッドを呼び出すリスナーを登録するコードを削除することを提案していますが、それは問題自体ではなく、問題の症状を解決するように思えます。 .

4

2 に答える 2

4

これはおそらく IE のメモリ/リソース リークです。これらの最も一般的な原因は、コードまたはフレームワーク コードのクロージャーです。報告されたバグについては、JavaScript フレームワークの課題トラッカーを常にチェックしています。多くの場合、他のユーザーからのバグレポートと修正によって救われてきました。

問題の追跡を試みるには、「 leak detector」などを試すことができます。IE メモリ リークの理論を説明する優れたmsdn 記事もあります。

リークの多くの原因はイベント ハンドラーです。これを理解するには、MSDN の記事を読む必要があります。これらは多くの場合、あなたのタイプのリークを作成するため、イベント ハンドラーの登録を解除することを検討することをお勧めします。

10 秒ごとに 1 時間継続してリロードするというのはかなり良さそうに思えます。IE がはるかに良くなると期待すべきかどうかはわかりません (少し低いかもしれませんが、それでも)。期待を調整するか、少なくとも 1 つのバージョンの IE でより適切に動作するという目標を設定する必要があるかもしれません。

期待事項: IE の「一般的な」バージョンの場合、これらのすべてのバージョンで長期実行アプリケーションの 100% の安定性を目標にできるほど、さまざまなバグを含むさまざまなバージョンが多すぎます。したがって、少なくとも最初は、特定のバージョンをターゲットとして選択するのが賢明だと思います。

于 2008-12-23T17:15:36.297 に答える
0

まず、リークを1時間実行して、IEのメモリ使用量が大幅に増加するかどうかを確認することでリークをチェックすることをお勧めします。もう1つの問題は、IEにある種の内部カウンターがあり、ページ上でjavascriptが使用した合計時間を計算し、x秒を超えて使用すると警告を表示することです。各リクエストが多くのCPUを使用していなくても、1時間の間に多くのCPUを使用している可能性があるため、IEはこれを問題として検出する可能性があります。また、私はmootoolsに精通していませんが、JavaScriptコードでの待機時間を最小限に抑えるために、非同期AJAX呼び出しを使用していることを確認することをお勧めします。

于 2008-12-23T18:00:05.583 に答える