자바스크립트 가비지 컬렉션

가비지 수집기는 모든 객체를 모니터링하고 도달할 수 없는 객체를 제거합니다.

메모리 관리는 프로그래밍에서 매우 중요하므로 JavaScript 엔진은 도달할 수 없는 모든 개체를 제거하거나 정리합니다.

이전 기사에서 가비지 수집에 대해 배웠지만 아래에서 조금 더 살펴보겠습니다.


접근성



스크립트에서 실행되는 프로그램은 접근성 또는 도달 가능성을 위해 메모리에 저장됩니다.

아래에서 몇 가지 예를 살펴보겠습니다.

const person = {
  name: 'Bello'
};


위의 예person에서 개체{ name: 'Bello' }를 참조하지만 개체가 변경되거나 덮어쓰이면 어떻게 됩니까?

아래 예를 참조하십시오.

let person = {
  name: 'Bello'
};

person = null;


위의 예에서 Bello에 대한 참조가 없기 때문에 이제 연결할 수 없습니다. 이것은 가비지 수집기가 메모리를 해제하기 위해 데이터를 버리는 곳입니다.

두 개의 참조



객체를 null로 설정하고 이미 다른 변수에 복사된 경우 계속 참조할 수 있습니다.

아래 예를 참조하십시오.

const person = {
  name: 'Bello'
};

let user = person;
user = null;

console.log(person.name); // Bello


위의 예에서 객체person는 여전히 도달할 수 있지만 복사된 객체user를 통해 도달할 수 있습니다.

상호 연결된 개체



아래 예를 참조하십시오.

const marry = (man, woman) => {
  woman.husband = man;
  man.wife = woman;

  return {
    father: man,
    mother: woman
  }
}

const family = marry(
  { name: "Bello" },
  { name: "Monica" }
);

console.log(family);

/*
{
  father: { name: 'Bello', wife: { name: 'Monica', husband: [Circular] } },
  mother: { name: 'Monica', husband: { name: 'Bello', wife: [Circular] } }
}
*/

delete family.father; // true
delete family.mother.husband; // true

console.log(family) // { mother: { name: 'Monica' } }

[Circular]는 개체 간에 상호 연결된(폐쇄 루프) 관계가 있음을 의미합니다.

Circular reference is a series of references where an object references itself directly or indirectly through a series of objects, resulting in a closed-loop, appearing in most computer programming including JavaScript - Akinjide Bankole



위의 모든 객체는 다음 코드가 발생한 후에도 도달 가능합니다.

delete family.father;
delete family.mother.husband;


그러나 가족 개체에서 아버지 개체를 삭제하면 Bello 더 이상 들어오는 참조가 없습니다.

delete family.father;

console.log(family)

/*
{
  mother: { name: 'Monica', husband: { name: 'Bello', wife: [Circular] } }
}
*/

console.log(family.father) // undefined


Bello는 도달할 수 없기 때문에 가비지 수집기에 의해 메모리에서 제거됩니다. 데이터도 액세스할 수 없게 되었습니다.

도달할 수 없는 섬



전역 개체( family )가 null로 초기화되면 상호 연결된 개체에 연결할 수 없게 됩니다.

아래 예를 참조하십시오.

const marry = (man, woman) => {
  woman.husband = man;
  man.wife = woman;

  return {
    father: man,
    mother: woman
  }
}

let family = marry({
  name: "Bello"
}, {
  name: "Monica" 
});

family = null;

console.log(family) // null


전역 객체famillynull로 설정하면 위에서 상호 연결된 객체의 전체 섬이 메모리에서 제거됩니다.


좋은 웹페이지 즐겨찾기