hyeonga_code

JVM_12_G1 GC 본문

JVM

JVM_12_G1 GC

hyeonga 2024. 5. 10. 06:59
반응형

 

 

 

JVM_17_GC 다시 알기 (수정사항)

1. GC 는 reachable 만 남기는 것GC 이름대로 unreachable이 중요한 것이 아니라 reachable한 객체를 어떻게 남기는 지가 중요한 것살아있는 객체를 어떻게 살릴것인지가 관건입니다.Oracle의 GC 개발자가 만

hyeonga493.tistory.com

G1 GC

Heap 영역을 구역으로 구분해서 바둑판 형태로 구성합니다.
Heap 영역에 저장되는 객체는 처음에 Young 영역으로 구분되는 구역에 할당합니다.
Young 영역에서 GC가 동작한 이후 살아남은 객체는 Old 영역으로 구분되는 구역에 저장됩니다.

Young 영역에 집중적으로 메모리 확보를 하여 효율적으로 구현할 수 있고 Old 영역에서 간간히 메모리를 확보하여 `Stop-the-World` 시간을 최소화할 수 있습니다.

처리율을 향상시키기 위해 일부 작업에서는 `Stop-the-World` 를 발생시킵니다.
시간이 오래걸리는 전체 힙을 대상으로 하는 마킹 작업은 애플리케이션과 병렬로 처리합니다.

`Stop-the-World` 를 짧게 유지하기 위해 점진적으로 메모리를 회수합니다.


이전 실행한 GC의 결과와 현재 Heap 상태를 기반으로 자동으로 IHOP를 수정합니다.
IHOP를 기준으로 GC가 동작하여 애플리케이션의 상태에 맞게 IHOP를 최적으로 수정해 나가며 올바른 시점에서 Minor GC와 Mixed GC를 실행하고 할당해야 하는 메모리를 효율적으로 선택할 수 있습니다.


IHOP Initial Heap Occupancy Percent
Old 영역에서 GC를 시작할 시점을 결정하는 데 사용됩니다.
Old 영역에서 할당되어 사용 중인 영역 비율을 의미합니다.

IHOP 임계값 : 힙 영역이 일정 수준 이상으로 채워졌을 때 힙 영역에서 Mixed GC를 실행시키기 위한 임계값으로 45%가 default 값입니다.

G1 GC가 마킹하는 동안 소요되는 시간과 Old 영역에서 할당되는 메모리의 양으로 최적의 IHOP를 자동으로 결정하는데 이를 Adaptive IHOP라고 합니다.
-XX:+G1UseAdaptiveIHOP > 사용한다.
-XX:-G1UseAdaptiveIHOP > 사용하지 않는다.

Adaptive IHOP 기능을 사용하고 있는 경우 
-XX:InitiatingHeapOccupancyPercent 값은 관찰 데이터가 부족한 경우에만 유효합니다.

Adaptive IHOP 기능을 사용하지 않는 경우 
-XX:InitiatingHeapOccupancyPercent 값을 지정하면 해당 IHOP 값을 유지하며 
Old 영역의 점유율이 값을 넘기는 경우 Concurrent Start 단계가 트리거됩니다.

 

Old 영역의 메모리가 부족하여 Major GC가 발생한 경우Adaptive IHOP 기능을 사용하는 경우 IHOP 값은 감소합니다.조금 더 빨리 마킹 작업이 실행되고 release 작업이 수행되기 때문입니다.
G1 GC는 동작 중에 할당할 메모리 공간이 충분한 경우 Major GC가 발생하지 않고 Minor GC나 Mixed GC가 동작합니다.

메모리 사용 관리 : 특정 사용량에 도달한 경우 GC가 동작하도록 설정
GC 트리거 : 특정 사용량에 도달한 경우 동시 마크 과정을 시작하여 정리 작업을 예측 가능하게 합니다.
성능 최적화 : 시스템의 메모리 사용 패턴에 따라 가비지 컬렉션의 빈도와 성능을 최적화하는 데 도움이 됩니다.

 

G1 GC가 사용되기 좋은 상황

- 힙 크기가 최대 수십 GB 이상이며 Java 힙의 50% 이상이 살아있는 객체로 채워지는 경우
- 시간이 지남에 따라 객체가 할당되는 allocation이나 GC가 동작해도 살아남아 유지되어 다른 메모리로 복사되는 promotion의 비율이 크게 달라지는 경우
- 수백 밀리초보다 길지 않은 예측 가능한 `Stop-the-World` 를 목표로 하는 경우

 

G1 GC 특징

1. Heap Layout
구역으로 나누어 관리합니다. Young(Eden, Survivor 0, Survivor 1), Old
하나의 구역에 저장하지 못할 정도로 큰 객체는 처음부터 Old 영역에 저장됩니다.

 

 

GC 생명주기

1. Young-only
Old 영역으로 객체를 사용 가능한 메모리에 할당시켜주는 단계입니다.
    Young 영역에 저장된 객체 중 Root space로부터 참조되는 객체들을 Old 영역으로 Promotion하게 됩니다.
    메모리가 회수될 객체를 마킹하고, Space Reclamation 단계를 실행할 지 여부를 결정합니다.
    이는 Old Generation 점유가 특정 임계값인 IHOP 임계값에 도달한 경우 시작합니다.

 


IHOP Initiating Heap Occupancy Percent 임계값
 힙 영역이 일정 수준 이상으로 채워진 경우 힙 영역에서 Mixed GC를 실행하기 위한 threshold값입니다.
    default 45%


    
2. Space Reclamation
G1 GC가 Young 영역에 대해서 GC를 처리하고 Old 영역에서의 GC를 수행하여 메모리를 회수하는 단계입니다.
    Old 영역에 여유 공간이 충분한 경우 지워야 하는 객체가 있어도 메모리를 회수하지 않고 종료합니다.
    
    병렬로 애플리케이션이 동작하는 도중에 만약 여유 공간이 충분하지 않은 경우 STW를 발생시키고 메모리를 압축하여 여유 공간을 확보합니다.
   


정리
G1 GC는 Mixed GC로 메모리를 최적화 하다가 GC 후에도 여유 공간이 부족한 경우 Major GC가 동작하면서 여유 공간을 확보합니다.

 

반응형