가비지 컬렉션과 메모리 관리
가비지 컬렉션(Garbage Collection)은 자바스크립트 엔진이 더 이상 사용되지 않는 메모리를 자동으로 찾아내어 해제하는 시스템입니다.
변수나 객체를 만들면 메모리가 할당되는데, 주요 알고리즘인 'Mark-and-Sweep(표시하고 쓸기)' 방식은 루트(전역 객체)부터 시작해 참조(Reference)가 연결된 모든 객체를 '도달 가능(Reachable)'하다고 표시합니다. 도달할 수 없는 외딴 섬이 된 객체들은 메모리에서 자동 삭제됩니다.
하지만 전역 변수를 남발하거나, 클로저/이벤트 리스너를 해제하지 않으면 가비지 컬렉터가 지우지 못해 메모리 누수(Memory Leak)가 발생하여 페이지가 점점 느려집니다.
<script>
console.log("=== 객체 참조와 메모리 ===");
// user 변수는 메모리의 { name: "Alice" } 객체를 참조함 (도달 가능)
let user = { name: "Alice" };
// admin 변수도 같은 객체를 참조함
let admin = user;
console.log("user 참조 해제 전:", admin.name);
// user 변수가 다른 값을 가리키게 됨 (기존 객체와의 연결선 끊어짐)
user = null;
// 하지만 admin 변수가 여전히 기존 객체를 잡고 있으므로,
// { name: "Alice" } 객체는 가비지 컬렉션의 대상이 되지 않음!
console.log("user 참조 해제 후에도 admin은 살아있음:", admin.name);
// admin까지 연결을 끊어야 비로소 메모리에서 완전히 삭제됨 (Unreachable)
admin = null;
console.log("이제 { name: 'Alice' } 객체는 가비지 컬렉터가 수거해갑니다 🧹");
</script>