일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- HTML
- HTML5
- js코테
- 백준
- 알고리즘
- JS
- 포이마웹
- 백준골드
- 백준구현
- 리액트
- 프로그래머스
- 다이나믹프로그래밍
- 백준구현문제
- 자바스크립트
- dp알고리즘
- CSS
- 안드로이드 스튜디오
- 백준알고리즘
- 익스프레스
- 코딩테스트
- 코테
- 백준js
- css기초
- 리액트댓글기능
- 백준nodejs
- JS프로그래머스
- 리액트커뮤니티
- 프로그래머스JS
- 프로그래머스코테
- 몽고DB
- Today
- Total
개발새발 로그
[2023-09-20] TIL - 메모리 심화 본문
아래 상황을 살펴보자
temp라는 변수가 선언되면 값을 바라보고 있는 것이 아닌 메모리 주소를 바라보고 있다.
만약 여기서 새로운 변수에 기존 변수를 대입하면 마찬가지로 기본변수의 메모리 주소를 바라보게 된다.
이때 기본 변수의 값을 조작하면 어떻게 될까요?
새로운 메모리 주소를 할당받고, 그것에 값을 넣게 된다.
이유는 자바스크립트에서 원시타입은 변경이 불가능하기 때문이다.
따라서 원시타입의 값이 변경될 때에는 항상 메모리가 새로 할당된다.
여기서 자바스크립트엔진은 가상머신으로 구성되어 있다.
이 가상머신에는 메모리모델을 구현해 놓았는데
각각 heap영역과 callstack영역이다.
heap은 참조타입이. 들어가고
callstack은 원시타입이 들어간다.
아래의 상황을 보자.
좌측코드를 실행시키면 우측과 같이 형성된다.
먼저 순차적으로 CallStack에 변수들이 쌓이게 된다.
여기서 배열 같은 경우는 오브젝트 타입이기 때문에 참조타입으로 분류된다.
배열을 생성하면 Heap에 배열영역이 생기게 되는데
CallStack에 생성된 배열 변수는 Heap에서 생성된 배열의 메모리 주소를 참조한다.
여기서 Heap영역 메모리는 동적으로 크기가 변할 수 있다.
따라서 배열의 값을 추가하면 Heap 메모리 영역에 그대로 할당이 된다.
배열을 상수로 선언했는데 동작하는 이유기도 한다.
상수여도 push가 동작하는 이유는 CallStack에 할당된 메모리를 변경하는 것이 아닌 Heap 메모리를 변경하는 것이기 때문이다.
이렇게 사용을 마친 메모리는 어떻게 정리가 될까?
이전에 자바스크립트엔진에서는 Garbage Collector라는 것을 통해 메모리를 정리한다.
앞서 사용된 메모리도 Garbage Collector에 의해 정리될 수 있다.
이때 현대적인 브라우저의 Garbage Collector는 Mark and Sweep Algorithm을 통해 메모리를 정리한다.
Mark and Sweep Algorithm
- 닿을 수 없는 주소를 더 이상 필요 없는 주소로 정의하고 지우는 알고리즘
- 최상위 객체인 window에서부터 시작하여 닿을 수 없는 곳은 필요 없는 곳이라 생각하여 지우는 알고리즘
다시 처음으로 돌아가서
만약 또다시 값을 할당하여 첫 번째 메모리를 아무도 참조하지 않는다면 어떻게 될까\?
Garbage Collector에 의해 메모리가 조용히 사라지게 된다.
이처럼 메모리가 지워지는 것은 참조가 중요하다.
참고로 이후에 다룰 클로저가 가능한 이유도 참조 덕분이라고 할 수 있다.
'TIL' 카테고리의 다른 글
[2023-09-21] TIL - 컴퓨터 시간 원리 (0) | 2023.09.21 |
---|---|
[2023-09-21] TIL - 네트워크 기초 (0) | 2023.09.21 |
[2023-09-20] TIL - 스코프와 클로저 (1) | 2023.09.20 |
[2023-09-20] TIL - 변수, 상수, 자료형 그리고 메모리 (0) | 2023.09.20 |
[2023-09-20] TIL - 브라우저 동작 원리, 프론트엔드의 역할 (0) | 2023.09.20 |