on
Javascript의 가비지 수집 제거
Javascript의 가비지 수집 제거
반응형
가비지 컬렉션은 Java나 C++와 같은 일부 고급 언어에서 매우 기본적인 기능이지만 자바스크립트의 가비지 수집과 메모리 관리에 있어서는 객체가 매번 파괴될 때 정의된 흐름이나 객체를 파괴할 명시적인 방법이 없기 때문에 혼란이 시작된다. 나는 이 이해하기 힘든 과정을 좀 더 조명하도록 노력할 것이다.
m
에모리 관리
메모리 관리에는 3개의 매우 간단한 단계가 있습니다.
필요한 메모리 할당
할당된 메모리 사용(읽기, 쓰기)
할당된 메모리가 더 이상 필요하지 않을 때 해제
자바스크립트에서는 매우 간단합니다.
var num= 123; // allocates memory for a number var str = 'sumeet'; // allocates memory for a string var obj = { fName: "Sumeet", lName: "Bhalla" }; // allocates memory for an object and contained values var arr = [123, null, 'sumeet',"bhalla]; // allocates memory for the array and contained values function myFunc(val1,val2) { return val1+ val2; } // allocates a function (which is a callable object)
javascript에서 메모리 해제 시기를 결정하는 알고리즘을 마크 앤 스위프 알고리즘이라고 합니다.
이 알고리즘은 루트라고 하는 객체 집합에 대한 지식을 가정한다. 자바스크립트에서 루트는 글로벌 개체입니다. 가비지 수집기는 정기적으로 이러한 루트로부터 시작하여 이러한 루트로부터 참조되는 모든 개체를 찾은 다음 이러한 루트로부터 참조되는 모든 개체를 찾습니다. 따라서 루트에서 시작하여 가비지 수집기는 도달할 수 있는 모든 개체를 찾고 도달할 수 없는 모든 개체를 수집합니다.
다음과 같은 "쓰레기 채취" 단계가 정기적으로 수행된다.
쓰레기 수집가는 뿌리를 내리고 그것들을 "표시"한다.
그런 다음 모든 참조를 방문하고 "표시"합니다.
그런 다음 표시된 개체를 찾아 참조 표시를 합니다. 방문한 모든 개체는 기억되므로 나중에 동일한 개체를 두 번 방문하지 않습니다.
…모든 도달 가능한 (루트에서) 참조가 방문될 때까지 계속됩니다.
표시된 개체를 제외한 모든 개체가 제거됩니다.
여기서 화살표는 개체 참조를 나타냅니다. 글로벌 변수 "user"가 {name: "John"} 개체를 참조합니다. 존의 "이름" 속성은 원시적인 것을 저장하기 때문에 물체 안에 칠해진다.[출처]
다음은 간단한 예입니다.
사용자 값을 덮어쓰면 참조가 손실됩니다.
이제 존은 연락이 닿지 않는다. 접속할 방법도 없고, 참조할 수도 없습니다. 가비지 수집기는 데이터를 폐기하고 메모리를 비웁니다.[출처]
그 사용자 개체에 대한 여러 참조가 있다면
// user has a reference to the object let user = { name: "John" }; let admin = user;
자, 이제 우리가 정하면
user = null
개체를 관리자를 통해 여전히 연결할 수 있으므로 관리자가 개체를 null로 설정한 경우에만 가비지 수집기에 의해 스윕되도록 표시됩니다.
다음과 같은 상호 연결된 참조 예도 있습니다.
function marry(man, woman) { woman.husband = man; man.wife = woman; return { father: man, mother: woman } } let family = marry( { name: "John" }, { name: "Ann" } );
현재 모든 개체에 연결할 수 있으므로 루트에서 도달할 수 있는 개체로 표시되었습니다.
이제 일부 개체 참조를 제거한다고 가정해 보겠습니다.
delete family.father; delete family.mother.husband;
나가는 참조는 중요하지 않습니다. 들어오는 개체만 개체에 연결할 수 있습니다. 따라서 John은 현재 연결할 수 없으며 액세스할 수 없게 된 모든 데이터와 함께 메모리에서 제거됩니다.
비슷하게, 만약 당신이
family = null;
이것은 닿을 수 없는 섬이라고 불립니다.
As of 2012, all modern browsers ship a mark-and-sweep garbage-collector. As of 2019, it is not possible to explicitly or programmatically trigger garbage collection in JavaScript.
알아야 할 주요 사항:
가비지 수집이 자동으로 수행됩니다. 우리는 그것을 강요하거나 막을 수 없다.
개체는 연결할 수 있는 동안 메모리에 유지됩니다.
참조되는 것은 루트에서 연결할 수 있는 것과 같지 않습니다. 상호 연결된 개체 팩은 전체적으로 연결할 수 없습니다.[출처]
https://javascript.info/garbage-collection#interlinked-objects
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management
from http://it-ground.tistory.com/338 by ccl(A) rewrite - 2021-10-19 07:01:59