✔ 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