메모리
이 문서를 통해 메모리 관련 이슈를 디버그하는 방법을 배울 수 있습니다.
내 프로세스에 필요한 메모리가 부족할 때
Node.js (JavaScript) 는 가비지 컬렉션을 사용하는 언어이므로, 리테이너를 통해 메모리 누수가 발생할 수 있습니다. Node.js 응용 프로그램은 대부분 멀티-테넌트이고, 비즈니스에 중요하고, 오래 실행되므로 메모리 누수를 찾는 효율적이며 접근이 용이한 방법을 제공하는 것이 필수적입니다.
증상
사용자는 메모리 사용량이 계속해서 늘어나다가 (빠를 수도 느릴 수도 있고, 며칠 혹은 몇 주까지 걸쳐 일어난다) 프로세스가 고장 나고 프로세스 매니저에 의해 재실행되는 것을 발견할 수 있습니다. 프로세스가 이전보다 느리게 실행되고 재실행이 일부 요청의 실패를 불러올 수 있습니다. (load balancer responds with 502)
부작용
- 메모리 고갈로 인해 프로세스가 재시작되며 요청들이 버려짐
- GC 활동의 증가는 CPU 사용량을 높이고 반응 시간을 늦춤
- GC가 이벤트 루프를 막아 느려짐
- 메모리 스와핑 증가로 인해 프로세스가 느려짐 (GC 사용)
- 힙 스냅숏을 가져오기에 메모리 여유가 부족할 수 있음
내 프로세스가 메모리를 비효율적으로 사용할 때
증상
응용 프로그램이 예상하지 못한 양의 메모리를 사용하고/하거나 높은 가비지 컬렉터 사용이 관찰됨
부작용
- 다수의 페이지 폴트
- 더 높은 GC 활동 및 CPU 사용량
디버깅
대부분의 메모리 이슈는 특정 타입의 객체가 얼마나 많은 공간을 차지할지와 어떤 변수가 가비지 컬렉션되는 것을 방해하는지 결정하는 것으로 해결 가능합니다. 또한 프로그램의 시간에 따른 할당 패턴을 알고 있다면 도움이 됩니다.