G1 Garbage Collector 2/2
G1 heap 구조
하나의 memory area 를 여러 size의 region 들로 나눠서 사용하게 된다. heap 이 대략적으로 2000개정도의 region 으로 나눠진다. 가장 작은 사이즈는 1Mb 에서 가장큰 것은 32Mb 정도 된다.
그림처럼, 각 region 들은 Eden, Survivor, Old Generation space 중 하나로 사용된다. 여기서 Enden과 Survivor 는 young generation 이다. 추가로 Humongous region 이라는 4번째 region type 이 있다. (한국말로 하면 ’거대영역’정도일려나.)
옛날 garbage collector 들처럼 region 들이 연속적일 필요는 없다. (예를 들어, CMS 의 경우를 보면, eden, survivor 등 각 영역은 1개의 연속된 공간으로 이뤄졌다. 참고)
- live objct들(사용중인 object들)은 한 region 에서 다른 region 으로 evcuated 된다.(즉, copy 또는 move 된다.)
- region 들은 다른 application thread 들을 멈추는 것 없이 병렬로 collected 되도록 디자인 됐다.
G1 에서 Young GC
young generation garbabe collection 들, 즉 young GCs
- 이때 STW(Stop The World) 멈춤이 있다. 즉, 모든 application thread 들은 이 operation 을 위해서 멈추게 된다.
- young GC 는 여러 thread들을 사용해서 병렬로 수행된다.
- live object들은 새로운 survivor region 들로 copy 되거나 old generation region 들로 copy 된다.
- live object들은 1개 이상의 survivor region 들로 evacuated 된다. 몇몇 aging threshold 에 도달한 object들은 old generation region 들로 가게 된다.
- Eden size 와 survivor size 는 다음 young GC를 위해 계산된다.
- Accounting information은 size를 계산하는데 도움을 주기 위해 저장된다.
- ’pause time 목표’같은 값들이 고려되어진다.
- young generation memory 는 여러 region 들로 구성된다. 이 region 들은 연속된 공간에 있지 않다. 이것은 필요할 때 size를 조정하는 것을 쉽게 해준다.
- 이 방법은 region 들을 필요할 때 region 의 size를 조정하기 매우 쉽게 해준다. 필요할 때 더 크게, 또는 더 작게 만들게 해준다.
G1 으로 Young GC 가 끝나면:
- live object들은 survivor region 들이나 old generation region 들로 evacuated 된 상태다.
- 아래 그림에서 최근에 old generation region 으로 움직인 것은 어두운파란색이고, 최근에 survivor region 으로 간 object들은 녹색이다.
G1 으로 Old Generation Collection
CMS collector 처럼, G1 collector 는 ’낮은 pause 시간을 갖는 old generation object를 위한 collector’로 디자인 됐다.
old generation 에 대한 G1 collection phase들은 다음과 같다.
- initial Mark(Stop the World Event)
- Root Region Scanning
- Concurrent Marking
- Remark(Stop the World Event)
- Cleanup(Stop the World Event and Concurrent)
상세 내용:
Inintial Marking
- Stop the World Event : 이것도 ’Stop the World Event’이다.
- live object에 대한 initial marking 은 young generation garbage collection 때 같이 수행된다. log에 이것들은 GC pause (young)(inital-mark)로 기록된다.
concurrent marking phase
- 전체 heap 에서 live object들을 찾는다.
- 이것은 application 이 실해되는 중에 일어난다.
- 이 phase는 young generation garbage collection 들에 의해 interrupted 될 수 있다.
- liveness 를 결정하는 accounting information 이 계산된다.
- liveness informatin 은 application 이 실행되는 중에 계산된다.
- liveness information 은, evaucation pause 동안에, 어떤 region 들이 환원(reclaim) 되는 것이 제일 좋은지 구별한다.
- CMS 같은 sweeping phase 가 없다.
Remark Phase
- heap 에 있는 live object 의 marking 을 완료한다.
- 완전하게 비어있는 region 들은 환원된다.(reclaimed)
- Snapshot-at-the-Begging(SATB) 알고리즘을 사용한다. 이것은 CMS 에서 사용되던 것보다 더 빠르다.
- 모든 region 에 대한 liveness 를 계산한다.
Copying/Cleanup Phase
- live object들과 완전히 빈 region에 대한 accounting을 수행한다.(Stop the world)
- Remembered Sets 를 정리한다.(Stop the world)
- 빈 region들을 초기화하고 그것들을 free list에 반환한다.
- young generation 과 old generation 은 동시에 환원된다.
- old generation region 들은 그들의 liveness 에 기반해서 선택된다.
- G1 은 가장 낮은 liveness 를 가진 region들을 선택한다.
- 이 region 들은 가장 빠르게 collect 된다.
- 그리고 나서 이 region들은 young GC 가 수행되는 시간에 같이 실행돼서 collected 된다.
- 이것은 log에
[GC pause (mixed)]
라고 표시된다.
선택된 region 들은 collected되고, 어두운파랑색 region 과 어두녹색 region 으로 compacted된 상태다.
댓글 없음:
댓글 쓰기