자바스크립트에서는 개발자가 메모리를 직접적으로 해제하지 않고도 자동으로 메모리를 관리해 주는 언어이다.
메모리 관리는 크게 다음 두 가지로 나눌 수 있다.
1. 메모리 할당 (Memory Allocation)
메모리 할당은 단순하게 변수를 선언하고 값을 할당할 때 발생된다.
2. 가비지 컬렉션 (Garbage Collection)
가비지 컬렉션은 할당받은 메모리가 더 이상 사용하지 않을 때 메모리에서 해제하여 메모리 누수를 방지하는 과정이다.
자바스크립트에서는 Mark-and-Sweep 알고리즘을 사용하여 가비지 컬렉션을 수행한다.
- 마킹 단계: 모든 객체가 "도달 가능"(reachable)한지 여부를 결정합니다. 도달 가능한 객체는 루트(root) 객체(예: 전역 객체, 스택에 있는 변수들)에서 시작하여 참조를 따라가며 표시됩니다.
- 스위핑 단계: 도달 불가능한 객체가 메모리에서 해제됩니다.
// 객체 생성 및 참조
let obj1 = { key: "value" };
let obj2 = obj1;
// obj1과 obj2가 obj1을 참조하므로 도달 가능
obj1 = null;
// obj2가 여전히 obj1을 참조하므로 도달 가능
obj2 = null;
// 이제 obj1을 참조하는 변수가 없으므로 도달 불가능해져 가비지 컬렉션 대상이 됨
위 예제로 알 수 있는 건 개발자는 직접적으로 메모리를 해제할 수는 없지만
불필요한 변수에 null을 할당하여 간접적으로 메모리를 해제할 수 있다.
메모리 누수
메무리 누수(Memory Leak)는 사용하지 않는 메모리가 해제되지 않고 유지되는 상황을 뜻한다.
메모리 누수는 애플리케이션의 성능저하 또는 메모리가 계속 쌓이면 크래시 현상으로 이어질 수 있다.

메모리 누수가 발생하지 않게 신경 써야 될 것들
1. 전역변수를 과도하게 선언하지 않는다.
2. 타이머, 이벤트 리스너는 생성 이후 사용하지 않을 땐 해제한다.
let timerId = setInterval(() => {
console.log("This runs every second");
}, 1000);
// 타이머 해제
clearInterval(timerId);
let button = document.getElementById("myButton");
function handleClick() {
console.log("Button clicked");
}
button.addEventListener("click", handleClick);
// 이벤트 리스너 해제
button.removeEventListener("click", handleClick); 3. 깊은 복사 (deep copy) 사용 자제
결론
자바스크립트에서 메모리 관리는 자동으로 이루어지지만, 메모리 사용 패턴을 이해하고 최적화하는 것은 중요합니다. 이를 통해 메모리 누수를 방지하고 애플리케이션의 성능을 최적화할 수 있습니다. 효율적인 메모리 관리를 위해 변수를 필요 이상으로 오래 유지하지 않고, 사용한 리소스를 적절히 해제하는 습관을 기르는 것이 중요합니다.
'개발이야기 > JavaScript' 카테고리의 다른 글
| [VanilaJs] 게시판 만들기 (5) - 댓글 조회 및 등록 (0) | 2022.07.07 |
|---|---|
| [VanilaJs] 게시판 만들기 (4) - 글 상세보기와 수정 (0) | 2022.07.03 |
| [VanilaJs] 게시판 만들기 (3) - 글 삭제와 등록 (1) | 2022.07.01 |
| [VanilaJs] 게시판 만들기 (2) - Modal창 마크업 및 동작 (0) | 2022.06.28 |
| [VanilaJs] 게시판 만들기 (1) - 글 목록 조회 및 페이징 처리 (0) | 2022.06.28 |