✔ Javascript 기준의 가비지 컬렉션에 대한 공부
메모리 관리 기법 중 하나
자동 메모리 관리 방법
더 이상 사용하지 않는 메모리를 자동으로 해제하는 것
1. (변수 선언) -> 필요한 메모리 할당
2. 할당된 메모리 사용(읽기, 쓰기)
3. 해당 메모리가 필요 없어지면 해제
레퍼런스 카운팅 알고리즘(Reference Counting Algorithms)과 표시하고 쓸기 알고리즘(Mark and Sweep Algorithms)가 있다.
레퍼런스 카운팅 알고리즘(Reference Counting Algorithms)
❗❗참조❗❗
더 이상 필요없는 객체를 어떤 다른 객체도 "참조"하지 않는 객체로 정의함
어떤 값에 대해 어디에서도 참조되지 않고 있으면 이 값을 가비지로 간주하고 해제함
각 객체가 얼마나 많이 참조되는지를 카운트함
❌한계점 : 순환참조인 경우 가비지로 인식하지 못함
function f() {
let x = {};
let y = {};
x.a = y; //x는 y를 참조한다
y.a = x; //y는 x를 참조한다
}
f();
=> f()함수가 호출 후에 실행이 끝나면 내부 요소는 더 이상 사용하지 않는 메모리이기 때문에 메모리가 해제되어야 함. 근데 서로 참조하고 있기 때문에 가비지로 인식하지 못함 => 메모리가 해제되지 않고 계속 남아있음 => f()함수가 호출될 때마다 x,y 객체만큼의 메모리가 계속 할당되어 메모리가 낭비됨.
표시하고 쓸기 알고리즘(Mark and Sweep Algorithms)
레퍼런스 카운팅 알고리즘의 한계를 극복한 알고리즘 => 가장 많이 쓰이는 알고리즘
더 이상 필요없는 오브젝트를 닿을 수 없는 오브젝트로 정의
어떤 객체가 가비지가 아닌지 표시(mark)하고, 그 다음 마크가 되지 않은 가비지들은 메모리를 해제함(sweep)

❌한계점
references
https://engineering.huiseoul.com/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%9E%91%EB%8F%99%ED%95%98%EB%8A%94%EA%B0%80-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B4%80%EB%A6%AC-4%EA%B0%80%EC%A7%80-%ED%9D%94%ED%95%9C-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%88%84%EC%88%98-%EB%8C%80%EC%B2%98%EB%B2%95-5b0d217d788d
https://canoe726.tistory.com/37
https://developer.mozilla.org/ko/docs/Web/JavaScript/Memory_Management