웹 애플리케이션의 메모리 누수 문제 해결 가이드
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
JavaScript 프레임워크를 사용하는 웹 개발자, 특히 메모리 누수 문제를 처음 접하는 초보자
핵심 요약
- 메모리 누수는 사용하지 않는 메모리를 계속 보유해 성능 저하 및 애플리케이션 충돌을 유발한다.
let
,const
,var
사용 미비,setTimeout
/setInterval
정리 미비, 이벤트 리스너 정리 미비, 클로저의 비효율적 사용이 주요 원인이다.- Chrome DevTools의 Performance 및 Memory 탭을 활용한 메모리 추적과 Heap Snapshots 분석이 필수적이다.
섹션별 세부 요약
1. 메모리 누수의 정의 및 원인
- 메모리 누수는 애플리케이션이 더 이상 사용하지 않는 메모리를 계속 보유하는 현상이다.
- JavaScript의 가비지 컬렉터는 불필요한 메모리를 자동으로 정리하지만, 불필요한 참조가 존재할 경우 정리 실패로 이어진다.
- 글로벌 변수는 함수 내에서
let
,const
,var
을 생략하면 생성되며, 애플리케이션 전역에 영향을 준다.
2. 주요 메모리 누수 유형
- 스태틱 누수: 고정 크기의 메모리 누수로, 일반적으로 심각하지 않다.
- 디나믹 누수: 사용자 상호작용 시 점진적으로 증가하며, 성능 저하 및 충돌을 유발한다.
3. 메모리 누수 사례 분석
setTimeout
/setInterval
사용 후clearTimeout
/clearInterval
미정리로 인해 메모리 누수가 발생한다.- 이벤트 리스너를 DOM 요소에서 제거하지 않을 경우, 리스너가 메모리에 남아 있다.
- 클로저는 외부 함수가 종료된 후에도 내부 데이터를 참조하게 되어 메모리 누수를 유발할 수 있다.
4. 메모리 누수 탐지 도구 및 방법
- Chrome DevTools의 Performance 탭에서 "JS heap" 그래프를 통해 메모리 사용량 추적 가능.
- Memory 탭의 Heap Snapshots을 통해 특정 시점의 메모리 상태를 비교 분석.
- Allocations on Timeline을 통해 실시간 메모리 할당 추적 및 누수 식별.
5. Angular 애플리케이션의 메모리 누수 예시
- RxJS 구독이 컴포넌트 파괴 시 정리되지 않으면 메모리 누수가 발생.
takeUntil
또는takeUntilDestroyed
연산자를 사용해 구독 정리 가능.
결론
- 메모리 누수 탐지에는 Chrome DevTools의 Heap Snapshots 및 Allocations on Timeline 활용이 필수적이다.
ngOnDestroy
생명주기 훅에서 구독 정리, 이벤트 리스너 및 타이머 정리가 실무 적용에 핵심이다.- Angular에서는
takeUntilDestroyed
연산자를 사용해 메모리 누수를 효과적으로 방지할 수 있다.