javascript 의 메모리 관리 상세 설명
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 와 이벤트 처리 함수 가 쓰레기 회수 기 에 접근 할 수 없 는 것 으로 표시 되면 그들 은 방출 된다.제한:대상 은 이러한 표 시 를 방문 할 수 없다 고 명확 하 게 표시 하 는 방법 에 한계 가 있 지만 우 리 는 프로 그래 밍 에서 그 와 접촉 하지 않 았 기 때문에 쓰레기 회수 와 관련 된 내용 에 관심 이 별로 없다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Thymeleaf 의 일반 양식 제출 과 AJAX 제출텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.