본문 바로가기
CS 질문

[Deep Dive CS - Q11] - Closure, Memory

by 민챙이_99 2025. 12. 16.

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에 수거 대상이 된다.