웹개발/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