- garbage collection
모든언어에서 메모리관리는 개발자에게 큰 이슈사항중 하나이다.
C언어에서는 힙에 할당한 메모리(malloc)는 반드시 free를 해줘야 할당한 메모리를 반환한다.
하지만, 이 데이터(메모리)가 더 이상 안쓸것인지, 더 쓸 일이 있을지 판단하면서 프로그램을 짜기에는
많은 고려사항이 필요하다.
이러한 메모리 관리를 도와주는 것을 garbage collection이라고 부른다.
garbage collection은 쓰지 않는, 데이터를 판단하여, 필요없는 데이터를 메모리에서 내리는 역할을 한다. garbage collection은 대체로 알아서 메모리가 필요하거나, 알맞은시간에 동작하는데, 언어마다 명시적으로 호출 할 수 도 있다. java에서는 system함수를 사용하거나, runtime함수를 사용 할 수 있다.(바로 호출 되는것은 아니다.) javascript에서는 브라우저 환경을 타기때문에 사실상
자동적으로 호출되는것이 맞다고 보면된다. (ie : window.CollectGarbage()가 있기는 함)
garbage collecter는 어떻게 해당 데이터가 이제 쓰이지 않을것으라는 것을 판단하는것은 각 언어마다 다르다.(구현방식과 메카니즘)
- 참조 카운팅
가장 심플한 방법은 rc(reference count)를 측정하는것이다 rc는 refercence count에 약자로,
말 그대로 참조의 수를 세는것이다. 참조의 수가 0인 데이터는 이제 필요없는 데이터라고 생각하고 메모리에서 내리는 것이다.
하지만, 위 방법에는 문제가 있다. 바로 상호 참조인데, 예를들어 a는 b를 참조하고 b가 a를 참조 한다고 했을때, 위 a,b는 rc가 0이 될 일이 없다.
- 표시하고 지우기
자바스크립트는 참조 카운팅 방법을 사용하지 않고, 표시하고 지우기라는 방법을 사용한다.
가비지 컬렉터가 호출되면 메모리에 저장된 변수 전체에 표시를 한다. 그 후 현재 컨텍스트에 있는 변수와
현재 컨텍스트가 참조하고 있는 변수에 표시를 지우고,
아직 표시가 남아 있는 데이터를 메모리에서 내린다.