티스토리 뷰

JAVA

[GC의 방식] Garbage First (G1) Collector

박중수 2015. 4. 24. 11:20

여태까지의 Garbage Collector는 Young영역과 Heap 영역으로 나뉘었었다.

하지만 이 Colletor는 region이라는 여러 사각형이 모인 바둑판같은 모양의 많은 영역으로

구성되어 있다.


이 region이라는 구역은 약 2천개정도로 각각 크기는 기본 1MB부터 최대 32MB까지 지정가능하다.

이 구역들이 각각 Eden, Survivor, Old의 역할을 번갈아가면서 하고,

Humongous라는 영역도 존재한다.


Young GC의 수행

1. 몇 개의 구역을 선정하여 Young 영역으로 지정

2. 이 구역에 객체가 생성되면서 데이터가 쌓인다.

3. Young 영역으로 할당된 구역에 데이터가 꽉 차면 GC를 수행한다.

4. GC를 수행하고 살아있는 객체만 Survivor 구역으로 이동시킨다.


이렇게 살아남은 객체들이 이동한 구역은 새로운 Survivor 영역이 된다.

그리고 Young GC가 발생하면 계속 이 구역에 쌓는다.

그러면서 여러번의 Young GC후에도 살아있는 객체는 Old영역으로 보낸다.


Old GC의 수행

1. 초기표시 : Old에 있는 객체에서 Survivor의 객체를 참조하는 객체를 표시

2. 기본구역스캔 : Young GC가 일어나기 전에 Old 참조를 위해 Survivor을 훑는다.

3. Concurrent 표시 : 전체 힙 영역에 살아있는 객체를 찾는다. 이 때 Young GC가 발생하면 잠시 멈춘다.

4. 재표시 : 힙에 살아있는 객체들의 표시작업을 완료한다. 이 때 Snapshot-at-type-beggining 알고리즘을

             사용하며 이는 CMS GC에서 사용하는 방식보다 빠르다.

5. 청소 : 살아있는 객체와 비어있는 구역을 식별하고 필요없는 객체를 지운 다음 비어있는 구역을 초기화한다.

6. 복사 : 살아있는 객체를 비어있는 구역으로 모은다.


이 중 1,4,5,6 단계는 Stop-the-world가 발생한다.

이 콜렉터는 성능이 매우 빠르지만, 아직 안정화가 되지 않았기에

무작정 사용하면 장애를 일으킬 가능성도 있다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함