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

JavaScript의 메모리 누수에 대해 자세히 설명하시겠습니까?

<시간/>

자바스크립트의 메모리 누수

JavaScript는 가비지 수집 언어라고 합니다. 즉, 변수가 선언되면 자동으로 메모리를 할당합니다. 선언된 변수에 대한 참조가 더 이상 없으면 할당된 메모리가 해제됩니다. 메모리 누수나 대부분의 메모리 관련 문제는 메모리를 해제하는 동안 발생합니다.

몇 가지 일반적인 JavaScript 누출

1) 우연한 전역 변수

선언되지 않은 변수가 참조되면 javascript는 전역 개체에 새 변수를 만듭니다. 다음 예제-1에서 언어의 목적은 "myArray" 함수의 변수만 참조하는 것이라고 가정합니다. var를 사용하여 선언하지 않으면 전역 변수가 생성됩니다. 큰 피해는 없으나, 예제-2와 같이 "this" 키워드를 사용하여 실수로 전역 변수를 생성했을 때 가장 큰 문제가 발생합니다.

예시-1

function myArray(arg) {
   languages = "[javascript,.....]";  //  created using window
}

예시-2

function myArray(arg) {
   this.languages = "[javascript,.....]";  // global object  
}

전역 변수의 범위는 결코 끝나지 않기 때문에 필요하지 않더라도 페이지 실행 내내 메모리에 남아 있습니다. 이 시나리오는 변수 범위가 끝나면 동적 메모리를 제거하는 가비지 수집기를 만들어 메모리 누수(미사용 메모리에 남아 있는 개체). 전역 변수가 많을수록 메모리 누수가 더 많이 발생합니다.

2) 폐쇄

클로저는 외부 함수의 변수(범위)에 접근할 수 있는 내부 함수입니다. 또한 내부 함수는 외부 함수가 실행된 후에도 외부 함수의 범위에 계속 액세스할 수 있습니다. 선언된 변수가 내부 중첩 함수에서 자동으로 사용 가능하고 참조되지 않음에도 불구하고 메모리에 상주하면 메모리 누수가 발생합니다. 내부 중첩 함수.

아래 예에서 클로저의 모든 내부 함수는 동일한 컨텍스트를 공유하므로 innFun()은 외부 함수에서 반환되는 "function() {}"과 동일한 컨텍스트를 공유합니다. 이제 3ms마다 outFun에 대한 함수 호출을 수행하고 새 값(각 호출 후)이 전역 변수 newvalue에 할당됩니다. 참조가 이 "function() {}"을 가리키고 있는 한 내부 함수가 호출되지 않더라도 내부 함수(innFun)의 일부이기 때문에 공유 범위가 유지되고 배열이 유지됩니다. 외부 함수(outFun)를 호출할 때마다 이전 함수(){}를 새 함수의 값(변수)에 저장합니다. 따라서 다시 이전에 공유된 범위를 유지해야 합니다. 따라서 외부 함수(outFun)의 n번째 호출에서 외부(n-1)번째 호출의 배열은 가비지 수집될 수 없습니다. 이 프로세스는 메모리가 모두 소진되면 중지됩니다.

var newvalue;
function outFun() {
   var array = new Array(1000000);
   var value = newvalue;
      function innFun() {
        if (value) return array;
   }
   return function () {};
}
setInterval(function () {
   newvalue = outFun();
   }, 3);