일반적인 프로세스의 메모리 구조는 위 그림과 같다.
영역별로 하는 역할은 다음과 같다.
함수의 매개변수, 함수에서 사용하는 지역변수, 리턴할 곳의 주소값을 포함한다.
함수 호출 시 생성되며, 함수가 끝나면 반환된다.
동적으로 메모리를 할당할 때 사용되는 영역이다.
대부분 메모리 주소값에 의해 참조되고 사용된다.
그림과 같이 힙과 스택은 같은 영역을 공유하는데, 힙은 아래에서 위로 스택은 위에서 아래로 쌓이게 된다.
쌓이다가 서로의 영역을 침범하게 되면 overflow 가 발생하는 것이다.
전역변수, 정적변수, 배열, 구조체 등이 저장되는 영역이다.
BSS와 GVAR 영역은 초기값을 설정 하느냐 마느냐에 따라 달라진다.
프로그램을 작성하는데 사용된 코드들을 포함한다.
일반적으로 한번 로딩하면 바뀌지 않는다.
자바스크립트는 인터프리터 언어로 코드를 해석하고 실행하는 엔진이 필요하다.
V8 엔진을 통해 자바스크립트를 해석하고, 컴파일한다.
V8 엔진의 메모리 구조는 위 그림과 같다.
V8 엔진은 힙 메모리에 객체와 동적 데이터를 저장며, 가비지 컬렉션을 발생시킨다.
세부적으로 살펴보면 new 영역은 새로 만들어진 객체를 저장하며 이 객체들은 짧은 생명주기를 가진다.
old 영역은 가비지 컬렉션이 두번 발생할 동안 new 영역에서 살아남은 객체들이 이동하는 영역이다.
large object 영역은 다른 영역의 제한된 크기보다 큰 객체들이 살고있는 영역으로 large object들은 가비지 컬렉터로 이동하지 않는다.
code영역은 실시간 컴파일러가 컴파일 된 코드들을 저장하는 곳으로 유일하게 실행 가능한 메모리가 있는 영역이다.
프로세스마다 하나의 스택을 가진다.
스택은 메서드, 함수 프레임, 원시값, 객체 포인터 등의 정적 데이터가 저장된다.
프로그램이 사용 가능한 것 보다 더 많은 메모리를 힙에 할당하려고 한다면 메모리 부족 오류가 발생한다.
힙이 잘못 관리되면 메모리 누수가 발생할 수 있다.
따라서 V8엔진은 가비지 컬렉션을 이용해 힙 메모리를 관리한다.
자바스크립트는 도달가능성 이라는 개념을 이용해 메모리를 관리한다.
도달 가능한 값들은 현재 함수의 지역변수와 매개변수, 전역변수 등이 있다. 이런 값들을 루트라고 부른다.
또한 루트가 참조하는 값이나 체이닝을 통해 루트에서 참조할 수 있는 값 역시 도달 가능한 값이 된다.
자바스크립트 엔진 내에서는 가비지 컬렉션이 끊임없이 동작하는데, 이 과정에서 모든 객체를 모니터링 하고 도달할 수 없는 객체는 삭제한다.
가비지 컬렉션에 사용되는 알고리즘은 참고 링크에서 자세히 설명하고 있다.
참고 : https://ui.toast.com/weekly-pick/ko_20200228
https://velog.io/@code-bebop/JS-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0
https://ko.javascript.info/garbage-collection
가상메모리는 메모리를 관리하는 방법으로 프로그램을 실제 메모리에 올리는 것이 아닌 가상 메모리에 올리는 방식을 말한다.
실제 크기가 제한되어 있는 물리 메모리가 아닌 가상 메모리를 사용함으로써 훨씬 넓게 확장하여 사용할 수 있다.
가상메모리는 페이지, 물리메모리는 프레임 이라는 단위로 관리된다. 프레임과 페이지는 동일한 사이즈를 가진다.
메모리를 효율적으로 사용하기 위해 페이징 기법을 사용하여 메모리를 관리한다.
실제 데이터들은 가상메모리에 존재하는 것이 아닌 물리메모리(보통 RAM 이나 디스크)에 존재한다.
가상 메모리를 통해 실제 데이터를 처리하기 위해서는 가상 주소를 물리 주소로 변환하는 과정이 필요하다. 이 과정을 위해 페이지 테이블이 존재한다.
물리적으로 떨어져 있는 메모리를 연속적으로 이용할 수 있는 것이 페이지 테이블을 통해 가능한 것이다.
더 자세한 동작 과정은 아래 링크를 참고한다.
참고 : https://wogh8732.tistory.com/395
process 모듈은 require()를 사용하지 않고 Node.js 어플리케이션에 접근할 수 있는 전역객체이다.
프로그램과 관련된 정보를 나타내는 객체로 많은 속성과 메소드들이 시스템이나 운영체제와 밀접한 관련이 있다.
자바스크립트에는 존재하지 않으며 Node.js에만 존재하는 객체이다.
이 부분은 좀 더 알아봐야 겠다.
참고 : https://acstory.tistory.com/65
https://opentutorials.org/module/938/7189
https://runebook.dev/ko/docs/node/process