generated from Learning-Is-Vital-In-Development/study-template
-
Notifications
You must be signed in to change notification settings - Fork 6
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
49 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
# G1GC 정리 | ||
|
||
💡 G1 GC는 LTS 버전인 Java 11 부터는 **Default GC**로 사용된다. | ||
|
||
**G1 GC란?** | ||
- G1(Garbage-First) GC는 대용량의 메모리를 갖는 멀티프로세서 머신을 대상으로 한다. | ||
- 최소한의 구성으로 높은 처리량을 달성하면서 높은 확률로 GC STW 목표를 달성하려고 시도한다. | ||
|
||
|
||
|
||
## G1GC가 적절한 상황 | ||
|
||
- Heap Size가 **10GB** 이상이고, Heap의 **50% 이상**이 살아있는 객체로 채워지는 경우 | ||
- 객체의 할당률과 승격이 매우 **가변적인** 경우 | ||
- Heap에 **파편화**가 많이 발생할 경우 | ||
- 목표 STW(Stop-The-World)가 **수백 ms 미만**인 경우 | ||
|
||
## G1GC의 Heap 구성 | ||
|
||
- 이전 세대의 Heap과 똑같이 Eden, Survivor, Old 영역으로 구성되어있다 | ||
- 각 영역간의 배치가 연속적이지 않고 Region이라는 작은 단위로 구성되어 있다. | ||
|
||
<img width="600" alt="스크린샷 2024-01-31 오후 7 09 48" src="https://github.com/CMC11th-Melly/Melly_Server/assets/82302520/8217e4f5-fb3b-4a38-8d01-3421ab91c773"> | ||
"> | ||
|
||
## G1GC의 전체 사이클 | ||
|
||
- G1 GC는 Young-only Phase와 Space Reclamation Phase를 반복한다. | ||
|
||
<img width="600" alt="스크린샷 2024-01-31 오후 7 09 48" src="https://github.com/CMC11th-Melly/Melly_Server/assets/82302520/80b26dbf-0756-427f-aecf-6ca836f6b139"> | ||
|
||
### Young-Only Phase | ||
|
||
- Young Only Phase는 처음에 Young 영역에서 Old 영역으로 Live 객체를 방출하는 Minor GC를 반복한다. 그러다가 Old 영역에 Initial Heap Occupancy threshold까지 객체가 쌓이게 되면 Initial Marking(초기 마킹) 단계에 들어간다. 이때, Default Threshold는 **Old 영역의 45%**이다. | ||
- **Initial Marking** 단계에 들어서면 일반적인 Minor GC 작업과 함께 Marking 작업을 수행한다. Marking 작업은 **Remark**와 **Cleanup** 이라는 두 STW와 함께 종료된다. Old 영역에서 참조하는 Survivor 영역을 마킹한다. | ||
- **Concurrent Marking** 단계에서는 Old 영역 내에 생존한 모든 객체를 마킹한다. 애플리케이션 스레드와 함께 동작하고 모든 객체가 Garbage 상태인 리전을 표시한다. | ||
- **Remark** 단계에서는 Concurrent Marking 단계에서 빈 영역이라고 표시한 곳을 바로 회수하고 STW가 발생한다.(Garbage 영역을 바로 바로 회수하기에 Garbage First 라는 이름이 붙여짐). 또한 Concurrent Marking 단계에서 하던 마킹 작업을 마저 끝내는 단계이다. | ||
- **Cleanup** 단계에서는 STW(Stop The World)가 발생하며, 살아있는 객체 비율이 낮은 영역부터 순차적으로 수거해나간다. 이후 Space-Reclamation 단계로 넘어갈지를 판단한다. | ||
|
||
### Space-reclamation Phase | ||
|
||
- Young 영역의 Minor GC와 Old 영역의 가비지가 함께 수집되는 **Mixed GC**가 진행된다. | ||
- Mixed GC는 **중단 시간을 단축** 시키기 위해 기본적으로 **8회**를 분할해서 수행된다. | ||
|
||
## G1GC와 다른 GC들의 차이점 | ||
|
||
- Parallel GC는 Old 영역에 대한 컴팩션과 회수 작업을 전체적으로 실행한다. 이 방식은 STW 시간을 길어지게 만드는 단점이 있다. G1 GC는 이 작업을 **여러번의 짧은 컬렉션 작업**으로 나눴다. 이 방식은 처리량을 조금 희생하더라도 더 짧은 STW 시간을 보장해준다. | ||
- CMS와 G1는 둘다 **Concurrent GC**이다. CMS는 컴팩션 작업이 없기 때문에 메모리 단편화가 발생하지만 G1 GC는 **Old 영역에 대한 컴팩션을 수행**한다. | ||
- G1 GC는 Garbage만 가득 차있는 영역을 GC 과정 중간중간에 미리 회수함으로써 불필요한 GC를 최대한 줄이는 방향으로 최적화를 했다. |