이번 세 번째 게시물에서는 메모리 관리와 같은 또 다른 중요한 주제에 대해 논의하려고 한다. 이 주제는 프로그래밍 언어의 성숙도와 복잡성이 증가함에 따라 개발자들이 점점 더 무시하고 있는 주제이다.
C와 같은 언어는 molloc()
및 free()
와 같은 저 수준 메모리 관리 기본 요소를 가지고 있다. 이 기본 요소들은 개발자가 운영 체제에 명시적으로 메모리를 할당하고 해제하는데 사용된다.
동시에, JavaScript는 things(객체, 문자열 등)이 생성될 때 메모리를 할당하고, 더 이상 사용되지 않을 때 “자동적으로” 메모리를 해제하는데, 이를 가비지 컬렉션(garbage collection)이라고 한다. 이런 자원 해제의 “자동적”인 특성은 혼란을 주는 원인이며, JavaScript(및 다른 고수준 언어)개발자들에게 메모리 관리를 신경 쓰지 않아도 된다는 잘못된 인상을 준다. 이것은 큰 실수이다.
고수준 언어로 작업하더라도 개발자들은 메모리 관리(또는 적어도 기본적인 부분)에 대한 이해를 가져야 한다. 때때로 자동 메모리 관리(가비지 컬렉터의 버그나 구현 제한 등)에 문제가 있을 수 있고, 이러한 문제를 적잘하게 처리하거나 (또한 최소한의 트레이드 오프와 코드 부채를 가지는 적절한 우회 방법을 찾기 위해) 개발자들은 이를 이해해야 한다.
사용하는 프로그래밍 언어가 무엇이든 간에, 메모리 수명주기는 대체로 항상 같다:
각 단계에서 일어나는 일에 대한 개요는 다음과 같다.
JavaScript의 메모리에 바로 들어가기 전에, 일반적으로 메모리가 무엇인지와 그것이 어떻게 작동하지에 대해 간단히 이야기해보자.
하드웨어 수준에서 컴퓨터 메모리는 많은 수의 플립플롭으로 구성되어 있다. 각 플립플롭은 몇 개의 트랜지스터를 포함하고 있으며 하나의 비트를 저장할 수 있다. 개별 플립플롭은 고유한 식별자로 주소 지정 가능하므로 우리는 그들을 읽고 덮어쓸 수 있다. 따라서 개념적으로, 우리는 우리의 전체 컴퓨터 메모리를 우리가 읽고 쓸 수 있는 비트의 거대한 배열로 생각할 수 있다.
인간은 비트로 모든 생각과 산술을 하는 것에 그리 능숙하지 않기 때문에, 비트를 더 큰 그룹으로 구성하여 숫자를 나타내는데 사용한다. 8비트를 1바이트라고 한다. 바이트 이상으로는 워드가 있으며(때때로 16비트, 때때로 32비트이다)
이 메모리에는 많은 것들이 저장된다.
컴파일러와 운영 체제가 협력하여 대부분의 메모리를 관리를 담당하지만, 무슨 일이 일어나고 있는지 확인하는 것이 좋다.