자바스크립트의 쓰레기 수거 메커니즘에 대해 이야기하다

자바스크립트는 자동 쓰레기 수집 메커니즘을 가지고 있다. 즉, 실행 환경은 코드 실행 과정에서 사용하는 메모리를 관리하는 것을 책임진다.
자바스크립트 프로그램을 작성할 때 개발자는 메모리 사용에 더 이상 관심을 갖지 않고 필요한 메모리의 분배와 쓸모없는 메모리의 회수를 완전히 자동 관리할 수 있다.
이런 쓰레기 수집 메커니즘의 원리는 사실 매우 간단하다. 더 이상 사용하지 않는 변수를 찾아서 그 메모리를 방출하는 것이다.이를 위해 쓰레기 수집기는 고정된 시간 간격(또는 코드 실행 중 예정된 수집 시간)에 따라 주기적으로 이 작업을 수행한다.
브라우저에서의 구현은 일반적으로 두 가지 정책이 있는데 그것이 바로 태그 지우기와 인용 계수이다.
1. 태그 지우기
JavaScript에서 가장 자주 사용하는 스팸 수집 방식은 태그 지우기(mark-and-sweep)입니다.변수가 환경에 들어갈 때 (예를 들어 함수에서 변수를 설명하는 것) 이 변수를'환경 들어가기'라고 표시합니다.변수가 컨텍스트를 벗어나면 컨텍스트를 벗어나는 것으로 표시됩니다.
쓰레기 수집기는 실행할 때 메모리에 저장된 모든 변수에 표시를 합니다.어떤 표기 방식을 사용할 수 있다. 예를 들어 특정한 위치를 뒤집어서 변수가 언제 환경에 들어갔는지 기록하거나,'환경에 들어간'변수 목록과'환경을 떠난'변수 목록을 사용하여 어떤 변수가 변했는지 추적할 수 있다.
그리고 환경의 변수와 환경의 변수에 인용된 변수의 표시를 제거합니다.그 다음에 표시된 변수가 삭제 준비 변수로 간주됩니다. 환경의 변수가 이 변수에 접근할 수 없기 때문입니다.
마지막으로 쓰레기 수집기는 메모리 제거 작업을 마치고 표시된 값을 제거하고 메모리 공간을 회수합니다.
2. 인용 계수
또 다른 흔치 않은 쓰레기 수집 전략은 인용계수 (referencecounting) 라고 한다.인용 계수의 의미는 모든 값이 인용된 횟수를 추적하여 기록하는 것이다.
변수를 설명하고 인용 형식 값을 이 변수에 부여할 때, 이 값의 인용 횟수는 1입니다.만약 같은 값이 다른 변수에 부여된다면, 이 값의 인용 횟수는 1을 더한다.반대로 이 값에 대한 인용을 포함하는 변수가 또 다른 값을 얻으면 이 값의 인용 횟수가 1 줄어든다.
이 값의 인용 횟수가 0이 되면 이 값에 더 이상 접근할 수 없기 때문에 사용된 메모리 공간을 회수할 수 있습니다.
이렇게 하면 쓰레기 수집기가 다음에 다시 실행될 때, 인용 횟수가 0인 값이 차지하는 메모리를 방출한다.
존재하는 문제: IE에서 COM(Component Object Model, 구성 요소 대상 모델) 대상을 언급하면 순환 인용 문제가 존재합니다.다음 코드와 같습니다.

var element = document.getElementById("some_element");
var myObject = new Object();
myObject.element = element;
element.someObject = myObject;
이 예는 DOM 요소(element)와 원본 JavaScript 객체(myObject) 사이에 순환 참조를 만듭니다.
그 중에서 변수 myObject는 요소라는 속성이 요소 대상을 가리킨다.
변수 요소에도 someObject라는 속성이 있는데 myObject를 가리킨다.
이 순환 참조가 존재하기 때문에, 예시의 DOM을 페이지에서 제거해도 영원히 회수되지 않습니다.
해결 방법: 원본 JavaScript 객체와 DOM 요소 간의 연결을 사용하지 않을 때 수동으로 끊는 것이 좋습니다.

myObject.element = null;
element.someObject = null;
변수를null로 설정하는 것은 변수와 이전에 인용한 값 사이의 연결을 끊는 것을 의미합니다.쓰레기 수집기가 다음에 실행될 때, 이 값을 삭제하고 그들이 차지하는 메모리를 회수합니다.
3. 메모리 관리
최소한의 메모리를 사용하면 페이지의 성능을 향상시킬 수 있습니다.메모리의 점용을 최적화하는 가장 좋은 방법은 실행 중인 코드를 위해 필요한 데이터만 저장하는 것이다.
데이터가 더 이상 유용하지 않으면, 그 값을null로 설정하여 인용을 방출하는 것이 좋습니다. 이 방법을 인용 해제 (dereferencing) 라고 합니다.
이 방법은 대부분의 전역 변수와 전역 대상의 속성에 적용된다.로컬 변수는 다음과 같이 실행 환경을 벗어나면 자동으로 참조가 해제됩니다.

function createPerson(name){
 var localPerson = new Object();
 localPerson.name = name;
 }
var globalPerson = createPerson("Nicholas");
globalPerson = null; //  globalPerson  
변수 globalPerson에서 createPerson () 함수가 반환하는 값을 얻었습니다.createPerson () 함수 내부에서, 우리는 대상을 만들고 국부 변수인localPerson에 부여한 다음, 이 대상에name라는 속성을 추가합니다.마지막으로, 이 함수를 호출할 때, localPerson은 함수 값의 형식으로 되돌아와 전역 변수인 globalPerson에 부여합니다.
localPerson은createPerson () 함수가 실행된 후 실행 환경을 떠났기 때문에 인용을 해제할 필요가 없습니다.
그러나 전역 변수인 글로벌퍼슨의 경우 우리가 그것을 사용하지 않을 때 수동으로 인용을 해제해야 한다. 이것이 바로 위의 예에서 마지막 줄의 코드의 목적이다.
다음은 자바스크립트의 쓰레기 회수 메커니즘에 대한 상세한 내용입니다. 자바스크립트 쓰레기 회수에 대한 더 많은 자료는 저희 다른 관련 글을 주목해 주십시오!

좋은 웹페이지 즐겨찾기