Q11. 클로저와 메모리의 관계에 대해서 설명해주세요.
A. 클로저
- 함수가 선언될때(Lexical Scope), 자신이 접근할 수 있는 상위 스코프의 변수들을 [[Environment]] 이라는 내부 슬롯에 저장하여, 힙 메모리에 캡슐(Closure) 형태로 남겨두는 기술.
- 일반적인 함수 내부 변수는 함수가 종료되면 Call Stack에서 Pop 되며 사라지지만,
클로저는 내부함수가 외부로 반환되어 참조가 유지되는 한, Heap 메모리에 별도의 객체로 살아 남아 있습니다.
B. 가비지 컬렉션(GC)의 기준 : "도달 가능성(Reachability)"
- 자바스크립트 엔진(V8 등)은 Mark-and-Sweep 알고리즘을 사용하여 메모리를 관리합니다.
- Root : 전역 객체(window)
- Marking : Root에서 시작해 참조를 타고 들어갈 수 있는(Reachable) 모든 객체에 "살아있음"을 마킹합니다.
- Sweeping : 마킹되지 않은 (도달할 수 없는) 녀석들을 메모리에서 해제 합니다.
- 요즘에는 기술이 좋아져서 V8의 최적화로 아무리 클로져가 실행되어도 상위 스코프의 모든 변수를 더 저장하지는 않고, 참조하는 것만 살려둔다.
[V8 최적화]

오른쪽 클로저 영역에 보면 y는 제거되어서 없고 x만 살아 있는 것을 볼 수 있다. (즉, 참조하는 것만 살려둔다)
=> 클로저는 자신이 접근할 수 있는 상위 스코프의 변수들을 저장한다. 이는 살아있음으로 마킹되어 GC의 대상이 되지 않는다. 하지만, 클로저를 연결하는 부분에 null하는 순간 Root에서 클로저로 가는 유일한 다리가 끊어져 GC에 수거 대상이 된다.
'CS 질문' 카테고리의 다른 글
| [Deep Dive CS - Q14,Q15] Scope 실행결과 (0) | 2025.12.16 |
|---|---|
| [Deep Dive CS- Q12, Q13] Scope (0) | 2025.12.16 |
| [Deep Dive CS- Q10] React.useEffect vs React.useLayoutEffect (feat. EventLoop) (0) | 2025.12.15 |
| [Deep Dive CS- Q7, Q8, Q9] setTimeout, await/async, promise 에서의 에러 처리 (0) | 2025.12.15 |
| [Deep Dive CS- Q5,Q6] Iframe과 Event Loop (0) | 2025.12.15 |