Javascript: Memory Management
Javascript Memory Management
Javascript: Memory Management


VS
Javascript: Memory Management
메모리 생명주기
Allocate memory
Use memory
Release memory
프로그램이 사용할 수 있도록 운영체제가 메모리를 할당
Javascript: Memory Management
메모리 생명주기
Allocate memory
Use memory
Release memory
할당된 메모리를 실제 프로그램이 사용하는 단계
Javascript: Memory Management
메모리 생명주기
Allocate memory
Use memory
Release memory
프로그램에서 필요하지 않은 메모리를 되돌려 주는 단계
Javascript: Memory Management
자바스크립트 메모리 할당 - 변수 선언

Javascript: Memory Management
자바스크립트 메모리 할당 - 함수 호출

Javascript: Memory Management
자바스크립트 메모리 할당 - 메소드 호출

Javascript: Memory Management
자바스크립트 메모리 사용
객체의 속성이나 변수의 값을 읽거나 쓸 때
Javascript: Memory Management
자바스크립트 메모리 해제

메모리 할당을 추적하고 자동으로 반환
Javascript: Memory Management
자바스크립트 메모리 해제
undecidable
(모든 인스턴스에 대한 답을 올바르게 결정할 수 있는 알고리즘이 존재하지 않는 결정 문제)
Javascript: Memory Management
자바스크립트 메모리 해제
가비지 컬렉터(garbage collector)
메모리 할당을 추적하고 언제 할당된 메모리가 더 이상 사용되지 않는지 파악해서 자동으로 반환

Javascript: Memory Management
가비지 컬렉션
알고리즘이 의존하고 있는 주요 개념은 참조(refernce)
자바스크립트 객체는
자신의 프로토 타입에 대한 (암묵적) 참조를 갖고 있으며
자신의 속성값에 대한 (명시적) 참조를 갖고 있다.
Javascript: Memory Management
Reference-counting
- 단순한 형태의 알고리즘
- 참조가 하나도 없는 경우 가비지컬렉션 대상으로 간주

Javascript: Memory Management
Reference-counting
- 순환 참조 문제점
- 스코프를 벗어나게 되므로 쓸모가 없게 되고 반환되어야 하지만
두 객체가 적어도 한 번은 참조한 것으로 간주하므로 둘 다 GC 대상이 될 수 없음


Javascript: Memory Management
Mark-and-sweep
- '더 이상 필요없는 오브젝트' 를 '닿을 수 없는 오브젝트' 로 정의
- 닿을 수 없는 오브젝트에 대해 가비지 콜렉션을 수행
참조되지 않은 오브젝트 -> 닿을 수 없는 오브젝트
닿을 수 없는 오브젝트 -> 참조되지 않은 오브젝트
Javascript: Memory Management
Mark-and-sweep
1. Roots
- 일반적으로 코드에서 참조되는 전역 변수
- 자바스크립트 window 객체
- node.js global 객체

Javascript: Memory Management
Mark-and-sweep
2. 자식들을 검사
- 검사 후 활성화 여부를 표시
- 루트가 닿을 수 없는것들은 가비지로 표시

Javascript: Memory Management
Mark-and-sweep
3. 활성으로 표시되지 않은 모든 메모리를 OS에 반환

Javascript: Memory Management
Mark-and-sweep
- 2012년 기준으로 브라우져들은 Mark-and-sweep 사용
- 그 이후 가비지 컬렉션 분야에서의 개선은 Mark-and-sweep의 개선


Javascript: Memory Management
자바스크립트 Mark-and-sweep


Javascript: Memory Management
자바스크립트 Mark-and-sweep


사용자의 값을 null로 설정하여 참조가 없어짐
Javascript: Memory Management
자바스크립트 Mark-and-sweep
사용자의 참조를 어드민으로 복사


Javascript: Memory Management
자바스크립트 Mark-and-sweep

admin 변수를 통해 도달할 수 있으므로 메모리에 남음
Javascript: Memory Management
자바스크립트 Mark-and-sweep
함수에서 두 객체를 서로 참조, 그리고 모두 포함하는 새 객체를 반환


Javascript: Memory Management
자바스크립트 Mark-and-sweep


Javascript: Memory Management
자바스크립트 Mark-and-sweep


=>
Javascript: Memory Management
자바스크립트 Mark-and-sweep


Javascript: Memory Management
정리를 하면...
- 가비지 수집은 자동으로 이뤄지고 우리가 컨트롤 할 수 없다.
- 컨트롤 할 수 없지만 GC비용을 줄일 수는 있다.
- 항상 필요없어진 메모리만 해제하지만, 모든 필요없어진 메모리를 해제하는건 아니다.
- 참조되는 것은 루트에서 도달 할 수 있는 것과 같지 않다.
- Reference-counting를 쓰는 브라우져는 메모리 누수가 심각하다.
- 많은 노력을 기울이진 말자.. 관심이 많다면 V8엔진을 찾아보면 된다.
- 메모리 누수가 발생했을 때 예외를 생각하면 된다.
Javascript: Memory Management
흔한 자바스크립트 메모리 누수 - 전역 변수

'use strict' 를 사용하면 회피할 수 있다.
Javascript: Memory Management
흔한 자바스크립트 메모리 누수 - 타이머, 콜백함수
예전 브라우져들만 문제가 된다. 요즘은 자동으로 다 처리한다.

Javascript: Memory Management
흔한 자바스크립트 메모리 누수 - 클로저
런타임 구현의 특성상 다음과 같은 케이스가 가능

Javascript: Memory Management
고성능 어플리케이션 - Object Pool
https://www.html5rocks.com/ko/tutorials/speed/static-mem-pools/#toc-introduction
http://blog.sklambert.com/javascript-object-pool/
http://beej.us/blog/data/object-pool/
- 어플리케이션에 사용 시나리오에 따라 필요한 최대 메모리 최대치 확인
- 최대치만큼 사전에 할당하는 코드를 구현한 다음, 메인 메모리로 가지 않고 직접 객체를 획득/해제
JavaScript: Memory Menagement
By Jaewoo KIM
JavaScript: Memory Menagement
- 401