기술 면접에서 이런 거 많이 물어본다고 해서
정확히 뭔지 궁금해서 찾아보았다.
찾아보니까 다 Programming Language 같은 수업이나
스스로 찾아서 공부하면서 들은 내용이긴 해서 이해하는데 어렵진 않았다.
일반적으로 프로그래밍 언어에서 메모리의 생존 주기는
1. 필요할 때 메모리를 할당
ex) int i; 를 하면 4bytes가 할당된다.
2. 할당된 메모리를 읽고 쓴다.
ex) i라는 변수를 읽거나 내용을 바꾼다.
3. 필요 없으면 해제한다.
이런 순서이다.
필요 없으면 해제할 때, 자바스크립트는 가비지 콜렉션을 하여 해제하는데,
가비지 콜렉션은 말그대로 쓰레기, 즉 이제 더 이상 사용하지 않거나 필요 없는 메모리를 찾아서 지워준다.
가비지인지 아닌지는 참조되는가 되지 않는가로 알아낼 수 있다.
참조는 다른 메모리가 이 메모리로 접근이 가능하면 참조된다고 한다.
가비지 콜렉션 방법은 2가지가 있다.
1. Reference-counting 가비지 콜렉션
말 그대로 참조가 되는지 안되는지만 세서 없애주는 것이다.
int a = 3;
int b = a;
이렇게 되면, a는 b에 의해 참조되고 있는 것인데, 이 때
b = 3; 으로 바뀐다면
a는 더 이상 참조되지 않으므로 가비지 콜렉션이 수행된다.
이 방법의 문제는 서로가 서로를 참조하게 되면 순환 참조가 되어 메모리가 해제되지 않고,
이에 따라 메모리 누수가 발생한다.
2. Mark and sweep
roots라는 오브젝트 집단을 가지고,
이 집단들에 대해 참조를 하거나, 참조를 당하지 않는 메모리들을 닿을 수 없는 메모리라고 하고
이들을 가비지 콜렉팅을 한다.
이 방법으로는 순환 참조의 문제를 해결할 수 있다.
'Coding > JavaScript' 카테고리의 다른 글
javascript 배열 일부만 복사 slice (0) | 2020.02.24 |
---|---|
javascript sort 함수를 사용하여 정렬하는 법 (0) | 2020.02.24 |
JavaScript SetTimeout 사용법 (0) | 2020.02.18 |
javascript fill() 함수 (0) | 2020.02.15 |
javascript ... spread operator 문법 (0) | 2020.02.14 |