본문 바로가기
👨‍🏫Study/JAVA

[JAVA] G1GC

by 코푸는 개발자 2022. 4. 20.
728x90

G1GC

G1GC는 JDK 11 부터 공식적인 GC 알고리즘으로 적용되었고, 하드웨어가 점점 발전하면서 대용량 메모리에 적합한 솔루션을 제공하기 위해 나타났다.

G1GC는  Eden, Survivor, Old 영역이 존재하지만, 해당 영역은 고정된 크기가 아니며 전체 Heap 메모리 영역을 Region 이라는 특정한 크기로 나눈 것이고 Region의 상태에 따라 그 Region의 역할(Eden, Survivor, Old)가 동적으로 변동한다.

Region은 기본적으로 (전체 Heap 메모리) / 2048 로 default 값이 지정되어있다.

 

  • Humonogous: Region 크기의 50%를 초과하는 큰 객체를 저장하기 위한 공간
  • Available/Unused: 아직 사용되지 않은 Region

G1GC에서도 마찬기자로 Minor GC가 존재하며, 해당 과정에서 살아남은 객체들을 Survivor Region으로 옮기고, Eden에 대한 영역을 사용가능한(Available) Region 으로 돌리는 형태로 과정이 일어나게 된다.

반면 G1GC 에는 Full GC 와 유사한 Concurrent Cycle 이라는 과정이 존재하는데, 해당 과정은 IHOP(Initiating Heap Occupancy Percent) 에서 정한 수치를 초과하면 실행하게 된다.

G1GC 과정

Initial Mark : Old Region에 존재하는 객체들이 참조하는 Survivor Region을 찾는다.(STW)

Root Region Scan : 위에서 찾은 Survivor 객체들에 대한 스캔 작업을 실시한다.

Concurrent Mark : 전체 Heap의 scan 작업을 실시하고, GC 대상 객체가 발견되지 않은 Region은 이후 단계를 제외한다.

Remark : 애플리케이션을 멈추고(STW) 최종적으로 GC 대상에서 제외할 객체를 식별한다.

Cleanup : 애플리케이션을 멈추고(STW) 살아있는 객체가 가장 적은 Region에 대한 미사용 객체를 제거한다.

Copy : GC 대상의 Region이었지만, Cleanup 과정에서 완전히 비워지지 않은 Region의 살아남은 객체들을 새로운 Region(Available/Unused) Region에 복사하여 Compaction을 수행한다.

살아있는 객체가 아주 적은 Old 영역에 대해 [GC pause(mixed)]를 로그로 표시하고, Young GC가 이루어질 때 수집되도록 한다.

 

튜닝 포인트

우선 무엇인가를 바꾸기 전에 항상 성능테이스 + 로그 옵션을 켜야한다.

-Xlog:gc*:gc.log 옵션으로 로그를 활성화해서 파일로 옮기는 것도 하면 좋다.

튜닝을 한다는 목정은 GC에 걸리는 시간을 최소화하는 목적으로 하면 해주면 좋다.

-XX: InitiatingHeapOccupancyPercent : IHOP 퍼센트 조절(Marking에 해당하는 최저 임계치)

-XX: G1HeapRegionSize : Region 영역당 하나의 사이즈 (default는 (최대 heap) / 2048)

-XX: G1ReservePercent=10 : 공간 overflow의 위험을 줄이기 위해 항상 여유 공간을 유지할 예비 메모리(백분율)

 

하지만 언제까지나 GC튜닝은 정말 모든 것을 다해보고 마지막에 하는 최종방안임을 꼭 잊지 말자.

 

728x90

'👨‍🏫Study > JAVA' 카테고리의 다른 글

[JAVA] EJB 추가 정리  (1) 2022.04.22
[JAVA] GC(Garbage Collection) 영역별 데이터 흐름 정리  (0) 2022.04.21
[JAVA] Garbage Collector  (0) 2022.04.19
[JAVA] EJB(Enterprise JavaBeans)  (0) 2022.04.15
[Database] JDBC  (0) 2022.04.14

댓글