2019. 3. 3. 14:44ㆍWeb/Javascript
자바스크립트의 메모리 관리?
이전에 자바스크립트의 동작원리에 대해서 정리를 했었다.
"그래 이젠 자바스크립트가 어떻게 동작하는지는 알겠어.."
라면서, 자바스크립트에 대해 이해한 줄 알았다.
하지만, 얼마 전에 누군가가 "자바스크립트는 메모리 관리 어떻게 해요?"라고 물어봤는데 대답을 할 수 없었다..
다른 언어들의 메모리 관리
C 언어
- malloc()나 free()와 같은 저수준의 메모리 관리를 위한 원시함수(primitive) 존재
- 개발자는 이들을 이용하여 명시적으로 운영체제로부터 메모리를 할당 받거나 돌려주는 작업
Java
- JVM(Java Virtual Machine)의 GC(Garbage Collection) 이용
JVM(Java Virtual Machine)과 Garbage Collection 참고
위와 같이 c와 java에서는 각각의 방법으로 메모리 관리가 이루어진다.
그런데....
Javascript에서도 Java처럼 가비지컬렉션(Garbage Collection)으로 자원을 반환하는 것이 자동으로 일어나는 것처럼 보이는 것 때문에 자바스크립트 개발자들(또한 다른 고수준 언어의 개발자들도)은 자신들이 더 이상 메모리관리를 신경쓰지 않아도 된다는 생각을 하는 경우도 있다고 한다.
그럼 왜 메모리 관리에 대해서 알고 있어야 하는가?
비록 가비지컬렉터가 자동으로 메모리 관리를 어느정도 해주지만, 이것은 구현상의 제한이나 버그 때문에 문제가 있을 수 있다.
따라서 개발자들은 이런 문제들을 최소한의 트레이드오프와 기술부채로 효율적으로 해결하기 위해서 메모리 관리에 대해서 어느정도라도 이해하고 있어야 한다.
메모리 생명주기?
Allocate(할당) → Use(사용) → 해제(release)
- 메모리 할당(allocate): 프로그램이 사용할 수 있도록 운영체제가 메모리를 할당
- 메모리 사용(use): 할당된 메모리를 실제로 프로그램이 사용하는 단계입니다.
- 메모리 해제(release): 프로그램에서 필요하지 않은 메모리 전체를 되돌려주어 다시 사용가능하게 만드는 단계
자바스크립트에서의 메모리 할당
자바스크립트는 변수 할당 시점에 메모리 할당을 스스로 수행한다고 한다.
그래서 개발자들은 메모리 할당 부분에서 신경 쓸 필요가 없어졌다.
var n = 123; // Number 메모리 할당
var str = 'string'; // String 메모리 할당
//Object 메모리 할당
var obj = {
a : 1,
b : 'abc'
};
var d = new Date(); // 특정 함수를 통해서도 메모리 할당이 이루어짐
....
자바스크립트에서의 메모리 사용
자바스크립트에서 메모리를 사용한다는 것은 변수에 값을 읽기/쓰기 또는 특정 객체의 속성, 변수에 접근, 함수 파라미터 전달 등의 과정을 의미한다.
자바스크립트에서의 메모리 해제
이 단계가 메모리 관리 문제가 발생하는 단계이다.
위에도 언급했듯이, 자바스크립트도 가비지컬렉터 기반으로 자동으로 메모리 관리 이루어지는 언어이다.
가비지컬렉터는 할당된 메모리가 더이상 필요하지 않은지를 추적하고 확인하여 메모리를 반환하는 역할을 한다.
하지만 이것은 추정에 기반한 메모리 관리이다. 메모리가 필요한지 필요하지 않은지는 결정하기 어려운 문제이고, 알고리즘만으로는 완벽한 관리가 불가능하다.
GC(Garbage Collection)에 대한 자세한 정리는 너무 많기 때문에 이 포스팅을 참고하자
포스팅 시작 부분에서도 말했지만, 이 포스팅의 목적은 자바스크립트의 메모리 관리 과정을 이해하고, 그것을 바탕으로 어떻게 개발을 해야하는지에 대해서 재고해보기 위함이었다.
여기까지 포스팅을 마치겠습니다.
'Web > Javascript' 카테고리의 다른 글
[Javascript] ES6 정리 (0) | 2019.08.24 |
---|---|
[Javascript] ES5 (ECMAScript 5) (0) | 2019.05.26 |
[Javascript] 자바스크립트 Coding Convention 및 네이밍 규칙 (0) | 2019.03.02 |
[Javascript] Closure(클로저) 란? (0) | 2018.07.14 |
[Javascript] Hoisting(호이스팅) 이란? (0) | 2018.07.14 |