본문 바로가기
WEB/JavaScript

[JS] 가비지 컬렉션 & 메모리 누수

by DeveloperCat 2023. 11. 6.
반응형

메모리 누수란 무엇인가?

메모리 누수는 어떤 이유에서든 지간에, 운영체제 또는 사용가능한 메모리 풀에서 반환되지 않으면서 동시에 애플리케이션에서  이상 필요로 하지 않는 메모리로 정의   있다.

 

흔한 자바스크립트 메모리 누수 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