피드로 돌아가기
Dev.toFrontend
원문 읽기
Directed Graph 기반 정밀 업데이트 및 메모리 누수 방지를 위한 Explicit Disposal 설계
Signal Internals: Managing Memory and the Dependency Graph
AI 요약
Context
단순 Scheduler 기반의 reactive system은 전체 상태를 반복 계산하는 오버헤드와 광범위한 Broadcast 메커니즘으로 인한 성능 저하 발생. 컴포넌트의 Mount/Unmount가 빈번한 실제 애플리케이션 환경에서 노드 간 참조 관계에 따른 Memory Leak과 Stale Edge 관리의 한계 노출.
Technical Solution
- Signal(Source), Computed(Derived), Effect(Side-effect)를 노드로, 의존 관계를 Edge로 정의한 Directed Graph 구조 도입을 통한 전파 범위 최적화
- Dirty Marking 기법을 적용하여 모든 노드를 Eagerly 재계산하지 않고 실제 필요 시점에만 계산하는 Lazy Recomputation 구현
- 컴포넌트 파괴 시 모든 Upstream Dependency를 Unlink 하는 Explicit Disposal 메커니즘을 통해 Dangling Node 제거 및 메모리 누수 차단
- 추적 단계(Tracking Phase)에서 신규 의존성을 수집하고 기존 Edge와 비교하여 불필요한 참조를 삭제하는 Dynamic Edge Rebuilding 수행
- Runtime이 사용자 객체의 소유권을 갖지 않도록 WeakMap을 활용한 메타데이터 관리 및 Lifecycle 경계 명확화를 통한 Retain Cycle 방지
- 계산, UI 업데이트, I/O 작업을 분리한 Layered Scheduler 설계를 통해 작업 우선순위에 따른 정밀한 실행 제어 구현
실천 포인트
- 컴포넌트 Unmount 시점에 의존성 그래프의 Edge를 명시적으로 제거하는 Cleanup 로직이 포함되었는가? - 조건부 렌더링이나 동적 의존성 변경 시 Stale Edge가 남아 불필요한 Recomputation이 발생하지 않는가? - 런타임 메타데이터 저장 시 객체의 생명주기를 강제로 연장하는 Strong Reference 대신 WeakMap을 사용했는가? - 작업의 시급성에 따라 Computation과 I/O 레이어를 분리하여 스케줄링하고 있는가?