2017-01-24 15 views
-1

実際の問題は解決する必要があります:私は大規模なアプリケーションで作業しています。最初のリリースは約2年前です。アプリケーションに新しいページを追加し、奇妙な動作に気づいています。新しい画面は「常時オン」ステータス画面になります。つまり、アプリケーションのデフォルト画面であり、アプリケーションが実行される専用PCは常にデフォルトで表示されます。一定時間(IEのほんの数分、通常はChromeでもっと長い時間が経過した後)に、動作がうまくいきません。第1に、スクロールメッセージのアニメーション(もしあれば)が不安定で遅くなり、最終的に約1ピクセル/秒で動くように見える。私たちが使用しているマシンではIEで数分でチョップが始まり、数時間でクロールが遅くなります。その時までに、他の奇妙な行動が始まりました。ブラウザ自体は反応が遅くなります。この画面にはメニュー/ログインボタンがあり、クリックすると何かが起こるまでに3〜4秒の遅延があります。他のビジュアル要素は、ユーザーとのやり取りがないのに、更新する前に同様の遅延があります。再帰的ポーリングの方法でのJavaScriptのメモリリーク

私はこのページのすべてを見て、数日を過ごしました。は、データをポーリングするために使用するサービス内のメモリリークの原因を絞り込んでいると思います。サービスを使用している各ページに表示されますが、多数の視覚的手がかり(スクロール、アイコン/色の更新など)のために、この現象は新しい画面上の問題に過ぎないと考えています。データが更新されたときに毎サイクル実行される集中的な処理/グラフングを持ち、他のスクリーンを立ち上げて実行していない可能性が高いという事実は、ワーキングページ。

Chromeのデベロッパーツールでタイムラインのスクリーンショットを撮りました。これはそのようです。ポーリングサービスを使用している各ページでも同様です。 This is what the graph looks like for the actual page.

私はdemo of just the pollingを作成し、同様のグラフを得ました:Demo from plnkr。デモではそれほど重大ではないようですが、パターンは明らかに似ており、メモリリークのように見えます。 どのようにしてメモリリークを解決し、他の問題を解決できますか?

いくつかの関連するコード:

var reload = function() { 
     $http({ 
      method: 'GET', 
      url: 'api.txt', 
      timeout: 5000 
     }) 
     .success(function(response) { 
      //do stuff 
     }) 
     .error(function(data) { 
      //do other stuff 
     }) 
     .finally(function() { 
      timer = $timeout(reload, 1000); 
     }); 
    }; 
+0

実際の割り当て/割り当て解除を確認してください。*保持されている/漏れていることを伝える必要があります。 –

+0

@ DanielA.Whiteどうすれば確認できますか?プロファイルタブを使用してスナップショットをチェック/比較しましたが、私が探しているものが正確ではありません。私は奇妙なことは何も見ていないが、私はこれまでのようなものを追跡することはなかった。何がそこにあるのか、何がないのかを私はどのように知っていますか? – senschen

+0

https://developers.google.com/web/tools/chrome-devtools/memory-problems/ –

答えて

0

あなたがどこかにあなたのコード内でクロージャを使用していますか? これらのタイプの問題は、オブジェクトが破棄されないJavaスクリプト内の場所であるため、多くのクロージャを使用しているときにのみ発生するため、あまりにも多くのクロージャを使用すると最終的にメモリ不足になります。

+0

私は '$ http'コールの成功関数に' $ scope.data = response; 'のような行があります'reload()'。 '応答'が使われる唯一の時間であれば、それはクロージャーとしてカウントされますか? – senschen

+0

は、関数内の関数をカウントしない関数をクロージャと呼びます。 –

+0

それは閉鎖になるという意味ではありませんか?成功関数は 'reload()'の内部にあり、再帰的に呼び出されます。 – senschen

関連する問題