javascriptのメモリが漏れています.

2733 ワード

ゴミ回収の仕組み
JavaScriptは自動ごみ回収メカニズムを持っています.どの変数がもう必要でないかを判断して、彼が占めているメモリを釈放します.
1.変数のライフサイクル
作成時、JavaScriptは自動的に彼のためにメモリを割り当てます.そしてゴミ回収メカニズムは一定の時間間隔でこれらの変数を評価します.彼が有効かどうかを見てください.無効な場合はメモリをリリースします.
2.よくあるゴミの回収方法:
  • は、各値が参照された回数をカウントして追跡し、参照回数が0である場合、メモリの空き領域を回収する.変数を宣言して参照型の値を変数に割り当てた場合、この値の参照回数は1であり、同じ値が他の変数に割り当てられている場合、この値の参照回数は1であり、この値に対する参照を含む変数はまた別の値を取得すると、この値の参照回数は1である.発生した問題:循環参照は、参照回数が永遠に0でないことを招き、占有されたメモリ空間を回収できなくなり、メモリ漏れを引き起こします.解決:手動で循環参照を解除し、直接nullにする.注意:IEの一部のオブジェクトは元のJavaScriptオブジェクトではない.例えば、そのBOMとDOMの対象は、C++を使用してCOM(Component Object Model、コンポーネントオブジェクト)オブジェクトとして実現され、COMオブジェクトのゴミ回収器は参照カウントを採用するポリシーである.したがって、IEにはCOMオブジェクトがある限り、循環参照問題があります.
  • タグクリア1.例えば、変数が実行環境に入ると、変数を「環境に入る」とマークし、変数が環境から離れると、それを「環境から離れる」とマークします.私たちは環境に入る変数を解放できません.使うかもしれません.2.ゴミ回収器は、実行時にメモリに格納されているすべての変数にマークを付け、環境の変数や環境の変数に参照されている変数(クローズド)を削除します.これらの完了後もマークが残っているのは、削除する変数です.環境内の変数はこれらの変数にアクセスできなくなりました.そしてゴミ回収器はこれらのマークが付いた変数マシンのスペースを回収します.発生した問題:消去後、メモリ空間は不連続で、つまりメモリの破片が現れて、マーク-整理方法は効果的にこの問題を解決できます.整理の過程は不連続なメモリを端にコピーして、不連続なメモリを連続的にします.
  • メモリリーク
    メモリ漏れ:不要なメモリを即時に解放していません.私たちはもうjsコードである対象を引用することはできませんが、ゴミ回収器はこの対象がまだ引用されていると考えていますので、回収時には釈放しません.
    メモリリークの形式
  • 予期しないグローバル変数の未宣言変数への参照は、グローバルオブジェクト内に新たな変数を作成する
  • である.
    function foo(arg) {
        bar = "";
    }
    foo();
    
    barの役割領域はwindowですので、関数fooが実行されたらbarは回収されません.
  • クローズドパケットは、内部方法が外部方法変数への参照を維持するためにメモリリークを引き起こすことができるので、方法が戻っても、外部方法で定義されたプライベート変数にアクセスし続けることができる.クローズドバックはよく知らず知らずのうちに循環参照を作成します.だから、メモリ漏れに対して責任があります.
    function setHandler() {
        const ele = document.getElementById('id');
        ele.onclick = function() {
            alert(ele.id);
        };
    }
    
    ele要素イベントハンドラとしてのクローズドを作成します.また、閉じたパケットは循環参照を作成します.
  • 忘れられたタイマまたはコールバック関数
  • var someResource = getData();
      setInterval(function() {
        var node = document.getElementById('Node');
        if(node) {
          node.innerHTML = JSON.stringify(someResource));
        }
      }, 1000);
    
    setIntervalが終了しない限り、コールバック関数の変数およびコールバック関数自体は回収されません.じゃ何が終わりですか?clearIntervalを呼び出しました.コールバック関数内に何もしていないし、クリアされていないとメモリが漏れてしまいます.setTiemoutも同じ問題があります.clearTimeoutを呼び出す必要があります.
  • DOMからの参照は、DOMノード内部のデータ構造を保存するために有用である.表の何行かの内容を素早く更新したいなら、各行のDOMを辞書(JSONキーの値です.)に保存したり、配列したりするのはとても意味があります.この時、同じDOM要素には二つの参照があります.一つはDOMツリーの中、もう一つは辞書の中にあります.将来これらの行を削除することにした場合、二つの参照を全部クリアする必要があります.
  • 参考:https://www.ibm.com/developerworks/cn/web/wa-jsmemory/index.html http://bubkoo.com/2015/01/31/understanding-and-solving-internet-explorer-leak-patterns/https://jinlong.github.io/2016/05/01/4-Types-of-Memory-Leaks-in-JavaScript-and-How-to-Get-Rid-Of-Them/https://segmentfault.com/a/1190000007616791#articleHeader4