자바스크립트 안에서 가비지 컬렉션이 사용되고 있는데 어떻게 코드를 작성해야만 메모리 누수를 방지할 수 있는지에 대해 알아보자.
가비지 컬렉션은 무엇이고 어떻게 동작할까?
Allocate memory -> User memory -> Release memory
JS에서 쓰레기란?
Allocate memory 할당 즉 저장이 되어지고
Use memory 더 이상 사용되어지지 않는 메모리인데
Release memory 아직 방출되어지지 않은 메모리
할당 -> 사용 -> 방출
어떻게 Allocate 되는지 살펴보자.
먼저 메모리는 무엇인가?
컴퓨터에서 0과 1로 표현되어진 어떤 값이 어딘가에 저장이 되어진 주소다.
만약 자바스크립트에서
let person = 'good';
이라는 값을 할당했을 때
컴퓨터에서는 이 자바스크립트 언어를 컴파일해야 하는데, 결국 컴퓨터는 0과 1 그리고 주소값을 참조하는 것이다.
주소를 참조 하기 위해서는 person이라는 주소(변수명)에 'good'이라는 주소값이 저장이 되어있는지 알아야 한다.
컴퓨터의 입장에서 이 person은 메모리 주소값이다. 만약 이 주소값에 memory address 4127963 같은 값이 설정되어 있다면, 결국 10111001... 이런 컴퓨터가 이해할 수 있는 언어로 치환되어 컴퓨터로 전달되는 것이다.
다시 돌아와서 가비지 컬렉팅할 때 가비지는 더 이상 필요없는 메모리, not Use 사용되지 않는 메모리지만, not Release 방출되지 않은 메모리값이다.
C언어는 가비지 컬렉팅을 하는 함수가 따로 있지만,
JS는 가비지 컬렉팅을 자동으로 실행해준다.
하지만 자동으로 실행되기 때문에 어떠한 문제가 발생한다.
가비지 컬렉터가 메모리가 쓸모없는 메모리인지 여부를 판별하기 위한 방법은 뭘까?
바로 Memory references를 갖고 메모리가 가비지인지 아닌지 가비지컬렉터가 판별한다.
function A () {}
이렇게 빈 객체를 생성자 함수를 만들어주면 위에서 let person = 'good' 처럼 값을 할당하지 않았는데도 prototype을 가지고 있다.
Mark-and-sweep(tracing):
한 객체에 flag를 두고, 가비지 컬렉션 사이클마다 flag에 표시 후 삭제하는 mark and sweep 방법
객체에 in-use flag를 두고, 사이클마다 메모리 관리자가 모든 객체를 추적해서 사용 중인지 아닌지를 표시(mark)한다. 그 후 표시되지 않은 객체를 삭제(sweep)하는 단계를 통해 메모리를 해제한다.
레퍼런스 카운팅: 한 객체를 참조하는 변수의 수를 추적하는 방법
레퍼런스 카운팅의 한계 : 레퍼런스 카운팅
한