티스토리 뷰

Languages/JS

가비지컬렉션

돈파치 2021. 10. 8. 17:04

타 저수준 언어에서는 메모리 관리를 따로 해야 하지만 자바스크립트와 같은 고수준 언어는 메모리 관리를 자동으로 수행해준다.

가비지 컬렉션

객체, 함수 등은 메모리를 차지하는데 더 이상 쓸모 없는 것들은 메모리에서 삭제 처리하는 것을 의미하며 그 주체를 가비지 컬렉터라고 한다.

가비지 컬렉션의 알고리즘

자바스크립트의 가비지 컬렉션은 **도달가능성(reachability)**이라는 개념으로 메모리 관리 수행

도달 가능성이 있는 값이란 접근 및 사용이 가능한 값을 의미한다.

예를 들어 A라는 메모리가 있는데 A를 통해 B라는 메모리에 접근할 수있다는 것은 B는 A에 참조된다는 것을 의미하며 B는 접근 및 사용이 가능하는 것이다.

이러한 것들은 메모리에서 삭제되지 않는다.

근본적으로 도달가능성이 있는 값

1. 현재 함수의 지역변수와 매개변수

2. 중첩 함수의 체인에 있는 함수에서 사용되는 변수와 매개변수

3. 전역변수

4. 기타 등등

이러한 값을 root라고 한다.

도달가능성이 있는 값

  • root가 참조하는 값이나 체이닝으로 root에서 참조할 수 있는 값

한편, 자바스크립트 엔진내에서 가비지 컬렉터는 항상 동작한다.

가비지 컬렉터는 항상 모든 객체를 모니터링하며 개발자가 이를 임의로 실행 및 중지할 순 없다.

가비지 컬렉션 예1 :

let person = { age : 10 }

전역 변수 person이 객체 {age : 10}을 참조하고 있다.

이때 person이 참조하는 값이 다음과 같이 바뀌었다고 한다.

person = { age : 20 }

그럼 {age : 10}은 이제 도달할 수 없는 값이 되고 메모리에서 삭제된다.

가비지 컬렉션 예2 :

let person = { age : 10 } 
let kids = person 
person = { age : 20 }

person과 kids는 {age : 10}을 참조하고 있고 이후 person의 값이 바뀌었다.

이때 kids는 아직 {age : 10}을 참조하고 있기 때문에 {age : 10}는 메모리에서 삭제되지 않는다.

만약 이후에 kids의 값이 바뀌면 그 때 {age : 10}가 메모리에서 삭제된다.

가비지 컬렉션 알고리즘 소개

다양한 알고리즘 중 mark-and-sweep 알고리즘을 사용하며 다음과 같이 단계별로 수행한다.

 

1. 가비지컬렉터가 root정보를 수집하고 기억한다.

2. root가 참조하는 모든 객체에 접근하고 기억한다.

3. 기억한 모든 객체에 접근할 때 해당 객체들이 참조하는 객체도 기억한다.

(한번 접근한 객체는 무조건 기억하기 때문에 재접근하지 않는다.)

4. root에서 도달가능한 객체를 모두 접근할 때까지 위 1~3과정을 반복한다.

5. 기억하지 않은 모든 객체는 메모리에서 삭제한다.

 

자바스크립트 엔진은 실행에 영향을 미치지 않는 한편 가비지 컬렉션의 성능을 최적화하는 알고리즘이 다양하며 날이 갈수록 기법이 발전하고 있다.

해당 기법을 다 소개하기엔 양이 많고 필자에게 아직 공부가 필요한 부분이며 엔진의 발전에 따라 기법도 많이 달리지기에 가비지 컬렉션 게시물의 내용은 여기서 마치겠다.

반응형

'Languages > JS' 카테고리의 다른 글

this  (0) 2021.11.15
자료형  (0) 2021.10.08
이벤트 루프(event loop)  (0) 2021.05.14
비동기 2편(async, await)  (0) 2021.05.13
비동기 1편(콜백함수, promise)  (0) 2021.05.13
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함
반응형