javascript 의 메모리 관리 상세 설명

C 와 같은 낮은 차원 의 언어 를 소개 합 니 다.예 를 들 어 malloc()와 free()는 개발 자가 직접 메모 리 를 사용 해 야 합 니 다.그러나 자 바스 크 립 트 와 같은 고급 언어의 경우 대상(objects,strings 등)이 생 성 될 때 메모 리 를 분배 하고,사용 하지 않 을 때 메모 리 는 자동 으로 회수 되 며,이 자동 회수 과정 을 쓰레기 회수 라 고 부른다.쓰레기 회수 의 존재 로 인해 자 바스 크 립 트 등 고급 언어 개발 자 들 은 메모리 관리 에 관심 을 갖 지 않 아 도 된다 는 잘못된 인식 을 가지 게 되 었 다.메모리 라 이 프 사이클 은 어떤 프로 그래 밍 언어 든 메모리 의 라 이 프 사이클 은 기본적으로 일치 합 니 다.1.필요 한 메모 리 를 분배 합 니 다.2.그 를 사용 하여 읽 기와 쓰기 작업 을 합 니 다.3.메모리 가 필요 하지 않 을 때 자원 방출 절차 1 과 절차 2 는 모든 언어 에 똑 같 습 니 다.뚜렷하게 감지 할 수 있 습 니 다.단계 3 에 대해 저급 언어 는 개발 자의 현식 집행 이 필요 하 다.자 바스 크 립 트 와 같은 고급 언어 에 대해 서 는 해석 기 에 맡 겨 져 있 기 때문에 눈치 채 지 못 할 것 입 니 다.javascript 의 할당 작업 값 의 초기 화 는 변수 할당 일 때 자바 script 은 메모리 할당 작업 을 완료 합 니 다.

var n = 123; //
var s = "azerty"; //
var o = {
a: 1,
b: null
}; // object
var a = [1, null, "abra"]; //
function f(a){
return a + 2;
} // ( )
// ,
someElement.addEventListener('click', function(){
someElement.style.backgroundColor = 'blue';
}, false);
함수 호출 을 통 해 일부 함 수 를 분배 한 후에 도 대상 이 분배 하 는 상황 이 발생 한다.

var d = new Date();
var e = document.createElement('div'); // DOM
일부 방법 은 새로운 값 이나 대상 을 분배 할 수 있다.

var s = "azerty";
var s2 = s.substr(0, 3); // s2
// ,javascript [0, 3]
var a = ["ouais ouais", "nan nan"];
var a2 = ["generation", "nan nan"];
var a3 = a.concat(a2); // a a2 ,
값 에 대한 사용 은 값 에 대한 사용 이 며,사실은 분 배 된 메모리 에 대해 읽 기와 쓰기 동작 을 수행 하 는 것 이다.이러한 조작 은 변수 나 대상 의 속성 에 대해 읽 기와 쓰기 작업 을 하거나 함수 에 파 라 메 터 를 전달 하 는 것 을 포함한다.더 이상 필요 하지 않 을 때,메모리 의 절대 다수의 메모리 관 리 를 방출 하 는 문 제 는 모두 이 단계 에서 발생 한다.가장 어 려 운 일 은 분 배 된 메모리 가 더 이상 필요 하지 않다 는 것 을 어떻게 판단 하 느 냐 하 는 것 이다.프로그램 이 언제 더 이상 메모리 가 필요 하지 않 고 그 가 차지 하 는 자원 을 방출 할 지 개발 자가 판단 해 야 한다.고급 언어의 해석 기 에는'쓰레기 수집 기'라 는 프로그램 이 삽입 되 어 있 습 니 다.그의 작업 은 메모리 의 배분 과 사용 을 추적 하여 메모리 가 필요 한 지 여 부 를 판단 하고 더 이상 필요 하지 않 을 때 자원 방출 작업 을 수행 하 는 것 입 니 다.그 는 메모리 가 필요 한 지 여 부 를 판단 하 는 불확실 한 문제 이기 때문에 유사 치 를 얻 을 수 밖 에 없 었 다.쓰레기 수 거 는 앞에서 말 한 바 와 같이 우 리 는 자동 으로'메모리 가 더 이상 필요 하지 않다'고 판단 할 수 없다.따라서 쓰레기 수 거 는 이 문제 의 해결 방안 에 한계 가 있다.이 절 은 필요 한 개념 을 설명 하고 주요 쓰레기 수집 알고리즘 과 그들의 한계점 을 이해 할 것 이다.쓰레기 회수 의 주요 개념 중 하 나 는 인용 이다.메모리 관리 에서 한 대상 이 명시 적 이 든 암시 적 이 든 다른 대상 을 사 용 했 을 때 우 리 는 그 가 다른 대상 을 인용 했다 고 말 했다.예 를 들 어 javascript 대상 에 암시 적 인 지향 원형 인용 이 존재 하고 명시 적 으로 그의 속성 값 을 가리 키 는 인용 도 있 습 니 다.여기 서 대상 의 개념 은 자 바스 크 립 트 의 전통 적 인 의미 에서 대상 의 개념 을 초 과 했 고 함수 작용 역 과 전역 작용 역 도 포함 했다.인용 계수 알고리즘 을 사용 한 쓰레기 수 거 는 가장 이상 적 인 알고리즘 으로'대상 이 더 이상 필요 하지 않다'와'다른 대상 이 이 대상 을 인용 하지 않 는 다'는 개념 을 도입 했다.이 대상 의 인용 지침 이 0 으로 바 뀌 었 을 때 그 는 회수 할 수 있다 고 생각한다.예:

var o = {
a: {
b:2
}
}; // . (a) (o ) , a
// o
// ,
var o2 = o; // o2
o = 1; // o , o2
var oa = o2.a; // oa o2 a
// , o2 a oa
o2 = "yo"; // , a oa ,
oa = null; // a ,
제한:이 알고리즘 을 순환 하 는 데 한계 가 있 습 니 다.한 대상 이 다른 대상 을 인용 할 때 순환 인용 이 형성 되면 그들 은 더 이상 필요 하지 않 고 쓰레기 수집 기 도 그들 을 회수 하지 않 습 니 다.

function f(){
var o = {};
var o2 = {};
o.a = o2; // o o2
o2.a = o; // o2 o
return "azerty";
}
f();
// ,
// , , ,
// , ,
현실 적 인 예 ie6,7 에서 dom 대상 에서 인용 계수 의 알고리즘 을 사용 하면 메모리 유출 문제 가 존재 합 니 다.

var div = document.createElement("div");
div.onclick = function(){
doSomething();
}; // div click
// div , , ,
태그-제거 알고리즘 은'대상 이 더 이상 필요 하지 않 습 니 다'와'대상 이 접근 할 수 없습니다(대상 이 도달 할 수 없습니다)'라 는 개념 을 도입 했다.이 알고리즘 은 일련의 루트 대상(javascript 의 루트 대상 이 전체 대상)이 있다 고 가정 합 니 다.일정 시간 마다 쓰레기 수집 기 는 루트 대상 부터 시작 하여 그 가 인용 한 대상 을 옮 겨 다 니 고 인용 대상 이 인용 한 대상 을 옮 겨 다 니 며 유추 합 니 다.이런 방식 을 사용 하면 쓰레기 수집 기 는 접근 할 수 있 는 모든 대상 을 얻 고 접근 할 수 없 는 대상 을 회수 할 수 있다.이 알고리즘 은 이전 알고리즘 보다 좋 습 니 다.0 참조 대상 은 접근 할 수 없 는 대상 으로 설정 되 는 동시에 순환 참조 로 인 한 고민 도 피 할 수 있 습 니 다.2012 년 까지 대부분의 현대 브 라 우 저 는 이러한'태그-제거 알고리즘'의 쓰레기 회수 기 를 사용 했다.자 바스 크 립 트 쓰레기 수집 분야(대/증 량/병발/병행 쓰레기 수집)는 지난 몇 년 간 이와 관련 된 알고리즘 을 개 선 했 지만 쓰레기 수집 알고리즘 자체(표기-제거 알고리즘)와'한 대상 이 더 이상 필요 하지 않다 고 판단 하 는 방법'은 개선 되 지 않 았 다.주 기 는 더 이상 문제 가 아 닙 니 다.첫 번 째 예 에서 함수 호출 이 끝 난 후에 이 두 대상 은 전체 대상 에 의 해 인용 되 지 않 고 전체 대상 에 의 해 인용 되 지 않 습 니 다.따라서 자 바스 크 립 트 쓰레기 회수 기 에 접근 할 수 없 는 대상 으로 표 시 됩 니 다.이런 일 도 두 번 째 예 에서 발생 한다.div 와 이벤트 처리 함수 가 쓰레기 회수 기 에 접근 할 수 없 는 것 으로 표시 되면 그들 은 방출 된다.제한:대상 은 이러한 표 시 를 방문 할 수 없다 고 명확 하 게 표시 하 는 방법 에 한계 가 있 지만 우 리 는 프로 그래 밍 에서 그 와 접촉 하지 않 았 기 때문에 쓰레기 회수 와 관련 된 내용 에 관심 이 별로 없다.

좋은 웹페이지 즐겨찾기