[JVM] G1 Collector - GC Log

2021. 12. 16. 15:11 JAVA/JVM

G1(Garbage First) 이해하기
힙을 디폴트 2048개의 영역으로 나누어서 영역마다 가비지 컬렉을 실행한다.
각 영역은 영, 올드 제너레이션 어떤 용도든지 사용될 수 있다. 
각 영역은 서로 인접할 필요 없다.
영역을 많이 나눔으로써, 미참조 객체를 일부 영역들에 모아서 남겨둘 수 있다.
따라서 가비지만 모인 영역들만 집중적으로 처리하여 가비지 컬렉을 빠르게 끝낼 수 있다.
가비지를 우선(Garbage First, G1)이다.

G1 기본동작
1) Minor GC : Stop-the-world를 발생시킴
2) Concurrent GC 
    2-1) 표시 
    2-2) 혼합 컬렉션
3) Full GC : 피하는 것이 목적

1) Minor GC
- 빈 공간은 어디에도 속하지 않는다. G1이 필요하다고 생각하면 아무렇게나 사용한다
- E 에덴 영역이 가득차면 Minor GC가 시작된다
- E 영역중 일부는 Survivor로 이동하고, 영 제너레이션의 일부는 올드로 이동한다. 나머지는 폐기처분.

G1 - Minor GC
G1 - Minor GC Log

2) Concurrent GC
2-1) Mark - 표시 단계
- 표시 단계 전 후의 힙 메모리는 다음과 같다.

- 표시 단계 동안 적어도 한번의 Minor GC가 발생하여 E, S영역이 처리된다. 
- 일부 영역은 X 로 표시 ==> 올드 제너레이션에 속하며, 주로 가비지를 포함한다고 확인된 영역
- O,X로 표시된 올드 제너레이션은 완료 후 더 점유율이 증가한다.
- 표시 단계 동안 Minor GC 로 인해 올드 제너레이션으로 데이터를 승격시키기 때문.
- 게다가 표시 단계에서는 올드 제너레이션의 데이터를 해제시키지 않고 그저 가비지 영역을 표시만 한다. 이 영역의 데이터는 다음 단계 때 해제된다. 
- 표시단계는 몇 가지 단계로 구성되며, 일부 단계에서는 Stop-the-world가 발생한다

Step 1. Initial-Mark (초기 표시)
- 부분적으로 Minor GC 가 발생하여 모든 어플리케이션 스레드가 중단된다. 
- 초기 표시 단계에서는 모든 어플리케이션 스레드를 멈출 필요가 있다. G1은 중단시키기 위해 Minor GC를 활용한다. 

Log - Initial-Mark

Step 2. Root region scan (루트 영역 스캔)
- 백그라운드만 돌아간다. 중단현상이 발생하지 않는다. 
- Minor GC에 의해 중단될 수 없다
   ==> 루트 영역을 살펴보는 동안 Minor GC가 발생하면, Minor GC는 기다려야 한다. (튜닝 필요)

Log - Root region scan

Step 3. Concurrent-Mark (병렬 표시)
- 백그라운드에서 돌아간다. 하지만 Minor GC에 의해 중단될 수 있다. 

Log - Concurrent Mark


Step 4. Remarking
Step 5. Normal cleanup
- 짧지만, 어플리케이션 스레드를 멈춘다. 
Step 6. Concurrent cleanup

Log - Step4,5,6

여기까지가 표시단계이다. 표시만 했지, 사실상 거의 해제되지 않는다.  
해제는 다음 단계에서 일어난다. 

2-2) Mixed GC (혼합 GC)
- Minor GC 를 수행하지만, 표시단계에서 표시된 X 영역도 같이 수집한다.
- 표시 영역 거의 전부가 수집될 때 까지 혼합 GC 단계는 계속 반복된다.

Log - Mixed GC