๐ GC๋?
GC๋ ์๋ฐ์์ ์ฌ์ฉ๋์ง ์๋ ๊ฐ์ฒด(= ์ฐธ์กฐ๋์ง ์๋ ๊ฐ์ฒด)๋ฅผ Heap ๋ฉ๋ชจ๋ฆฌ์์ ์๋์ผ๋ก ํ์ํ๋ ๊ธฐ๋ฅ์ ๋๋ค.
โ ๋ชฉ์
- ๊ฐ๋ฐ์๊ฐ free()๋ delete ์์ด๋ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์ง
- ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ ์ฑ & ์ ์ง๋ณด์์ฑ ํฅ์
JVM Heap ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ (Generational GC)
Heap
โโโ Young Generation
โ โโโ Eden
โ โโโ Survivor 0
โ โโโ Survivor 1
โโโ Old Generation
| ์์ญ | ์ค๋ช |
|---|---|
| Eden | ๊ฐ์ฒด๊ฐ ์ฒ์ ์์ฑ๋๋ ๊ณต๊ฐ |
| Survivor 0/1 | ์ด์๋จ์ ๊ฐ์ฒด๋ค์ด ์์๋ก ์ด๋ํ๋ ๊ณต๊ฐ |
| Old | ์ฌ๋ฌ ๋ฒ ์ด์๋จ์ ๊ฐ์ฒด๋ค์ด ์ฌ๋ผ๊ฐ๋ ์์ญ |
๐ ๋๋ถ๋ถ์ ๊ฐ์ฒด๋ "๊ธ๋ฐฉ ์ฃฝ๋๋ค"๋ ๊ด์ฐฐ์ ๊ธฐ๋ฐํ ๊ตฌ์กฐ → ์ธ๋๋ณ ๊ด๋ฆฌ
Survivor 0/1 ๋ ๊ฐ๋ก ๋๋๋ ์ด์
- GC ์ฑ๋ฅ์ ๋์ด๊ธฐ ์ํด์์ด๋ค.
- ํด๋น ์ด์ ๋ฅผ ์๊ธฐ ์ํด์๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๋ณต์ฌ ๋์ ๋ฐฉ์์ ๋ํด์ ์์์ผ ํ๋ค.
๐ฆ ๊ฐ๋น์ง ์ปฌ๋ ์ ๋์ ๋ฐฉ์์ ์ ๋ณต์ฌ๋ฅผ ์ฌ์ฉํ๋๊ฐ?
๐ ๋จผ์ : GC์ ํต์ฌ
- “์ด๋ค ๊ฐ์ฒด๋ ๊ณ์ ์ด์์๊ณ , ์ด๋ค ๊ฐ์ฒด๋ ๋ ์ด์ ํ์ ์๋ค”
- ์ด๋ฅผ ํ๋จํ๊ณ ๋ถํ์ํ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํด Heap ๊ณต๊ฐ์ ํ์ํ๋ ๊ฒ์ด GC์ ๋ณธ์ง์ ๋๋ค.
๐ ๊ธฐ๋ณธ์ ์ธ GC ๋์ ํ๋ฆ - ๊ธฐ๋ณธ ๋ฐฉ์
- ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ๋ "Mark and Sweep"
Mark: GC Root์์ ๋๋ฌ ๊ฐ๋ฅํ ๊ฐ์ฒด์ “์ด์์๋ค” ํ์
Sweep: ๋งํฌ๋์ง ์์ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐ
(Optional) Compact: ์ด์๋จ์ ๊ฐ์ฒด๋ฅผ ํ์ชฝ์ผ๋ก ๋ชฐ์ ๋จํธํ ์ ๊ฑฐ
**๐งฉ GC Root๋?**
* GC๋ GC Root์์ ์ถ๋ฐํด ๋๋ฌํ ์ ์๋ ๊ฐ์ฒด๋ง ์ด์์๋ค๊ณ ๊ฐ์ฃผํฉ๋๋ค. ๋๋ฌํ ์ ์๋ ๊ฐ์ฒด๋ Garbage๋ก ์ฒ๋ฆฌ๋์ด ์์ง ๋์์ด ๋ฉ๋๋ค.
| ๊ตฌ๋ถ | ์์ |
| ----------------- | -------------------------------- |
| **์ค๋ ๋ ์คํ ๋ณ์** | ํ์ฌ ์คํ ์ค์ธ ๋ฉ์๋์ ์ง์ญ ๋ณ์ ๋ฐ ํ๋ผ๋ฏธํฐ |
| **์ ์ (static) ๋ณ์** | ํด๋์ค์ ์ ์ธ๋ static ํ๋ |
| **ํด๋์ค ๋ก๋** | ํด๋์ค ๋ก๋ฉ์ ์ฌ์ฉ๋ ๊ฐ์ฒด |
| **JNI ์ฐธ์กฐ** | ๋ค์ดํฐ๋ธ ์ฝ๋์์ ์ฐธ์กฐ ์ค์ธ ๊ฐ์ฒด (JNI ์ ์ญ ๋ ํผ๋ฐ์ค) |
### โ ๊ทธ๋ฐ๋ฐ ๋ฌธ์ ๊ฐ ์๋ค…
* โ "Sweep ๋ฐฉ์"์ ๋ฌธ์ ์
๊ฐ์ฒด๊ฐ ์ฌ๊ธฐ์ ๊ธฐ ํฉ์ด์ง → ๋ฉ๋ชจ๋ฆฌ ๋จํธํ(Fragmentation) // ๋ฆฌ์คํธ ์์ผ๋ก ์๋ค๊ณ ํ์ ๋, 1 4 8 ์ด๋ฐ์์ผ๋ก ์ ์ฅ๋จ. ์ฐ์์ ์ผ๋ก ์ ์ฅ๋๋๊ฒ ์๋๋ผ
๋ค์ ๊ฐ์ฒด๋ฅผ ํ ๋นํ ๋ ๋น ๊ณต๊ฐ์ด ๋ถ์กฑํ๊ฑฐ๋ ๋ถ๊ท์น → ์ฑ๋ฅ ์ ํ // ๋ฉ๋ชจ๋ฆฌ ๋จํธํ ๋๋ฌธ์ ์ด๋ฐ ๋ฌธ์ ๋ฐ์
๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ๊ณ์ ์ถ์ ํ๊ณ , free ๋ชฉ๋ก ์ ์งํด์ผ ํจ → ๋ณต์ก๋ ์ฆ๊ฐ
### โ
๊ทธ๋์ ๋ฑ์ฅํ ๋ณต์ฌ(Copying) ๊ธฐ๋ฐ GC - ์๋ก์ด ๋ฐฉ์
* ์ด์๋จ์ ๊ฐ์ฒด๋ง ํ์ชฝ์ผ๋ก ๋ณต์ฌํด์ Heap์ ์๋ก ์ ๋ฆฌ → ๋จํธํ ์์ด "๊น๋ํ" Heap ์์ฑ
### ๐ง ๋ณต์ฌ ๋ฐฉ์(Copying Collection)์ ๋์
์ ์ฒด ์์ญ์ ๋ ๋ถ๋ถ์ผ๋ก ๋๋: From(์ฝ์ด์ค๊ธฐ), To(์ฐ๊ธฐ - ๋ฐ์ดํฐ ๋ณต์ฌ)
- ๊ฐ์ฒด๊ฐ From ์์ญ์ ์์
- GC ์คํ ์, ์ด์ ์๋ ๊ฐ์ฒด๋ง To ์์ญ์ ๋ณต์ฌ
- GC ์ข ๋ฃ ํ, From ↔ To ์ญํ ๊ต์ฒด (ping-pong)
์ด๋ฌํ ์ด์ ์ ์ํด Survivor 2๊ฐ๊ฐ ํ์ํฉ๋๋ค. ์ฝ๊ธฐ - ์ฐ๊ธฐ ์์ญ
Survivor ์ด ๋ง์ผ ํ๋๋ผ๋ฉด?
| ๋ฌธ์ | ์ค๋ช |
|---|---|
| ๋ฐ์ดํฐ ์ค์ผ | ๊ฐ์ฒด A๋ฅผ ๋ณต์ฌํ๋ ์ค์, A๊ฐ ๋ฎ์ด์์์ง ์ ์์ |
| ์ฐธ์กฐ ๊ผฌ์ | ๊ฐ์ฒด๊ฐ ์ฐธ์กฐํ๋ ๋์์ด ์์ง ์ด๋๋์ง ์์๋๋ฐ ์ฃผ์๊ฐ ๋ฐ๋๋ฉด ์ฐธ์กฐ ์ค๋ฅ ๋ฐ์ |
| ์์กด ํ์ ์ถ์ ๋ถ๊ฐ | ์ด๋์ ์๋์ง, ๋ช ๋ฒ ์ด์๋จ์๋์ง ํ๋จ์ด ๋ชจํธํด์ง |
๐ฏ ๊ทธ๋์ ์ค์ ์๋ฐ GC๋ ์ด๋ป๊ฒ ํ๋๋?
Young ์์ญ → ๋ณต์ฌ ๊ธฐ๋ฐ GC (Minor GC)
- Eden → Survivor0 → Survivor1 → (Promotion) ---- ์ด๋ ์์กด ํ์๋ฅผ ์ถ์ ํด์ Promotion
- ์ด์๋จ์ ๊ฐ์ฒด๋ง ๋ณต์ฌ = ํจ์จ์
- ๋๋ถ๋ถ ๊ฐ์ฒด๋ Young์์ ๊ธ๋ฐฉ ์ฃฝ๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ์ ํฉ
Old ์์ญ → Mark-Sweep-Compact ๊ธฐ๋ฐ GC (Major/Full GC)
- ์ค๋ ์ด์๋จ์ ๊ฐ์ฒด ๋ง์ → ๋๋ถ๋ถ ๋ณต์ฌ ํ์ํจ → ๋นํจ์จ
- Mark - Sweep - Compact(ํ์์)
๐ ์ Young์ ๋ณต์ฌ(Copying), Old๋ Mark-Sweep?
| ํญ๋ชฉ | Young ์์ญ (Minor GC) | Old ์์ญ (Major GC) |
|---|---|---|
| ๊ฐ์ฒด ์๋ช ์ฃผ๊ธฐ | ๋๋ถ๋ถ ๊ธ๋ฐฉ ์ฃฝ์ | ๋๋ถ๋ถ ์ค๋ ์ด์๋จ |
| ํ์ ๋์ | ์ฃฝ์ ๊ฐ์ฒด๊ฐ ๋๋ถ๋ถ | ์ด์ ์๋ ๊ฐ์ฒด๊ฐ ๋๋ถ๋ถ |
| ๋ณต์ฌ ํจ์จ | ์ด์์๋ ๊ฒ๋ง ์์ ๋ณต์ฌ → ๋น ๋ฆ | ๋๋ถ๋ถ ๋ณต์ฌํด์ผ ํด์ ๋นํจ์จ์ |
| GC ์ ๋ต | ๋ณต์ฌ ๊ธฐ๋ฐ | Mark-Sweep(-Compact) |
SWT (Stop - The - World)
๐ก ์ ์
- JVM์ด GC๋ JIT ์ปดํ์ผ ๋ฑ ๋ด๋ถ ์์ ์ ์์ ํ๊ฒ ์ํํ๊ธฐ ์ํด, ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ค๋ ๋๋ฅผ ์ผ์ ์ ์ง์ํค๋ ๊ฒ
๐ ์ธ์ ๋ฐ์ํ๋?
| ์ํฉ | ์ค๋ช |
|---|---|
| Minor GC | Young ์์ญ ์์งํ ๋๋ STW ๋ฐ์ |
| Major / Full GC | Old + ์ ์ฒด Heap ์์ง ์, ๋ ๊ธด ์๊ฐ STW |
| ํด๋์ค ๋ก๋ฉ | ๋์ ํด๋์ค ๋ก๋ฉ ์ |
| JIT ์ปดํ์ผ | ๋ฐ์ดํธ์ฝ๋ → ๋ค์ดํฐ๋ธ ์ฝ๋ ๋ณํ ์ |
๐ ์ ํ์ํ๋?
- GC ์ค ๊ฐ์ฒด๊ฐ ์ฐธ์กฐ ์ด๋, ๋ณต์ฌ, ์ ๊ฑฐ๋๊ธฐ ๋๋ฌธ์ ๋์์ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์คํ๋๋ฉด ๋ฐ์ดํฐ ์ผ๊ด์ฑ ๊นจ์ง
- ๊ทธ๋์ GC๋ ์์ ํ๊ฒ ์ํ๋๋๋ก STW ๋ฐ์์ํด
GC์ ๋ฌธ์ ์
| ๋ฌธ์ | ์ค๋ช |
|---|---|
| STW ์ง์ฐ | GC ์ค ๋ชจ๋ ์ค๋ ๋ ์ ์ง. ์ฌ์ฉ์ ์์ฒญ ์๋ต ์ง์ฐ |
| Full GC ๋น๋ฒ | Old ์์ญ์ด ์์ฃผ ์ฐจ๋ฉด Full GC๊ฐ ์์ฃผ ๋ฐ์ → ์์คํ ๋ฉ์ถค |
| ๋ฉ๋ชจ๋ฆฌ ๋์ | ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ง๋ง ์ฐธ์กฐ๊ฐ ๋จ์์๋ ๊ฐ์ฒด → GC ๋์ ์๋ |
| OOM (OutOfMemoryError) | GC๊ฐ ํด๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ๋ฉด → ์น๋ช ์ ์ค๋ฅ ๋ฐ์ |
| ๋จํธํ | Mark-Sweep๋ง ์ฐ๋ฉด Heap์ ๊ตฌ๋ฉ ์๊น → ํฐ ๊ฐ์ฒด ํ ๋น ์ด๋ ค์ |
๐ ๊ฐ๋น์ง ์ปฌ๋ ํฐ ์ ํ ๊ธฐ์ค
Serial GC
- ๋จ์ผ ์ค๋ ๋๋ก ๋์ํ๋ ๊ฐ๋จํ GC.
- ์์ ์ ํ๋ฆฌ์ผ์ด์ (์ฝ 100MB ์ดํ์ ํ)์ ์คํํ๋ ๋ฐ ์ ํฉ.
- ๋จ์ผ ํ๋ก์ธ์ ํ๊ฒฝ์์ ์ ์ ํ ์ฑ๋ฅ์ ์ ๊ณต.
- ์? → ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ฉํฐ์ฝ์ด ํ๊ฒฝ์์ ๋นํจ์จ์ ์ผ ์ ์๋ค.
Parallel GC
- ์ฌ๋ฌ ๊ฐ์ ์ค๋ ๋๋ฅผ ํ์ฉํ์ฌ GC ์์ ์ ๋ณ๋ ฌ๋ก ์ํ.
- ์๋ฒ ํ๊ฒฝ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ํ๋๋ GC.
- ์งง์ ์๋ต ์๊ฐ๋ณด๋ค๋ ๋์ ์ฒ๋ฆฌ๋(Throughput)์ ๋ชฉํ๋ก ํจ.
G1 (Garbage-First) GC
- Java 9๋ถํฐ ๊ธฐ๋ณธ GC๋ก ์ฌ์ฉ.
- ํ์ ์ฌ๋ฌ ๊ฐ์ ์์ญ์ผ๋ก ๋๋๊ณ , ํ์ํ ํ์๊ฐ ํฐ ์์ญ์ ์ฐ์ ์ ์ผ๋ก ์ ๋ฆฌ.
- ๋ฎ์ ์ง์ฐ ์๊ฐ(Low Latency)๊ณผ ์ผ์ ํ ์๋ต ์๊ฐ์ ๋ชฉํ๋ก ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํฉ.
ZGC ๋ฐ Shenandoah GC
- ๋งค์ฐ ๋ฎ์ ์๋ต ์๊ฐ์ ๋ชฉํ๋ก ํ๋ ์ต์ GC.
- GC๋ก ์ธํ ์ ์ง ์๊ฐ์ ๋ฐ๋ฆฌ์ด(ms) ๋จ์๋ก ์ต์ํ.
- ๋๊ท๋ชจ ์์คํ ๋ฐ ์ค์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํฉ.
๐ก๊ฒฐ๋ก
- ์์ ์ ํ๋ฆฌ์ผ์ด์ → Serial GC
- ๋์ ์ฒ๋ฆฌ๋(Throughput) ์๊ตฌ → Parallel GC
- ๋ฎ์ ์ง์ฐ ์๊ฐ(Low Latency) ์๊ตฌ → G1 GC
- ์ด์ ์ง์ฐ(Real-time Low Latency) ์๊ตฌ → ZGC, Shenandoah GC
์ฐธ๊ณ ๋ฌธํ
- https://velog.io/@yereumi/Java-%EA%B3%B5%EC%8B%9D%EB%AC%B8%EC%84%9C%EB%A1%9C-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-Garbage-Collection-Ch-1.-%EA%B0%80%EB%B9%84%EC%A7%80-%EC%BB%AC%EB%A0%89%EC%85%98-%ED%8A%9C%EB%8B%9D-%EC%86%8C%EA%B0%9C
- https://www.geeksforgeeks.org/how-jvm-works-jvm-architecture/
- https://docs.oracle.com/en/java/javase/21/gctuning/introduction-garbage-collection-tuning.html#GUID-223394DF-2E27-4F5D-A7DF-83151EB577BB
'JAVA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| G1 GC vs CMS GC (2) | 2025.07.26 |
|---|---|
| Stack vs Heap (1) | 2025.07.10 |
| ์ค๋ ๋์ ๋ฉํฐ์ค๋ ๋ (0) | 2025.07.07 |
| JMM (0) | 2025.07.07 |
| JIT(Just-In-TIme) Complination (4) | 2025.07.07 |