웹개발/javascript

[자바스크립트] 자바스크립트 객체 타입 메모리 관리

joamashi 2024. 7. 29. 00:02

자바스크립트 객체는 메모리에서 **힙(heap)**이라는 영역에 저장됩니다. 힙은 객체와 그 속성, 메서드를 위한 메모리 공간을 제공합니다. 객체는 메모리에 직접 저장되는 것이 아니라 참조를 통해 관리됩니다.

1. 객체 생성 및 메모리 할당

  • 객체는 new 키워드를 사용하여 생성됩니다.
  • 객체 생성 시 힙에 객체 데이터를 위한 메모리 공간이 할당됩니다.
  • 객체의 속성과 메서드는 객체 데이터의 일부로 저장됩니다.
  • 예: let person = new Object(); 라고 하면 힙에 person 객체가 생성되고, 객체 데이터를 위한 메모리 공간이 할당됩니다.

2. 객체 참조

  • 객체 참조는 객체 데이터를 가리키는 메모리 주소입니다.
  • 변수에 객체를 할당하면 변수는 해당 객체의 참조를 저장합니다.
  • 여러 변수가 동일한 객체를 참조할 수 있습니다.

3. 메모리 해제

  • 객체가 더 이상 사용되지 않으면 힙에서 메모리 공간이 해제됩니다.
  • 객체에 대한 모든 참조가 사라지면 객체는 더 이상 사용되지 않는 것으로 간주됩니다.
  • 자바스크립트 엔진은 자동으로 가비지 컬렉션(GC) 프로세스를 통해 사용되지 않는 객체를 찾아 메모리 공간을 해제합니다.

4. 객체 참조 카운팅

  • 자바스크립트 엔진은 각 객체에 대한 참조 개수를 추적합니다.
  • 객체에 대한 참조 개수가 0이 되면 객체는 더 이상 사용되지 않는 것으로 간주되고 메모리 공간이 해제됩니다.

5. 순환 참조

  • 두 개 이상의 객체가 서로를 참조하는 경우 순환 참조가 발생합니다.
  • 순환 참조가 발생하면 GC가 객체를 사용되지 않는 것으로 인식하지 못하고 메모리 누수가 발생할 수 있습니다.

6. 메모리 누수 방지

  • 순환 참조를 방지하려면 객체 간의 참조를 조심스럽게 관리해야 합니다.
  • 필요 없는 객체에 대한 참조를 해제해야 합니다.
  • 약한 참조 또는 닫힌 참조를 사용하여 순환 참조를 방지하는 방법도 있습니다.

7. 추가 정보

  • 객체는 불변성을 가질 수 없습니다. 즉, 객체의 속성 값을 변경할 수 있습니다.
  • 객체는 자바스크립트의 가장 강력한 데이터 구조입니다. 다양한 데이터를 저장하고 함수를 포함할 수 있습니다.
  • 메모리 관리에 대한 더 자세한 내용은 자바스크립트 엔진의 문서를 참조하는 것이 좋습니다.

8. 자바스크립트 메모리 관리 관련 예제

1. 원시 타입 메모리 할당 및 해제

// 숫자형 변수 선언 및 할당
let num1 = 10;
console.log(num1); // 10 출력

// 문자열형 변수 선언 및 할당
let str1 = "Hello";
console.log(str1); // "Hello" 출력

// 불리언형 변수 선언 및 할당
let bool1 = true;
console.log(bool1); // true 출력

// 변수에 값 재할당
num1 = 20;
console.log(num1); // 20 출력

// 변수 메모리 해제 (명시적으로 할당 해제 불가능)
num1 = undefined; // 변수 값을 undefined로 변경

// 객체 메모리 할당
let person = { name: "John", age: 30 };
console.log(person); 
// { name: "John", age: 30 } 출력

2. 객체 메모리 할당 및 해제

// 객체 생성 및 메모리 할당
let person = new Object();
person.name = "John";
person.age = 30;
console.log(person); 
// { name: "John", age: 30 } 출력

// 객체 참조
let student = person;
console.log(student); 
// { name: "John", age: 30 } 출력

// 객체 메모리 해제 (명시적으로 할당 해제 불가능, GC에 의해 자동으로 해제)
person = null;
student = null; 

// 객체에 대한 모든 참조가 사라짐

3. 순환 참조 예제 및 해결

// 순환 참조 발생
let person = {
  name: "John",
  age: 30,
  pet: {
    name: "뽀로",
    owner: person // 순환 참조 발생
  }
};

let pet = person.pet;
console.log(pet); // { name: "뽀로", owner: {...} } 출력

// 메모리 누수 발생 가능성이 높음

// 약한 참조를 사용하여 순환 참조 해결
let person = {
  name: "John",
  age: 30,
  pet: {
    name: "뽀로",
    owner: new WeakRef(person) // 약한 참조 사용
  }
};

let pet = person.pet;
console.log(pet); // { name: "뽀로", owner: WeakRef { } } 출력

// GC에 의해 person 객체가 해제되더라도 pet 객체는 유지

 

728x90