Computer Science

[CS] 가비지 컬렉션

반응형

가비지 컬렉션

가비지 컬렉션은 프로그램에서 더 이상 사용하지 않는 메모리를 자동으로 정리하는 것입니다.

 

동적 할당된 메모리 영역 가운데 더 이상 사용할 수 없게 된 영역을 탐지하여 자동으로 해제하는 기법입니다.

더 이상 사용할 수 없게 된 영역이란, 어떤 변수도 가리키지 않게 된 영역을 의미합니다.

 

자바, C#, 그리고 일부 스크립트 언어들은 처음부터 쓰레기 수집 기법을 염두에 두고 설계되어, 언어 정의에 쓰레기 수집이 포함되어 있다. C, C++ 등의 프로그래밍 언어는 수동 메모리 관리를 가정하고 설계되었으나 지원하는 구현도 존재한다.

 

가비지 컬렉션의 방법

  • 트레이싱: 한 객체에 flag를 두고, 가비지 컬렉션 사이클마다 flag에 표시 후 삭제하는 mark and sweep 방법입니다.
    객체에 in-use flag를 두고, 사이클마다 메모리 관리자가 모든 객체를 추적해서 사용중인지 아닌지를 표시(mark)합니다. 그 후 표시되지 않은 객체를 삭제(sweep)하는 단계를 통해 메모리를 해제합니다.
  • 레퍼런스 카운팅: 한 객체를 참조하는 변수의 수를 추적하는 방법입니다.
    객체를 참조하는 변수는 처음에는 특정 메모리에 대해 레퍼런스가 하나뿐 이지만, 변수의 레퍼런스가 복사될 때마다 레퍼런스 카운트가 늘어납니다. 객체를 참조하고 있던 변수의 값이 바뀌거나, 변수 스코프를 벗어나면 레퍼런스 카운트는 줄어듭니다. 레퍼런스 카운트가 0이 되면, 그 객체와 관련한 메모리는 비울 수 있습니다. 레퍼런스 카운트가 0이 된다는 말은 아무도 그 객체에 대한 레퍼런스를 가지고 있지 않다는 말과 같습니다.

 

V8 엔진(Chrome V8) 가비지

 

크롬V8 또는 V8, 웹 브라우저를 만드는데 기반을 제공하는 오픈 소스 자바스크립트 엔진으로 구글이 제공하고 있습니다.
V8 자바스크립트 엔진은 기존 다른 웹 브라우저보다 자바스크립트 처리가 월등히 빠릅니다. 이유는 JIT(Just In Time)컴파일 방식을 사용하기 때문입니다. 이 방식은 자바스크립트를 인터 프리트 하지 않고 즉시 기계어로 컴파일 합니다. (속도개선)

 

V8의 가비지 컬렉션은 세대적(Generation)으로 동작합니다. New 영역은 Minor GC(Scavenger), Old 영역은 Major GC(Mark-Sweep-Compact)가 관리합니다.


새로 생성된 객체가 할당되는 new generation 영역과 오래 살아남은 객체가 이동하는 old generation 영역이 있습니다.


new generation 은 두 개의 semi-space 로 구성됩니다. 새로운 객체는 활성 semi-space (nersery) 에 할당되고, new generation 에서 가비지 컬렉션이 일어나면 활성 semi-space 에 존재하는 객체 중 살아남은 객체는 다른 semi-space (intermediate) 로 이동하고, 다른 semi-space 에 존재하는 객체 중 살아남은 객체는 old generation 으로 이동합니다.


즉 new generation 에서 두 번의 가비지 컬렉션이 일어나는 동안 살아남은 객체들이 old generation 으로 이동합니다. (약 20% 의 객체가 이동한다고 합니다.) 객체의 이동은 비용이 비싼 작업이지만, 대부분의 객체는 금방 소멸한다는 가설 하에 V8 엔진은 이러한 세대별 전략을 채택합니다.

 

가비지 컬렉션으로 인해 프로그래머가 직접 메모리를 관리하지 않아도 된다. 그렇지만 가비지 컬렉션을 잘 알고 있다면 메모리 문제를 예방하고 GC에게 부담을 주지 않는 안전한 프로그램을 작성할 수 있습니다.

 

Memory terminology

반응형