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)은 하지 않는다.
2. Young GC 가 CMS에서 어떻게 동작하는가
application 이 일정시간 동작한 후의 heap 모습을 보면 대략 다음과 같다.
- young generation 공간은 allocated 되었다.
- old generation 공간은 일부 allocated 되어 있다.
- Object들은 old generation area 에 흩어져 있게 된다.
- 이 allocated object 를 다른 곳으로 움직이지 않고, 그 자리에서 deallocate 하게 된다.
- full GC 가 있지 않는한, space는 compacted 되지 않는다.
GC
young generation 에 있는 CMS collector는 parrallel collector와 동일한 알고리즘을 사용한다.
heap 의 old generation에 대한 CMS collector 의 수행은 다음과 같은 큰단계(phase)들로 나눌 수 있다.
- initial mark(Stop the World Event)
- concurrent mark
- remark(Stop the World Event)
- concurrent sweep
- resetting
단계별 설명:
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 으로 가게 된다.
아래 그림에서 새롭게 old generation 으로 가게된 obejct들은 어두운파란색으로 표시됐다.
- Eden space와 survivor space 에 있는 live object들(사용중인 object들)은 다른 survivor space로 copy 된다.
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 가 시작된다.
- initial mark : initial mark 는 짧은 pause phase 이다. live object들이 mark 되는 시점이다.
- Concurrent marking : application 은 계속 실행되고 있는 동안에 Concurrent marking 은 live object들을 찾는다.
- remark : remark phase 에서는, 방금수행한 concurrent marking 동안에 놓쳤던 object들을 찾게 된다.
Old Generation Collection - Concurrent Sweep
이전 phase에서 mark 되지 않은 Object들, 즉 live object들이 아닌 dead object들은 그자리에서 deallocated 된다. compaction 은 없다.
Old Generation Collection - After Sweeping
위 sweeping phase 이후, 많은 메모리들이 freed 된 상태가 된다.
최종적으로 CMS collector 는 resetting phase로 갈 것이다. 이제 다시 GC threshold 에 도달할 때까지 그냥 기다린다.
댓글 없음:
댓글 쓰기