메모리 누수란 무엇인가?
메모리 누수는 어떤 이유에서든 지간에, 운영체제 또는 사용가능한 메모리 풀에서 반환되지 않으면서 동시에 애플리케이션에서 더 이상 필요로 하지 않는 메모리로 정의 될 수 있다.
흔한 자바스크립트 메모리 누수 3가지
1. 의도치 않은 전역 변수
2. 잊혀진 타이머 또는 콜백
3. DOM 외부에서의 참조
메모리 관리는 왜 필요한가?
대부분의 언어에서 메모리 라이프 사이클은 메모리 할당 → 메모리 사용 → 메모리 해제의 단계를 거친다. C같은 low-level 언어의 경우 이 라이프 사이클을 개발자가 malloc()이나 free()를 사용하여 직접 관리를 해주어야 하지만 자바스크립트와 같은 high-level 언어는 대부분 Garbage Collection이라는 자동 메모리 관리를 사용하기 때문에 개발자가 별도의 신경을 쓰지 않는다.
Garbage Collection
쓸모 없어진 객체가 차지하는 메모리를 자동으로 해제하는 것
가비지컬렉션의 주요 알고리즘
1. Reference-counting
이 알고리즘은 어떠한 값에 대해서 어디에서도 참조(reference)하지 않고 있다면 GC는 이 값을 필요하지 않은 값으로 간주하고 이 값을 제거한다.
=> 하지만 reference-counting 방식은 순환참조(Circular reference)가 이루어지는 경우 메무리 누수의 요인이 된다는 문제점이 있다.
2. Mark-and-sweep
위의 reference-counting의 문제점으로는 불필요한 값임에도 불구하고 어디에선가 참조가 걸려있다면 이에 대한 메모리를 해제하지 않는다는 문제점이 있었다. 반면에 Mark-and-sweep 알고리즘은 이 값이 참조되고 있는 값인지에 중점을 두지않고 도달가능성(reachablility)에 중점을 둔다.
도달 가능성이란 자바스크립트의 root라는 글로벌 object에서부터 시작하여 참조되는가에 대한 여부이다. 다시말해 root에서 부터 해당 값까지 도달이 가능한가에 대한 여부이다.
따라서 어떤 값에 대한 참조가 없는 경우는 당연히 도달이 불가능하기 때문에 메모리가 해제되어야 하는 값으로 여겨지고, 참조 되고 있다고 하더라도 root로부터 도달할수 없다고 여겨진다면 처리된다.
가비지 컬렉션의 단점
1. 언제 가비지 컬렉션이 진행될지 예측하기 어렵다.
=> 객체가 쓸모 없어지는 시점에 정확히 메모리가 해제되지 않기 때문에 최적의 메모리 관리가 되지 않는다.
2. 가비지 컬렉터가 동작하는 시간이 든다.
=> 어떤 객체가 쓸모 없는지 판단하는 시간이 소요된다.
'WEB > JavaScript' 카테고리의 다른 글
[JS] 깊은 복사 & 얕은 복사 (0) | 2023.11.06 |
---|---|
[js] 가변성과 불변성 (0) | 2023.11.06 |
[js] bigint (0) | 2023.11.06 |
[js] symbol (0) | 2023.11.06 |
[JS] history (0) | 2023.10.29 |