Computer >> 컴퓨터 >  >> 프로그램 작성 >> JavaScript

JavaScript의 Mark and Sweep 알고리즘에 대해 자세히 설명하시겠습니까?

<시간/>

마크 및 스윕 알고리즘

Mark and Sweep 알고리즘은 '더 이상 필요하지 않은' 개체보다 '도달할 수 없는' 개체를 찾습니다. 이 알고리즘은 참조 카운팅 알고리즘을 개선한 것입니다.

이 알고리즘은 실제로 3가지 중요한 단계를 거칩니다.

  • 루트:일반적으로 루트는 코드에서 사용되는 전역 변수입니다. 자바스크립트의 윈도우 객체는 루트 역할을 할 수 있습니다. 이 알고리즘은 전역 개체 루트를 사용하여 개체에 연결할 수 있는지 또는 연결할 수 없는지 여부를 찾습니다.
  • 이 알고리즘은 모든 루트와 그 자식을 모니터링합니다. 모니터링하는 동안 제공된 조건에 따라 도달 가능한 일부 개체가 표시되고 도달할 수 없는 나머지 개체가 표시되지 않습니다.
  • 표시되지 않은 개체, 즉 연결할 수 없는 개체는 가비지 수집됩니다.

마크 단계

표시 단계에서 표시되는 요소와 표시되지 않은 요소를 찾을 수 있습니다. 주어진 Example-1과 같이 객체 'obj1'에 'hello' 속성을 할당한다고 가정해 봅시다. 이 알고리즘에서 사용하는 전역 객체인 루트는 obj1 및 해당 속성 'hello'에 도달할 수 있습니다. 그래서 지금 표시됩니다.

예시-1

var obj1 = {
pro1: "hello" // marked because it can be reached by root.
}

예-2와 같이 이 객체에 null 값을 할당한다고 가정합니다. 그러면 새로 할당된 'null'이 표시되고 이전에 할당된 'property hello'는 표시가 해제됩니다. 따라서 Mark 단계가 끝나면 'null'이 할당된 개체가 표시되고 'property hello'가 할당된 개체가 표시 해제되었다는 결론을 내릴 수 있습니다.

예시-2

obj1 = null // null will be marked(reachable) and hello will be unmarked(unreachable)

스윕 단계

이름에서 알 수 있듯이 도달할 수 없는 개체를 '소탕'합니다. 표시 단계에서 "property hello"가 있는 개체가 표시되지 않아 연결할 수 없는 것을 보았습니다. 도달할 수 없는 개체는 가비지 수집되므로 이 단계에서 'property hello'가 있는 개체는 가비지 수집됩니다.

Mark and Sweep 알고리즘은 프로그램에서 직접 또는 간접적으로 액세스할 수 있는 전체 개체 컬렉션을 추적하기 때문에 추적 가비지 수집기라고도 합니다.

자전거는 더 이상 문제가 되지 않습니다

다음 예제에서 함수 호출이 반환될 때 두 개체 obj1 및 obj2는 가비지 수집에 적합하여 거기에 도달할 수 있는 무언가에 의해 참조되지 않습니다. 따라서 가비지 수집기는 obj1 및 obj2 개체의 메모리를 해제합니다.

예시

function f() {
   var obj1 = {};
   var obj2 = {};
   obj1.p = obj2; // obj1 references obj2
   obj2.p = obj1; // obj2 references obj1. This creates a cycle.
}
f();

제한 사항

언제 어떤 메모리가 해제되는지 수동으로 결정하는 것이 매우 편리한 순간이 있습니다. 객체의 메모리를 해제하려면 명시적으로 접근할 수 없도록 만들어야 합니다. JavaScript에서 명시적으로 가비지 수집을 트리거하는 이 프로세스는 현재로서는 불가능합니다.