[JVM] G1 Collector - GC Log
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로 이동하고, 영 제너레이션의 일부는 올드로 이동한다. 나머지는 폐기처분.
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를 활용한다.
Step 2. Root region scan (루트 영역 스캔)
- 백그라운드만 돌아간다. 중단현상이 발생하지 않는다.
- Minor GC에 의해 중단될 수 없다
==> 루트 영역을 살펴보는 동안 Minor GC가 발생하면, Minor GC는 기다려야 한다. (튜닝 필요)
Step 3. Concurrent-Mark (병렬 표시)
- 백그라운드에서 돌아간다. 하지만 Minor GC에 의해 중단될 수 있다.
Step 4. Remarking
Step 5. Normal cleanup
- 짧지만, 어플리케이션 스레드를 멈춘다.
Step 6. Concurrent cleanup
여기까지가 표시단계이다. 표시만 했지, 사실상 거의 해제되지 않는다.
해제는 다음 단계에서 일어난다.
2-2) Mixed GC (혼합 GC)
- Minor GC 를 수행하지만, 표시단계에서 표시된 X 영역도 같이 수집한다.
- 표시 영역 거의 전부가 수집될 때 까지 혼합 GC 단계는 계속 반복된다.
'JAVA > JVM' 카테고리의 다른 글
[JVM] JMC, JFR - 기본적인 사용법 (0) | 2021.12.16 |
---|---|
[JVM] G1 Collector - Survivor 튜닝하기 (0) | 2021.12.16 |
[JVM] G1 Collector - 기본 튜닝 (0) | 2021.12.16 |
[JVM] G1 Collector - Full GC 발생하는 상황 (0) | 2021.12.16 |
[JVM] CMS Collector - PERM 튜닝 (0) | 2021.12.16 |
[JVM] CMS Collector - 힙 사이즈 / Concurrent Mode 튜닝하기 (0) | 2021.12.16 |
[JVM] CMS Collector - GC Log (0) | 2021.12.16 |
[JVM] Throughput Collector - 힙 사이즈 튜닝하기 (0) | 2021.12.16 |