- Stop The World
- Mark and Sweep
- 가비지 컬렉션을 실행하기 위해 JVM이 어플리케이션의 실행을 멈추는 작업
- 가비지 컬렉션 실행 시 가비지 컬렉션을 실행하기 위한 스레드를 제외한 모든 스레드 중지, 가비지 컬렉션 종료 후 기존 스레드 재개
- Mark: 사용되는 메모리 식별(mark)
- Sweep: 식별되지 않은(un_marked) 메모리 제거
- GC의 Stop the World에 의해 어플리케이션이 중지되는 문제를 최소화 하기 위해 다양한 GC 알고리즘이 존재
- GC의 Young 영역은 Mark and Sweep의 방식으로 수행, Old 영역에서는 Mark Sweep에 더해 Compact라는 작업이 추가된 Mark Sweep Compact 알고리즘 적용
- CPU 코어가 1개일 때 사용하기 위해 개발된 알고리즘으로 CPU 코어가 여러 개인 운영 서버에서의 사용을 피해야 한다.
Young 영역: 새로 생성된 객체가 할당되는 Eden 영역 + 최소 1번의 GC 작업에서 생존한 객체가
복사되어 존재하는 영역
Old 영역: Young 영역에서 반복하여 살아남은 객체가 존재하는 영역(Survivor 영역에서 이동됨)
Compact: Heap 영역을 정리하기 위한 단계로 유요한 객체들이 연속되게 쌓이도록 힙의 가장 앞 부분부터
채워서 객체가 존재하는 부분과 객체가 존재하지 않는 부분으로 나누는 작업
- Serial GC와 처리 과정은 동일하지만 여러개의 쓰레드를 통해 GC를 수행하여 GC 오버헤드를 감소
- Java8까지 기본 가비지 컬렉터로 사용
- Parallel GC Old 영역에서의 GC 알고리즘인 Mark Sweep Comapct가 아닌 GC를 수행한 영역에 대해 살아있는 객체를 식별하는 Summary 단계가 추가
- CMS GC는 Parallel GC와 동일하게 여러 개의 쓰레드를 사용하며, Mark Sweep을 Concurrent하게 수행한다.
- 어플리케이션이 실행 중일 때에는 프로세서 자원을 공유하여 이용하기 때문에 다른 GC 알고리즘 보다 메모리와 CPU를 많이 사용함
- Java14부터 사용 중단
-
똑같이 객체를 Eden 영역에 할당하고 Survivor로 카피하는 과정은 같지만 물리적으로 메모리 공간을 나누는 것이 아닌 Region이라는 개념을 도입해 Heap 영역을 균등하게 나눠 각 지역을 역할에 맞게 논리적으로 구분하여 객체를 할당
-
Eden, Survivor, Old, Humonogous, Availalbe/Unused 역할 존재
-
Heap을 동일한 크기의 Region으로 나누고 가비지가 많은 Region을 우선적으로 GC 수행
-
Java9부터 기본 가비지 컬렉터로 사용
-
G1 GC와 다른 알고리즘들과의 차이
- 다른 알고리즘들은 Old 영역 전체적으로만 GC를 수행해 메모리를 회수하지만, G1은 이 작업을 훨씬 더 짧게 여러 컬렉션(영역)에 점진적으로 수행하여 적은 처리량 비용으로 일시 중지 시간이 크게 단축시킬 수 있다.
- CMS GC와 유사하게 G1은 메모리 회수 작업을 동시에 수행한다. 하지만 CMS는 Compaction 작업을 수행하지 않아 결국 긴 Full GC로 실행됨.
Humonogous: Region 크기의 절반을 초과하는 객체를 저장하는 Region
Available/Unused: 사용되지 않은 Region
- Stop The World의 시간이 10ms 이상 초과하지 않으며 비용이 많이 드는 작업들을 동시에 수행하는 GC
- 기존의 Region을 동적으로 생성/삭제되며 2MB의 배수 형태로 관리되는 ZPage로 정의하여 사용
![스크린샷 2023-07-31 21 07 33](https://private-user-images.githubusercontent.com/106325839/257213648-3ba203ad-51d2-40f0-a1ed-c04618ccd948.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjA0Nzk1ODYsIm5iZiI6MTcyMDQ3OTI4NiwicGF0aCI6Ii8xMDYzMjU4MzkvMjU3MjEzNjQ4LTNiYTIwM2FkLTUxZDItNDBmMC1hMWVkLWMwNDYxOGNjZDk0OC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwNzA4JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDcwOFQyMjU0NDZaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0xZGEyOWJiMWYyMDk0NmFmNmNkYWM0Nzc2YjdjNWJiMjE3OWMzNjgzY2FiOGQwZGJhOTVmNWM1NzIxNTgyMzVjJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.Iv3bUmGtjJ1s_4H7Xyh89IBAdu-o6WT8H7Oj5OcRu7c)
Reference Coloring(Colored Pointer): ConcurrentGC를 사용해 객체의 GC 메타데이터를 객체 주소에 저장하는 작업
Load Barrier(GC Barrier): JIT를 사용해서 GC를 돕기 위해 작은 코드를 주입
- 나눠진 리전의 점유 임계값을 기준으로 점유 임계값을 초과하면 GC 대상으로 판단
- 점유 임계값은 GC 수집을 위해 고려되기 전 라이브 데이터로 채워질 수 있는 리전 크기의 백분율료 기본값은 최신 자바 버전 기준으로 리전 크기의 45퍼센트로 설정된다
- 영역보다 큰 객체를 G1GC에서는 거대한 객체로 간주해 Humongous Handling이라는 매거니즘을 이용해 관리한다.
Humongous Handling:
- 거대한 객체를 수용하기 위한 Humonogous Region(HRegion)으로 지정
- 거대한 객체의 메타데이터 기록
- HR 승격
- 마킹
- 거대한 객체 수거를 위한 Humongous Objects Collection 주기를 수행
- 메모리 압축