mason
mason-log.

mason

mason.

안녕하세요. mason 입니다.

javascript

Memory Leak.

프론트엔드에서 흔한 메모리 누수 패턴과 탐지, 예방 방법

Memory Leak은 더 이상 필요 없는 데이터가 참조 때문에 GC되지 않고 쌓이는 현상입니다.

🕳️ 흔한 원인 (프론트엔드)

분리된 DOM이 리스너로 유지되는 누수

패턴예시
분리된 DOMremove된 노드를 JS 변수가 계속 참조
이벤트 리스너 미제거addEventListener 후 cleanup 없음
타이머/인터벌clearInterval 누락
전역 변수 축적window.cache = ... 무한 성장
클로저큰 객체를 불필요하게 붙잡음
Observer 미해제IntersectionObserver, MutationObserver
SPA 라우트 전환이전 페이지 subscription, chart instance 잔존

🔎 탐지 방법

  • Chrome DevTools → Memory → Heap snapshot 비교 (두 시점 diff)
  • Performance → Memory 체크 후 계단형 상승 패턴 확인
  • React: Strict Mode double mount로 cleanup 누락 노출

🛡️ 예방

  • React useEffect cleanup 함수 반환
  • WeakMap/WeakRef로 캐시 (적절할 때)
  • 라우트 unmount 시 chart, socket, observer 해제
  • 전역 캐시에 크기 상한, TTL
useEffect(() => {
  const observer = new IntersectionObserver(callback);
  observer.observe(el);
  return () => observer.disconnect();
}, []);

🔗 참고 자료