Skip to content

Commit

Permalink
add: G1 GC 및 Z GC 관련 설명 보강 (#15)
Browse files Browse the repository at this point in the history
  • Loading branch information
nmin11 authored Jan 31, 2024
1 parent fc8eae5 commit 0931856
Showing 1 changed file with 37 additions and 5 deletions.
42 changes: 37 additions & 5 deletions ch06/남궁민.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@ backgroundColor: #fff
backgroundImage: url('https://marp.app/assets/hero-background.jpg')
---

# 주요 GC 알고리즘들 알아보기

⎯ 남궁민

---

## Serial GC

- 가장 단순한 GC 구현체
Expand All @@ -30,7 +36,7 @@ java -XX:+UseSerialGC
- GC 처리율 최대화
- **힙 공간을 관리하기 위해 멀티 스레드 사용**
- 메모리가 충분하고 코어 개수가 많을 때 유리
- 하지만 역시나 GC 수행 시 전체 애플리케이션에 대한 STW 발생
- 하지만 GC 수행 시 전체 애플리케이션에 대한 STW 발생은 피할 수 없음
- 애플리케이션을 모두 중단시킨 다음 가용 CPU 코어를 총동원해 가능한 한 빨리 메모리를 수집

---
Expand Down Expand Up @@ -84,6 +90,10 @@ java -XX:+UseParallelOldGC
- compaction 단계가 없어서 메모리 단편화가 발생할 수 있음
- 조각난 메모리가 많아 compaction 작업을 할 경우 STW 시간이 훨씬 더 길어짐

```bash
java -XX:+UseConcMarkSweepGC
```

---

## G1 GC
Expand All @@ -107,6 +117,16 @@ java -XX:+UseParallelOldGC

---

**RSet**

![rset](https://github.com/nmin11/TIL/assets/75058239/ce68836b-8673-46cc-b60e-cc18fe8829f5)

- 영역별로 하나씩 존재하는, 외부에서 힙 영역 내부를 참조하기 위한 레퍼런스 관리 장치
- floating garbage를 추적하기 위한 용도
- `floating garbage`: 이미 죽은 객체가 참조하는 객체여서 살아있는 것처럼 보이는 객체

---

### Minor GC

- Eden 영역이 꽉 차면 수행
Expand Down Expand Up @@ -161,12 +181,14 @@ java -XX:+UseG1GC
---

- 객체를 가리키는 변수의 포인터에서 64bit 메모리를 활용해서 객체 상태값을 저장
- 이를 위해 64bit 운영체제에서만 사용 가능
- 그렇기 때문에 64bit 운영체제에서만 사용 가능
- 42bit는 객체의 주소값으로 활용
- 4bit는 객체의 상태값을 표현
- Finalizable: finalizer를 통해서만 접근 가능한 객체 (가비지)
- Remapped: 객체의 재배치 여부를 표시
- Marked 1 / 0: 접근 가능한 객체를 표시
- 가상 주소와 물리 주소 매핑 연산 절약을 위해 모든 가상 주소에 대해 mmap(multi-mapping) 실행
- 이로 인해 메모리 사용량이 3배 증가

---

Expand All @@ -177,15 +199,25 @@ java -XX:+UseG1GC
---

- 객체를 참조할 때 실행되는 코드
- 힙에 있는 객체가 참조할 수 있는 상태인지 검사
- 문제가 있는 경우 slow path라는 과정을 실행한 후 참조 진행
- 참조하기 이전에 방어막으로 막아준다는 이미지로 연상하면 이해하기 쉬울 것
- G1 GC와 다르게 메모리 재배치 과정에서 STW가 발생하지 않게 해줌
- RemapMark와 RellocationSet을 확인하면서 참조와 mark를 업데이트
- Remap Mark와 Rellocation Set을 확인하면서 참조와 mark를 업데이트

---

- GC 수행 단계
- `Pause` Mark Start 단계: ZGC의 루트에서 가리키는 객체 Mark 표시 (Live Object)
- 각 스레드가 자신의 로컬 변수를 스캔해서 GC 루트 셋을 만듦 (매우 짧은 STW)
- Concurrent Mark/Remap 단계: 객체의 참조를 탐색하며 모든 객체에 Mark 표시
- GC 루트에서 접근 가능한 객체에 대한 coloring 및 remapping 실행
- `Pause` Mark End 단계: 새로 들어온 객체들에 대한 Mark 표시
- Concurrent Pereare for Relocate 단계: 재배치할 영역을 찾아서 RelocationSet에 배치
- Concurrent Pereare for Relocate 단계: 재배치할 영역을 찾아서 Relocation Set에 배치
- Relocation Set: 가비지가 하나라도 있는 ZPage의 집합
- `Pause` Relocate Start 단계: 모든 루트 참조의 재배치를 진행하고 업데이트
- Concurrent Relocate 단계: Load barriers를 사용해서 모든 객체를 재배치하고 참조를 수정
- Concurrent Relocate 단계: Load barriers를 사용해서 모든 객체 재배치 후 참조 수정
- 포워딩 테이블을 사용해서 객체의 주소를 업데이트

---

Expand Down

0 comments on commit 0931856

Please sign in to comment.