Post

메모리 누수 디버깅 가이드

메모리 누수 디버깅 가이드

FEConf Korea SSR 환경(Node.js) 메모리 누수 디버깅 가이드


메모리 누수란

  • 필요 하지 않은데 메모리가 지속적으로 사용되고 있는 현상

메모리 누수가 문제인 이유

  • 메모리가 누수되면 다른 어플리케이션을 동작시킬 메모리가 부족하게 됨.
  • 누수로 인해 작아진 메모리 용량때문에 GC(Garbage Collection)이 더 자주 동작하게 됨. 이로 인해 CPU의 사용량이 늘어나게 되고 이벤트 루프가 블로킹되서 연산이 느려짐.

이벤트 루프를 해결하는 방법

  • 힙메모리(Heap memory)의 크기를 늘려주거나 메모리 누수의 범인을 찾아낸다.

힙메모리(Heap memory)

V8의 GC는 힙(Heap) 메모리를 Young Generation과 Old Generation으로 나눠서 관리함.


  • Young Generation (젊은 세대)
    • 새로운 객체가 생성되는 공간.
    • nursery(초기 객체) → intermediate(살아남은 객체) 순으로 이동.
    • 대부분의 객체는 여기서 빠르게 할당되고 해제됨.
  • Old Generation (오래된 세대)
    • Young Generation에서 살아남은 객체가 이동하는 공간.
    • 오래 유지되는 객체(장기 객체)는 여기 저장됨.
    • 더 큰 메모리를 차지하고, GC 비용이 큼.

Image


GC(가비지 컬렉션) 유형

  • Minor GC (Young Generation에서 실행)
    • Young Generation에서 사용되지 않는 객체를 빠르게 정리.
    • nursery → intermediate → Old Generation 순으로 객체를 이동시킴.
    • 속도가 빠르고, 애플리케이션에 미치는 영향이 적음.
  • Major GC (Old Generation에서 실행)
    • Old Generation에서 더 이상 사용되지 않는 객체를 제거.
    • 비용이 크고 실행 속도가 느림, 이벤트 루프를 블로킹할 가능성이 있음.
This post is licensed under CC BY 4.0 by the author.