[배경]
java를 공부하던 중 GC 과정에 관심이 생겨 열심히 구글링 하던중 java9 부터는 G1GC가 기본값으로 들어가는 만큼 이전 GC 와 뭐가 다르고 어떤 차이가 있는지 알아보겠습니다.
G1GC에 대한 간단한 소개
G1GC (Garbage First Garbage Collector)는 대용량의 메모리가 있는 멀티 프로세서 시스템을 위해 제작되었습니다.
빠른 처리 속도를 달성하면서 일시 중지 시간(STW : Stop The World)의 최소화를 충족시키기는 것이 G1GC의 목표입니다.
오라클에서는 여러 기술들을 도입하여 이 목표를 수행할 수 있게 설계하였다고 소개하고 있습니다.
Heap은 동일한 크기(메모리 크기에 따라 상이)의 영역으로 나뉘어 집합으로 분할되어 연속된 가상 메모리로 존재하게 됩니다.
일시 중지 시간을 최소화 하는 것이 목표라는 것에서 유추할 수 있듯이 G1GC도 STW를 완전히 없애지는 못합니다.
[G1GC(Garbage-First Garbage Collector)]
- CMS GC를 대체하기 위해서 만들어 졌습니다.
- JDK 7에서 정식으로 G1 GC를 포함하여 제공되었고 JDK 9부터 G1GC가 default로 제공됩니다.
- 많은 양의 메모리가 있는 다중 프로세서 시스템을 대상으로 합니다.
장점
- stop-the-world 없이도 여유 메모리 공간을 압축하는 기능을 제공합니다.
- 해당 세대의 일부분에 대해서만 압축합니다.
- Heap 크기가 클수록 잘 동작합니다.
- CMS에 비해 개선된 알고리즘을 사용하고, 처리 속도가 더 빠릅니다.
- Garbage로 가득찬 역역을 빠르게 회수하여 빈 공간을 확보하므로 GC 빈도가 줄어듭니다.
단점
- 공간 부족 상태를 조심해야 합니다.
(Minor GC, Major GC를 수행하고 나서도 여유 공간이 부족한 경우)- Full GC가 발생하는데 Single Thread로 동작하며 이것은 heap 영역 전반적으로 GC가 발생한다는 것입니다.
- 작은 Heap 공간을 가지는 애플리케이션에서는 제 성능을 발휘하지 못하고 Full GC가 발생합니다.
- 크기의 50%를 초과하는 큰 객체를 저장하기 위한 공간인 Humonogous 영역은 제대로 최적화되지 않으므로 해당 영역이 많으면 성능이 떨어집니다.
G1GC의 Heap 구조
- Humonogous : Region 크기의 50%를 초과하는 큰 객체를 저장하기 위한 공간
- Available/Unused : 아직 사용되지 않은 Regio
(출처: https://youn0111.tistory.com/67)
G1GC의 Cycle
G1GC는 위 그림처럼 Young-only Phase와 Space Reclamation Phase를 반복합니다.
사이클중 모든 원은 stop-the-world가 발생한 것을 나타낸 것이고, 원의 크기에 따라 소요 시간이 달라진다고 보면 됩니다.
파란 원은 Minor GC(=Young GC, Evacuation Phuse)가 진행함에따라 stop-the-world가 발생합니다.
주황 원은 Major GC(=Old GC, ConcurrentCycle)이 진행하면서 객체를 마킹 및 기타 과정을 하기 위해 stop-the-world가 발생합니다.
빨간 원은 Mixed GC를 진행함에 따라 stop-the-world가 발생 합니다.
Minor GC
연속되지 않은 메모리 공간에 Young Generation이 Region 단위로 메모리에 할당되어 있습니다.
Young Generation에 있는 유효 객체를 Survivor Region이나 Old Generation으로 copy 또는 move를 합니다.
이 단계에서 stop-the-world가 발생하고 Eden Region과 Survivor Region의 크기는 다음 Minor GC를 위해 다시 계산됩니다.
Minor GC를 마치고 나면 Eden영역에서 Survivor영역으로 이동하거나 Survivor영역에서 Suvrivor영역으로 이동했다는 청록색 영역이 생깁니다.
Major GC(Old GC)
G1의 Old GC는 5개의 과정이 존재합니다.
- Initial Mark
- Root Area Scan
- Concurren Mark
- Remark
- Copy / CleanUP
Initial Mark
Initial Mark 단계는 Survivor 영역에서 Old 영역을 참조하고 있을 수 있는 영역들을 마킹합니다.
Survivor 영역을 마킹하는 단계이기 때문에 Minor GC에 의존적이며, stop-the-world가 발생합니다.
Root Area Scan
Initial Mark 단계에서 찾은 Survivor Region에 대한 GC 대상을 식별합니다.
멀티 쓰레드로 동작하여 Minor GC가 발생하기 전에 동작을 완료합니다.
Concurrent Mark
힙 내의 모든 Old 영역에 대해 GC 대상을 식별합니다.
또한 Region에 모든 객체가 Garbage라 판단되면 Remark 단계에서 즉시 제거됩니다.
stop-the-world를 발생시키지 않지만 Young GC에 의해 중단될 수 있습니다.
Remark
Remark 단계는 Concurrent Mark에서X표시한 영역을 바로 회수하여, stop-the-world가 발생합니다.
또한, Concurrent Mark 단계에서 작업하던 Mark를 이어서 작업하여 완전히 끝내버립니다.
이때 Snapshot-At-The-Beginnig (stop-the-world 이후 살아있는 객체에만 마킹하는 알고리즘) 기법을 사용하기 때문에 CMS GC보다 더 빠릅니다.
Copy / CleanUp
stop-the-world가 발생하는 단계로 Remark 단계에서 제거한 Region 이외에 livenless가 가장 낮은 Region을 선택하고 새로운 Region으로 이동 또는 복사합니다.
이 과정은 Old 영역 뿐만 아니라 Young 영역도 포함될 수 있습니다.
After Copy / CleanUp
Copy / Clean Up 단계 이후 새로운 Region으로 이동하고 Compact 되었습니다.
한번에 정리하자면 다음과 같습니다
동작 방식
G1GC에서 Full GC가 수행될 때 Initial Mark ->Root Region Scan -> Concurrent Mark -> Remark -> Cleanup -> Copy 단계를 거치게 된다. 추가적으로, G1GC는 일시 정지 시간을 줄이기 위해 각 스레드가 자신만의 region을 잡고 작업하는 방식으로 병렬 GC를 수행합니다.
- Initial Mark Old Region 에 존재하는 객체들이 참조하는 Survivor Region 을 찾는다. 이 과정에서는 STW 현상이 발생하게 됩니다.
- Root Region Scan Initial Mark 에서 찾은 Survivor Region에 대한 GC 대상 객체 스캔 작업을 진행합니다.
- Concurrent Mark 전체 힙의 Region에 대해 스캔 작업을 진행하며, GC 대상 객체가 발견되지 않은 Region 은 이후 단계를 처리하는데 제외되도록 합니다.
- Remark 애플리케이션을 멈추고(STW) 최종적으로 GC 대상에서 제외될 객체(살아남을 객체)를 식별해냅니다.
- Cleanup 애플리케이션을 멈추고(STW) 살아있는 객체가 가장 적은 Region 에 대한 미사용 객체 제거를 수행합니다. 이후 STW를 끝내고, 앞선 GC 과정에서 완전히 비워진 Region 을 Freelist에 추가하여 재사용될 수 있게 합니다.
- Copy GC 대상 Region이었지만 Cleanup 과정에서 완전히 비워지지 않은 Region의 살아남은 객체들을 새로운(Available/Unused) Region 에 복사하여 Compaction 작업을 수행합니다.
[정리]
이전 GC와 비교했을 때, 고정된 메모리 크기로 각 Generation을 구분했던 것과 달리 힙 영역을 동일한 크기의 Region으로 나누어 관리합니다. G1은 힙 내의 하나 이상의 Region을 단일 Region으로 객체를 복사하는데 이 때 메모리를 압축/해제 시킨다. 다중 프로세서에서 병렬 작동을 통해 STW 시간은 줄리고 처리량은 증가시킵니다. 결론적으로 성능을 향상시키기 위해 STW 시간을 줄이는 목적이 있습니다. 완벽한 프로그램은 없기에 새로운 방식의 GC는 계속나올거로 예상됩니다. ZGC 등등 다음엔 이걸 공부해야 겠습니다.
참고자료
https://youn0111.tistory.com/67
Java Garbage Collection(GC)란 무엇이고 동작방식과 G1GC에 대해
C와 같은 프로그래밍 언어에서 메모리 할당 및 할당 해제는 수동 프로세스입니다. 반면에, Java에서 메모리 할당 해제 프로세스는 Garbage Collection에 의해 자동으로 처리가 됩니다. [기본 프로세스]
youn0111.tistory.com
https://d2.naver.com/helloworld/1329
일반적인 GC 내용과 G1GC (Garbage-First Garbage Collector) 내용
안녕하세요. 일반적인 GC 내용과 G1GC (Garbage-First Garbage Collector) 내용 포스트입니다.오라클의 G1GC (Garbage-Fist Garbage Collector) 내용과 제가 경험했던 내용들을 정리하여 포스팅을 하려고 합니다.JDK 8 (H
thinkground.studio
'java' 카테고리의 다른 글
Java8에 새로 추가된 것은 뭐가 있을까 ?_2 (funtional 패키지, Stream, 디폴트 메서드 등) (2) | 2024.06.10 |
---|---|
jAVA11에 새로 바뀐것들을 알아보자. (0) | 2024.05.29 |
Java8에 새로 추가된 것은 뭐가 있을까 ?_1 (Lambda 표현식, funtional 패키지) (0) | 2024.05.28 |
[JVM] JVM 가장 기본적인 동작 과정 (0) | 2024.04.10 |