Hotspot JVM의 Garbage Collector

Dec152009

   View Comments

Hotspot JVM, 다시말해 Sun사에서 만들어 HP, Solaris, Windows, Linux, Mac 등에서 사용하는 JVM은 Garbage Collector를 추가하는 방식으로 Garbage Collection이 개선되어 왔다. 다시말해 버전이 올라가면서 기존의 Garbage Collector 보다 더 나은 알고리즘을 가진 Garbage Collector를 추가하여 제공하는 방식으로 진화해왔다는 것이다.

그러므로 Hotspot JVM에서는 
Garbage Collector를 이해하는 것이 바로 Garbage Collection자체를 이해하는 것을 의미하게 된다. 다음의 그림은 Java 6까지 Hotspot JVM에서 제공하는 Garbage Collector를 정리한 것이다. 


Hotspot JVM의 또 하나의 특징은 generation 별로 Garbage Collector가 사용하는 알고리즘이 각각 다르다는 것이다. 그렇기 때문에 Hotspot JVM의 Garbage Collector를 이해하기 위해서는 각각의 Generation별 알고리즘을 이해해야 한다.

Serial Collector는 Hotspot JVM의 가장 기본적인 
Garbage Collector로 Default Collector라고도 불린다. 이 Garbage Collector는 Young Generation의 경우 Generation Algorithm을 사용한다. 각 Garbage Collector의 알고리즘에 대해서는 차차 포스팅하겠지만, 이 Serial Collector의 Generation Algorithm은 Sun JVM의 대표적인 알고리즘으로 인터넷에 나와있는 Garbage Collection의 과정이 대부분 이 알고리즘을 설명하고 있다. 간략하게 설명하면 Eden, Survivor 영역으로 Live Object가 이동하면서 Garbage Collection을 수행하는 방식이라 할 수 있다. 반면 Old Generation에는 Mark-and-Compacting 알고리즘을 사용한다. 

Parallel Collector는 Young Generation을 병렬 처리하여 Garbage Collection의 속도를 높이자는 전략을 사용한다. Serial Collector와의 차이는 단지 Young Generation을 Multi thread로 Garbage Collection을 수행한다는 것이다. 그밖의 사항은 모두 동일하다.

Parallel Compation Collector는 Parallel Collector에서 Old Generation의 알고리즘을 병렬처리로 변경한 것이다. Young Generation은 Parallel Collector와 동일한 방식을 사용한다. 이 
Garbage Collector는 비교적 나중에 나온 것으로 이것이 나오기 전에는 CMS Collector와 Incremental Collector가 있다. 

이 두 Collector와 Parallel 방식과는 개념적인 차이가 있다. 우선 Parallel 방식은 
Garbage Collection에 최대의 리소스를 투입해서 빨리 끝내겠다는 전략을 가지고 있다. 반면 CMS나 Incremental 방식은 이와는 달리 Garbage Collection을 하는 동안에 어플리케이션이 멈추는 시간을 최소화하려는 전략을 가지고 있다. 그렇기 때문에 Garbage Collection 중에도 모든 Thread가 멈추게 하는 것 보다는 가능한 Garbage Collection과 어플리케이션이 동시에 작업이 가능하도록 한다.

Concurrent Mark-Sweep Collector (CMS Collector)는 1.4 버전에서 추가되었고 주로 어플리케이션이 오래 간섭을 받는 Old Generation의 Garbage Collection에 집중하고 있다. Old Generation에서는 Concurrent Mark-Sweep이라는 알고리즘을 사용한다. 명칭에서는 적어도 두가지 사실을 알 수 있다. Concurrent라는 단어는 Garbage Collection와 어플리케이션을 동시에 수행한다는 것을 나타내고, Mark-Sweep은 Compaction을 하지 않는 다는 것을 알 수 있다. Young Generation에서는 기존과 같이 Parallel Copy 알고리즘을 사용한다.

Incremental Collector는 1.3버전에 추가된 비교적 오래된 Collector로 Train Collector라는 별명을 가지고 있다. 그 이유는 Old Generation에서 Train 알고리즘을 사용하고 있기 때문이다. 그런데 이 Collector는 현업에서 거의 사용되지 않고 있고 Java 6에 와서는 관련 Option들이 사라지는 등 사실상 지원이 끊긴 Collector이다.

위의 표에는 나타나지 않았지만 
Java 7에서는 새로운 Collector가 하나 더 추가되었다. 그것은 Garbage First Collector인데 이 Collector를 사용하게 되면 Young Generation과 Old Generation의 물리적인 구분은 사실상 사라지고 1Mbytes로 시작되는 각 Region으로 쪼개어진다. 그리고 그 Region이 하는 역할에 따라 Young, 혹은 Old Generation의 Region으로 인정되는 논리적인 구분이 존재하게 된다. 

Garbage First라는 이름은 이 Region중에 Garbage Object로 가득찬 Region부터 Collection을 수행하기 때문에 붙여졌다. 이 Gatbage Collection의 기본 알고리즘은 Train 알고리즘에 근간을 두고 있다. 

이후의 포스트를 통해 차차 각 
Garbage Collector에 대해 자세히 알아보도록 하겠다.

'Development > Java' 카테고리의 다른 글

자바 네트워크 구동 프로토콜(JNLP)과 참조 구현, 자바 웹 스타트  (0) 2012.01.18
자바 데몬(daemon) 만들기  (0) 2012.01.18
java - RMI  (0) 2012.01.17
자바 SimpleDateFormat  (0) 2011.01.24
아스키 코드  (0) 2011.01.11
Posted by linuxism
,