
가비지 컬렉션과 메모리 누수에 대해서 명확하게 이해하고 싶어서 작성하는 글
자바스크립트에서 변수, 함수, 객체 등을 생성할 때, 자바스크립트 엔진은 이 데이터를 저장할 메모리를 자동으로 할당함.
이후, 더 이상 사용되지 않는 데이터는 가비지 컬렉션(Garbage Collection)을 통해 메모리에서 해제됩니다.
가비지 컬렉션은 자바스크립트 엔진이 사용하지 않는 데이터를 자동으로 메모리에서 해제하는 방식임.
프로그램에서 더 이상 필요하지 않은 데이터는 가비지 컬렉션을 통해 메모리에서 제거되어 메모리 누수를 방지함.
가비지 컬렉션은 도달 가능성(Reachability)이라는 개념을 바탕으로 작동함.
도달 가능한 데이터는 계속 메모리에서 유지되고, 도달 불가능한 데이터는 메모리에서 해제됨.
window, global)도달 불가능 데이터
도달 가능 데이터 탐색:
도달 불가능 데이터 탐지:
let obj = { key: "value" }; // 객체 생성
obj = null; // 참조 제거, 객체는 가비지 컬렉션 대상
메모리 누수는 더 이상 사용되지 않는 메모리가 해제되지 않고 계속 메모리에서 남아 있는 상태.
이로 인해 불필요한 메모리가 계속 차지하고, 성능 저하를 유발할 수 있음.
메모리 누수는 주로 참조가 끊어지지 않은 채로 객체가 메모리에서 해제되지 않는 경우 발생.
전역 변수에 불필요한 객체나 값이 계속 저장되면 해당 객체는 해제되지 않고 계속 메모리에 남음.
let globalObject = { name: "John" }; // 전역 변수로 객체 저장
이벤트 리스너는 특정 DOM 요소에 이벤트가 발생할 때 실행될 콜백 함수를 추가하는 역할을 함
// 1. 이벤트 리스너 제거
const button = document.querySelector('button');
button.addEventListener('click', () => {
console.log("Button clicked");
});
button.removeEventListener('click', handleClick);
// 2. once 옵션 사용 (한번만 실행되고 제거)
button.addEventListener('click', () => {
console.log("Button clicked");
}, { once: true });
메모리 누수는 힙(Heap)에 저장된 객체에 대한 참조가 스택(Stack)에서 계속 유지되면서 객체가 해제되지 않고 남아있는 경우.
참조 유지
객체가 힙에 저장되면, 그 객체를 참조하는 변수가 스택에 저장됨.
참조가 끊어지지 않음
객체가 더 이상 필요 없거나 사용되지 않아도, 스택에 있는 참조 변수는 여전히 객체를 가리킬 수 있음.
객체가 해제되지 않음
객체는 여전히 스택에서 참조되고 있기 때문에 가비지 컬렉션이 객체를 해제하지 못함. 실제로는 더 이상 사용되지 않지만, 참조 변수로 인해 메모리에서 해제되지 않는 상태가 됨.