[컴] Concurrent Mark Sweep (CMS) collector

Concurrent Mark Sweep (CMS) collector

※ 다음 내용은 ref. 1을 번역하고, 몇몇 부분은 설명을 추가해서 재구성했다.

CMS collector 를 한국말로 번역한다면, ‘동시에 마킹해서 쓸어버리는 collector’ 정도가 될 것 같다.

이 CMS 는 대부분의 garbage collecion 일을 application thread들과 동시에(concurrently) 처리하게 해서 ‘잠시멈춤’(pause) 들을 최소화 하려 시도한다.(–> application thread 들이 동작할 때 같이 garbage collection 을 한다)

일반적으로 동시에 실행돼서 pause가 적은 garbabe collector 는 object들을 복사하거나, 압축 하지 않는다.

garbage collection 은 live object들을 이동시키지 않고 처리된다. 만약 fragmentation 이 문제가 되면 좀 더 큰 heap 을 할당해야 한다.

1. CMS collector 를 위한 heap 구조

heap 은 다음 3개의 공간(space)으로 나눠진다.

  • Young generation
    • Eden space
    • 2 Survivors spaces
  • Old generation

full GC 를 하는 것이 아니라면, 압축(compaction)은 하지 않는다.

from ref. 1

2. Young GC 가 CMS에서 어떻게 동작하는가

application 이 일정시간 동작한 후의 heap 모습을 보면 대략 다음과 같다.

  • young generation 공간은 allocated 되었다.
  • old generation 공간은 일부 allocated 되어 있다.
    • Object들은 old generation area 에 흩어져 있게 된다.
    • 이 allocated object 를 다른 곳으로 움직이지 않고, 그 자리에서 deallocate 하게 된다.
    • full GC 가 있지 않는한, space는 compacted 되지 않는다.
from ref. 1

GC

young generation 에 있는 CMS collector는 parrallel collector와 동일한 알고리즘을 사용한다.

heap 의 old generation에 대한 CMS collector 의 수행은 다음과 같은 큰단계(phase)들로 나눌 수 있다.

  1. initial mark(Stop the World Event)
  2. concurrent mark
  3. remark(Stop the World Event)
  4. concurrent sweep
  5. resetting

단계별 설명:

  1. Young generation collection

    여기선 시간이 지나서 오래된 object들을 다른 space로 옮기는 copy 가 이뤄진다.

    • Eden space와 survivor space 에 있는 live object들(사용중인 object들)은 다른 survivor space로 copy 된다.
      –> 그리고 기존의 것은 지워진다. 그래서 Young GC 이후에 Eden space와 ’survivor 중 한개’는 비워진다.
    • aging threshold 에 다다른 오래된 object들은 old generation 으로 가게 된다.
    from ref. 1

    아래 그림에서 새롭게 old generation 으로 가게된 obejct들은 어두운파란색으로 표시됐다.

    from ref. 1
  2. CMS 로 Old Generation Collection

    한참 application 이 돌다가 이제 old generation 이 어느정도 찼다 싶으면, CMS가 시작된다. 여기서부터 CMS 동작의 시작이다. 여기서는 live object를 찾아서 mark 를 한다.

    대략적으로 이야기 하면, 처음에는 잠깐 멈춰서 live object를 찾는다.(initial mark) 그리고 다시 application 이 돌고, 그러면서 이제 live object들을 계속 mark 한다.(concurrent mark) 그리고 다시 잠깐 멈춰서 live object를 찾는다.(remark)

    ‘stop the world’ event 가 총 2번 발생하는데, inital mark 와 remark 시점에 발생한다. old generation 이 특정 점유율(occupancy rate)에 도달할때, CMS 가 시작된다.

    1. initial mark : initial mark 는 짧은 pause phase 이다. live object들이 mark 되는 시점이다.
    2. Concurrent marking : application 은 계속 실행되고 있는 동안에 Concurrent marking 은 live object들을 찾는다.
    3. remark : remark phase 에서는, 방금수행한 concurrent marking 동안에 놓쳤던 object들을 찾게 된다.
    from ref. 1
  3. Old Generation Collection - Concurrent Sweep

    이전 phase에서 mark 되지 않은 Object들, 즉 live object들이 아닌 dead object들은 그자리에서 deallocated 된다. compaction 은 없다.

  4. Old Generation Collection - After Sweeping

    위 sweeping phase 이후, 많은 메모리들이 freed 된 상태가 된다.

    최종적으로 CMS collector 는 resetting phase로 갈 것이다. 이제 다시 GC threshold 에 도달할 때까지 그냥 기다린다.

See Also

  1. 쿠…sal: [컴][자바] java 의 G1 collector

Reference

  1. Getting Started with the G1 Garbage Collector

댓글 없음:

댓글 쓰기