개발새발 로그

[2023-09-20] TIL - 메모리 심화 본문

TIL

[2023-09-20] TIL - 메모리 심화

이즈흐 2023. 9. 20. 16:57

아래 상황을 살펴보자

 

temp라는 변수가 선언되면 값을 바라보고 있는 것이 아닌 메모리 주소를 바라보고 있다.

만약 여기서 새로운 변수에 기존 변수를 대입하면 마찬가지로 기본변수의 메모리 주소를 바라보게 된다.

 

이때 기본 변수의 값을 조작하면 어떻게 될까요?

새로운 메모리 주소를 할당받고, 그것에 값을 넣게 된다.

 

이유는 자바스크립트에서 원시타입은 변경이 불가능하기 때문이다.

따라서 원시타입의 값이 변경될 때에는 항상 메모리가 새로 할당된다.

 

여기서 자바스크립트엔진은 가상머신으로 구성되어 있다.

이 가상머신에는 메모리모델을 구현해 놓았는데

각각 heap영역과 callstack영역이다.

 

heap은 참조타입이. 들어가고

callstack은 원시타입이 들어간다.

 

아래의 상황을 보자.

좌측코드를 실행시키면 우측과 같이 형성된다.

먼저 순차적으로 CallStack에 변수들이 쌓이게 된다.

 

여기서 배열 같은 경우는 오브젝트 타입이기 때문에 참조타입으로 분류된다.

배열을 생성하면 Heap에 배열영역이 생기게 되는데

CallStack에 생성된 배열 변수는 Heap에서 생성된 배열의 메모리 주소를 참조한다.

 

여기서 Heap영역 메모리는 동적으로 크기가 변할 수 있다.

따라서 배열의 값을 추가하면 Heap 메모리 영역에 그대로 할당이 된다.

 

배열을 상수로 선언했는데 동작하는 이유기도 한다.

상수여도 push가 동작하는 이유는 CallStack에 할당된 메모리를 변경하는 것이 아닌 Heap 메모리를 변경하는 것이기 때문이다.

 

 

이렇게 사용을 마친 메모리는 어떻게 정리가 될까?

 

이전에 자바스크립트엔진에서는 Garbage Collector라는 것을 통해 메모리를 정리한다.

앞서 사용된 메모리도 Garbage Collector에 의해 정리될 수 있다.

 

이때 현대적인 브라우저의 Garbage CollectorMark and Sweep Algorithm을 통해 메모리를 정리한다.

 

Mark and Sweep Algorithm

- 닿을 수 없는 주소를 더 이상 필요 없는 주소로 정의하고 지우는 알고리즘

- 최상위 객체인 window에서부터 시작하여 닿을 수 없는 곳은 필요 없는 곳이라 생각하여 지우는 알고리즘

 

 

 

 

다시 처음으로 돌아가서 

만약 또다시 값을 할당하여 첫 번째 메모리를 아무도 참조하지 않는다면 어떻게 될까\?

Garbage Collector에 의해 메모리가 조용히 사라지게 된다.

이처럼 메모리가 지워지는 것은 참조가 중요하다.

참고로 이후에 다룰 클로저가 가능한 이유도 참조 덕분이라고 할 수 있다.

728x90
반응형
LIST