>웹 프론트엔드 >JS 튜토리얼 >Javascript 가비지 컬렉션 메커니즘 소개 및 이해_기본지식

Javascript 가비지 컬렉션 메커니즘 소개 및 이해_기본지식

WBOY
WBOY원래의
2016-05-16 17:33:49805검색

Javascript를 자주 사용하는 사람들은 가비지 수집 메커니즘에 대해 생각할 것입니다. Javascript는 개발자가 C 및 C와 같이 가비지를 수동으로 지울 것을 요구하지 않습니다. Javascript 프로그램을 작성할 때 개발자는 메모리 사용량, 필요한 메모리 할당 및 쓸모없는 메모리(쓰레기)의 재활용은 자동으로 완전히 관리됩니다. 근본 원인은 프로그램이 더 이상 사용되지 않는 변수를 수집하고 해당 변수가 차지하는 메모리를 해제하기 때문입니다. 따라서 가비지 수집 메커니즘은 이 작업을 고정된 간격으로 주기적으로 반복적으로 수행합니다.


예를 들어 지역 변수는 함수 내부에만 존재합니다. 프로그램은 스택 메모리나 힙 메모리에 지역 변수에 해당하는 저장 공간을 할당합니다. 함수가 끝나면 지역 변수가 차지하는 메모리는 더 이상 존재하지 않습니다. 필요한 경우 프로그램은 다른 변수에서 사용할 수 있도록 지역 변수가 차지한 메모리를 해제합니다. 이는 프로그램이 메모리를 해제하는 가장 간단한 방법이지만 프로그램의 변수는 항상 사용됩니다. 이 때 가비지 수집 메커니즘은 변수를 추적하고 사용 여부와 메모리 공간을 확인해야 합니다. 출시될 수 있습니다.

가비지 수집 메커니즘은 주로 마크 앤 클리어 방법과 참조 카운팅 방법의 두 가지 방법으로 메모리 공간을 해제하기 위해 변수를 판단합니다.

표기법에 따르면 각 변수에는 고유한 실행 환경이 있습니다. 변수가 생성된 후에는 특정 환경에서 실행됩니다. 예를 들어 로컬 변수를 생성하면 해당 로컬 변수가 함수 본문에서 실행됩니다. 함수가 실행 중일 때 로컬 변수는 "환경에 진입 중"으로 표시되며, 함수 본문이 종료되면 변수가 실행 환경을 떠난다는 의미입니다. . "환경을 떠나는" 변수의 경우 가비지 수집 메커니즘은 이를 적절하게 기록하고 다음 수집 주기에 해제합니다.

각 값이 참조되는 횟수를 추적하는 참조 계산 방법입니다. 변수를 선언하고 참조 유형 값을 변수에 할당하면 해당 값의 참조 카운트는 1입니다. 동일한 값이 다른 변수에 할당되면 해당 값의 참조 카운트가 1 증가합니다. 반대로, 이 값에 대한 참조를 포함하는 변수가 다른 값을 취하는 경우 해당 값의 참조 카운트는 1씩 감소합니다. 이 값에 대한 참조 횟수가 0이면 더 이상 이 값에 접근할 수 없다는 뜻이므로 차지하는 메모리 공간을 재활용할 수 있다. 다음 주기에서 가비지 수집기가 실행되면 참조 횟수가 0인 값이 차지한 메모리 공간이 해제됩니다. (원문 설명 참고 : Javascript Advanced Programme - Second Edition)

예:

코드 복사 코드는 다음과 같습니다. Object( ; 1
    }


이 함수가 종료된 후 object1의 카운터 판독값은 1이고 object2의 카운터 차수는 1입니다. 따라서 두 변수 모두 파괴되지 않습니다. 함수 본문에 이러한 프로그램이 많이 존재하면 많은 양의 메모리가 낭비되고 재활용할 수 없어 메모리 누수가 발생합니다.

위 문제를 해결하려면 object1 object2가 차지하는 메모리를 수동으로 해제하십시오. 즉,



코드 복사


코드는 다음과 같습니다.
object1.method1 = null; 2 .method2 = null; 위의 예를 비교하고 일반적인 상황에서 예를 들어보세요.


코드 복사

코드는 다음과 같습니다.

function countMethod(){
var object1 = new Object(); // 변수 선언, 카운터가 0에서 1로 변경
var object2 = new Object(); 0에서 1까지
object1.method1 = "이것은 object1입니다."; // object1 카운터 -1, object1 읽기는 0으로 변경됩니다.
object2.method2 = "이것은 object2 카운터입니다." // object2 카운터입니다. object2 읽기는 0이 됩니다
}

위의 예에서 볼 수 있듯이 일반적인 상황에서는 함수가 종료되면 object1과 object2의 읽기가 0이 됩니다. 다음 가비지 수집에서는 주기마다 재활용되고 차지하는 메모리가 해제됩니다.
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.