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/

- 어플리케이션에 사용 시나리오에 따라 필요한 최대 메모리 최대치 확인

- 최대치만큼 사전에 할당하는 코드를 구현한 다음, 메인 메모리로 가지 않고 직접 객체를 획득/해제

Made with Slides.com