메모리 누수 디버깅 가이드
메모리 누수 디버깅 가이드
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 비용이 큼.
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.