hyeonga_code

JVM_13_G1 GC 동작 과정 본문

JVM

JVM_13_G1 GC 동작 과정

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

 

 

JVM_17_GC 다시 알기 (수정사항)

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

hyeonga493.tistory.com

G1 GC 동작 과정

1. 초기 마크 Initial Mark

일반적으로 Minor GC와 함께 발생합니다.
Young Generation의 객체를 대상으로 하며 초기 마크 단계에서 GC 루트에서 직접 접근이 가능한 객체들과 젊은 세대에서 살아남은 객체들을 마킹합니다.


`Stop-the-World` 가 발생합니다. 
    > 짧은 시간동안 일어나며 G1은 모든 라이브 객체를 신속하게 식별합니다.

 

2. 루트 영역 스캔 Root Region Scanning

초기 마크 단계 이후 G1 GC의 Young 영역의 reachable 객체가 참조하는 Old 영역의 객체를 식별합니다.
애플리케이션이 실행되는 동안 병렬적으로 수행됩니다.
다음 Young Generation의 GC가 동작하기 전에 완료되어야 합니다. > 정확한 GC를 보장하기 위함입니다.

 

3. 동시 마크 Concurrent Marking

전체 힙을 스캔하여 각 영역에서 사용중인 객체를 마킹합니다.
애플리케이션의 실행과 동시에 수행됩니다.
객체 그래프를 추적하여 접근이 가능한 모든 객체를 식별합니다.
애플리케이션의 성능에 최소한의 영향을 미치도록 설계되어 있습니다.

 

4. 재마크 Remark

동시 마크 단계에서 변경된 객체 참조를 처리합니다.
`Stop-the-World` 를 발생시킵니다. 


SATB 마킹 알고리즘을 사용하여 변경된 객체를 재마크합니다.
동시 마크의 정확도를 향상시키기 위해 필요합니다.
STW 시간을 최소화 하면서 정확성을 높입니다.

 


SATB Snapshot At The Beginning
마킹 사이클이 시작될 때 힙 메모리에 있는 살아 있는 객체의 set을 `logical snapshot`으로 저장합니다. 
이 `logical snapshot`은 시작 시점의 기존 힙 상태를 복사하므로 이후 변경되는 정보를 포함하지 않습니다.

새로 추가된 객체나 수정된 객체를 추적하기 위해 애플리케이션 스레드가 작성하는 모든 포인터를 가로채 `remembered set` 자료구조를 사용하여 처리합니다.

remembered set
애플리케이션 스레드가 작성하는 포인터를 가지고 있는데 포인터가 가리키는 객체가 힙에서 다른 영역으로 이동하거나 아예 사라져도 포인터가 가리키는 객체를 살아 있는 객체로 추적할 수 있게 합니다.

 

5. 정리 Cleanup

GC는 마킹된 결과를 기반으로 더 이상 사용하지 않는 객체가 있는 영역을 식별하여 정리합니다.
완전히 비어 있는 영역은 즉시 회수합니다.
필요에 따라 빠르게 회수할 수 있는 영역의 정보를 제공합니다.
이 정보를 사용하여 다음 GC 사이클의 회수 대상 영역을 결정합니다.

 

다음 단계인 Space Reclamation 단계가 실행될 것인지를 결정합니다.
지워야하는 객체가 없는 경우 생략합니다.
있는 경우 Young-only 단계는 Single Prepare Mixed Young Collection으로 전환됩니다.

반응형

'JVM' 카테고리의 다른 글

JVM_15_Stop the World 일시적인 정지  (0) 2024.05.10
JVM_14_Space Reclamation  (0) 2024.05.10
JVM_12_G1 GC  (0) 2024.05.10
JVM_11_GC 알고리즘 힙의 세분화 Minor GC, Major GC, Mixed GC  (0) 2024.05.10
JVM_10_정적 로딩과 동적 로딩  (0) 2024.05.08