2

Dojo を使用してリッチ Web アプリケーションを開発しました (さまざまなビュー、多数のボタン、ビュー間のイベントなどを使用)。すべてのデータは、Rest インターフェースを介して非同期でロードされます。

Internet Explorer 8 では、アプリケーションのフットプリントが非常に大きく、アプリケーションへの URL が同じタブ/ブラウザー ウィンドウ内で 2 回以上開かれると、フットプリントが大きくなり、すぐにメモリ不足になることがわかりました。

Dojo はイベント ハンドラー/DOM ノードを切断していないようです。

これを追跡して、単一の Dojo ボタン ウィジェットのみを含む単純な html ページにたどり着き、sIEve (IE8 のメモリ リーク アナライザー) を使用してその html ページを分析しました。html ページが再度呼び出されると、一部の DOM ノードは解放されません (孤立します)。

孤児を防ぐための設定/トリック/パターンはありますか?

この動作が、アプリケーション URL を離れたときにリリースされない Dojo アプリケーションの巨大なフットプリントを引き起こしていると思います。

これは、サンプルの html ページです。

<html>
<head>
    <title>MemLeak Test</title>
    <style>
        @import "../themes/claro/claro.css";
    </style>
    <script
        type="text/javascript"
        data-dojo-config="'parseOnLoad':true"
        src="../js/dojo-release/dojo/dojo.js"></script>
    <script type="text/javascript">
        require([ "dojo/parser" ]);
        require([ "dijit/form/Button" ]);
    </script>
</head>
<body class="claro">
    <h1>Memory Leak?</h1>
    <input
        type="button"
        dojoType="dijit.form.Button"
        label="Button"></input>
</body>

サンプルの html ファイルを sIEve で 2 回開いた後、すでに 18 個の孤立した項目が報告されています。HEAD、SCRIPT、DIV、SPAN (異なる順序で繰り返されます)。すべて Ref が 1 つしかなく、リークとしてマークされています!; (すみません、スクリーンショットを投稿できません)

そのトピックに関するヘルプをありがとう。

4

1 に答える 1

0

問題は、これらのウィジェットを決して破棄しないため、ブラウザーがイベントや dom ノードなどへのすべての参照をメモリに保持することです。アンロード イベント リスナーを使用して問題を部分的に解決し、作成したウィジェットの destroy メソッドを呼び出すことができます。

次に例を示します。

require(['dojo/_base/unload', 'dojo/_base/array'], function(unload, array){
    unload.addOnUnload(function(){
        array.forEach(myWidgets, function(wgt){
            wgt.destroy();
        });
    });
});

または、ウィジェットへの参照がない場合は、dijit レジストリを反復処理できます。

require(['dojo/_base/unload', 'dojo/_base/array', 'dijit/registry'], function(unload, array, dijitRegistry){
    unload.addOnUnload(function(){
        array.forEach(dijitRegistry.toArray(), function(wgt){
            wgt.destroy();
        });
    });
});
于 2013-03-11T19:44:59.853 に答える