ごみ収集器

7012 ワード

メモリライフサイクル


メモリ割当て


オペレーティングシステムはメモリを割り当ててプログラムの使用に供します
低レベル言語(Cなど)では,開発者が明確に処理しなければならない.
しかし、高標準言語では、開発者は心配する必要はありません.

メモリ使用量(使用)


実際のアプリケーションで割り当てられたメモリを使用するには
開発者は、コードで指定した変数を使用して読み書き操作を実行します.

メモリの解放


プログラムに不要なメモリをすべて返し、再使用できるようにするには
メモリ割り当て操作と同様に、低レベルの言語は明示的に処理する必要があります.

JSにメモリを割り当てる

var s1 = 'sessionstack';
var s2 = s1.substr(0, 3); // s2는 새로운 문자열이 됨
// 문자열은 불변(immutable)이므로 자바스크립트는 메모리를 할당하지 않고 
// [0, 3]의 범위만 저장할 수도 있음

var a1 = ['str1', 'str2'];
var a2 = ['str3', 'str4'];
var a3 = a1.concat(a2); 
// 4개의 요소를 가진 새로운 배열은 a1과 a2 요소의 연결이 됨

ごみ収集


不要なメモリを特定できないため、ゴミ収集には特定の制限ソリューションのみが適用されます.

計算参照数ゴミ収集


オブジェクトが参照を指していない場合は、ゴミ収集ターゲットとみなされます.
var o1 = {
  o2: {
    x: 1
  }
};
// 두 객체가 생성됨
// 'o2'는 'o1'이 자신의 속성으로서 참조함
// 둘 다 가비지컬렉션 될 수 없음
var o3 = o1; // 'o3' 변수는 'o1'이 가리키는 오브젝트에 대한 참조를 갖는 두 번째임
o1 = 1;      // 이제 'o1'에 있던 객체는 하나의 참조만 남게 되고
             // 그것은 'o3' 변수에 들어 있음
var o4 = o3.o2; // 'o2' 속성에 대한 참조
                // 이제 이 객체는 두개의 참조를 가짐. 하나는 속성으로서 
                // 다른 하나는 'o4' 변수로서
o3 = '374'; // 원래 'o1'에 있던 객체는 이제 참조를 하는 곳이 없음 
            // 따라서 가비지컬렉션 될 수 있음
            // 하지만 'o2' 속성은 'o4' 변수가 참조하므로 가비지컬렉션 될 수 없음
o4 = null; // 원래 'o1'객체 내에 있던 'o2'속성은 이제 참조하는 곳이 없으므로
           // 가비지컬렉션 될 수 있음

ループ参照による問題

function f() {
  var o1 = {};
  var o2 = {};
  o1.p = o2; // o1은 o2를 참조함
  o2.p = o1; // o2는 o1을 참조함. 이를 통해 순환 참조가 만들어짐.
}
f();
上記の例では、各オブジェクトが互いに参照されているため、ループ参照を作成します.
ただし、関数を呼び出すと、スキャン範囲を超えるため、実際にはゴミ値になります.
ただし、参照カウントを計算するアルゴリズムでは、2つのオブジェクトが少なくとも1回参照されるため、2つのオブジェクトを不正に収集することはできません.

タグ交換アルゴリズム


オブジェクトがオブジェクトに接触できるかどうかを決定し、オブジェクトがゴミ値であるかどうかを決定するアルゴリズム.

  • Root:通常、Rootはコード参照のグローバル変数です.
  • JSはwindow対象
  • node.jsはglobalオブジェクトです
    ごみ収集器はすべてのルートの完全なリスト
  • を生成する.

  • すべてのルートディレクトリとサブディレクトリをチェックして、アクティブかどうかを示します(アクティブな場合はゴミ値(ゴミ)ではありません).
  • 本触れられないものはゴミ紙で
  • と表記する.

  • アクティブとマークされていないすべてのメモリをosに返します.
  • ごみ収集器の実行時


    開発者はごみ収集がいつ役に立つか分かりにくい.
    これは、プログラムが実際により多くのメモリを使用できることを意味します.
    非正統主義はいつごみ収集が行われるか分からないことを意味するが.
    ほとんどのゴミ収集器の実装では、通常、メモリ割り当て中にゴミ収集が転送されます.
    割り当てられていない場合、ほとんどのゴミ収集器は何も実行しません.
    リファレンスサイト