자료구조 공부 중, 노드 삭제를 하게 되면, C언어의 경우에는 free를 통해 할당했던 메모리를 해제하게 된다. 그렇다면, JS는 어떻게 메모리를 관리하는 것일까?
JS에서는 객체가 더 이상 필요하지 않을 때, 자동으로 메모리를 해제한다(가비지 컬렉션). 그렇다면, JS 프로그래머들은 메모리 관리를 할 필요가 아예 없는 것일까?
그건 아니다! 기본적으로 JS에서 메모리를 어떻게 관리하고 처리하는지 이해하고 적절하게 코딩해야 한다!
할당 : 자바스크립트는 타입을 따로 지정하지 않아도 할당된 값을 통해 동적으로 타입을 지정한다. 이는 메모리 용량이 과거보다 월등히 커진 상황에서 자바스크립트가 등장했기 때문에 메모리 공간을 좀 더 넉넉하게 할당하는 방식을 선택했기 때문이다.
숫자의 경우 정수형인지 부동소수형인지 구분하지 않고 64비트(8바이트)를 확보하기때문에 개발자 입장에서 형변환을 걱정을 덜어줬다.
해제 : JS에서는 **가비지 컬렉션(GC)**라는 자동 메모리 관리 기법을 사용한다.
가비지 컬렉션은 메모리 할당을 추적하고 판단하고 회수한다. GC는 메모리 회수 판단을 '비결정적으로'' 하게되는데, 대표적인 방법으로는 아래 두 가지가 있다.
ex1) Reference-counting GC참조를 안하는 순간 회수하는 GC. 해당 변수/객체를 가리키는 변수가 없어지면 회수한다.하지만, 이 방식의 경우, 순환참조의 문제에 빠지게 된다.
순환참조란, 서로가 서로를 참조하는 경우를 의미한다. 서로가 서로를 참조하여 외부에서 접근하는 방법이 사라져서(예를 들어 함수가 종료한 경우) 회수되어야 함에도 불구하고, 서로를 참조하고 있기 때문에 회수되지 않을 수 있다.
ex2) Mark-and-sweep 알고리즘Root 오브젝트에서 참조가 닿는 경우에만 메모리를 해제하지 않는다. 이는 순환참조 문제를 해결한다.
위의 두 가지 관리 방법을 제공함에도 불구하고 JS에서 메모리 관리에는 한계가 존재한다. 바로 JS에서 수동으로 메모리 해제를 하기위한 명시적 기능이 존재하지 않는다는 것이다.
JS는 애초에 메모리의 크기가 충분하다는 가정에서 생성된 언어이다. 따라서 메모리 관리를 특별히 할 필요는 없지만, 메모리가 크게 필요한 경우에는 해당 실행프로그램이 어떤 방식의 GC를 사용하는지 파악하고 돌려서 해제할 필요가 있다.
JS 메모리 관리 MDN 문서 참고https://developer.mozilla.org/ko/docs/Web/JavaScript/Memory_management
JS 메모리 할당 참고https://velog.io/@uiseop/%EA%B8%B0%EC%B4%88-%EB%A9%94%EB%AA%A8%EB%A6%AC%EC%99%80-%EB%8D%B0%EC%9D%B4%ED%84%B0-JS%EC%97%90%EC%84%9C