가비지 컬렉션(Garbage Collection, GC)은 프로그래밍 언어에서 메모리 관리를 자동으로 처리하는 메커니즘입니다. 주로 메모리에서 더 이상 사용되지 않는 객체를 자동으로 탐지하고 제거하여 메모리를 확보합니다. 이를 통해 메모리 누수를 방지하고 애플리케이션의 성능을 개선할 수 있습니다
가비지 컬렉션의 동작 원리
- 객체의 생성 : 프로그래머가 객체를 생성하면, 이 객체는 메모리의 힙 영역에 할당됩니다.
- 참조 카운팅 : 각 객체는 자신을 참조하는 변수나 객체의 수를 추적합니다. 이 값을 참조 카운트라고 합니다.
- 가비지 컬렉션 : 객체의 참조 카운트가 0이 되면, 즉 더 이상 어떤곳에서도 이객체를 참조하지 않으면, 가비지 컬렉션이 이객체를 메모리에서 제거합니다.
예시)
function createObject() {
let obj = { name: "Seulbin" };
return obj;
}
let myObj = createObject();
console.log(myObj.name);
myObj = null;
이 예시에서
- createObject 함수에서 객체를 생성하고, myObj가 그객체를 참조합니다.
- myObj를 null로 설정하면, 더 이상 객체를 참조하는 변수가 없으므로, 이 객체는 가비지 컬렉션의 대상이 됩니다.
- GC가 실행될 때, 이 객체는 메모리에서 제거되고 메모리가 회수됩니다.
가비지 컬렉션의 종류
- 참조 카운팅(Reference Counting): 객체가 참조될 때마다 카운트를 증가시키고, 참조가 해제될 때 감소시킵니다. 카운트가 0이 되면 해당 객체를 제거합니다. 하지만 순환 참조 문제를 해결할 수 없습니다.
- 마크 앤 스위프(Mark and Sweep): 모든 객체를 탐색하여 참조가 남아 있는지 확인하고, 참조가 없는 객체를 제거합니다. 주기적으로 실행되어 메모리를 정리합니다.
- Generational Garbage Collection: 객체의 생애 주기를 기반으로 객체를 세대별로 나누어 관리합니다. 새로 생성된 객체는 "젊은 세대"에, 오래된 객체는 "오래된 세대"에 저장됩니다. 일반적으로 젊은 세대의 객체는 더 빠르게 가비지 컬렉션됩니다.
결론
가비지 컬렉션은 프로그래머가 직접 메모리를 관리하지 않아도 되는 장점을 제공하지만, 때로는 성능 저하를 초래할 수 있습니다. 메모리 사용을 최적화하려면, GC의 동작 원리를 이해하고 필요에 따라 메모리 관리를 최적화하는 것이 중요합니다.