본문 바로가기
Backend2026년 6월 11일2분 읽기

Node.js 메모리 누수 찾기 — 힙 스냅샷 실전

YS
김영삼
조회 155
Node.js 메모리 누수 찾기 — 힙 스냅샷 실전

핵심 요약

요청을 처리할수록 RSS가 계단식으로 오르고 안 떨어지면 누수다. 흔한 범인은 ① 무한히 자라는 전역 캐시/배열, ② 해제 안 한 이벤트 리스너·타이머, ③ 큰 객체를 붙잡는 클로저. --inspect로 힙 스냅샷을 두 번 떠 비교하면 늘어나는 객체가 보인다.

1. 추적 방법

node --inspect server.js
# Chrome chrome://inspect → Memory
# 1) 부하 전 스냅샷  2) 부하 후 스냅샷
# Comparison 뷰에서 #Delta 큰 항목 확인

2. 단골 원인

  • 모듈 스코프 const cache = []에 계속 push, 비우지 않음
  • emitter.on()만 하고 off() 안 함 → 리스너 누적(MaxListeners 경고)
  • setInterval clear 누락

3. 함정

  • GC 직후 잠깐 떨어지는 건 정상 — 추세(우상향)를 봐라
  • 캐시는 크기 상한(LRU)을 둬라 — 무한 캐시는 누수와 같다
  • 전역 변수에 요청 데이터 붙이기 금지(동시성+누수)

자주 묻는 질문

메모리가 오르다가 가끔 떨어지는데 누수인가요?

GC로 잠깐 내려가는 건 정상입니다. 장시간 추세가 계속 우상향이고 기준선 자체가 올라가면 누수입니다.

어디서 새는지 어떻게 좁히나요?

부하 전후 힙 스냅샷을 비교해 인스턴스 수가 비정상적으로 늘어난 생성자(Array, 특정 클래스, Closure)를 찾고, 그 객체를 붙잡는 retainer 경로를 따라가세요.

댓글 0

아직 댓글이 없습니다.
Ctrl+Enter로 등록