๐ŸŽฏ1์ฃผ์ฐจ Unit 5.4 โ€” GC ์ข…๋ฅ˜์™€ ์„ ํƒ ๊ธฐ์ค€

Psjยท6์ผ ์ „

F-lab

๋ชฉ๋ก ๋ณด๊ธฐ
40/52

๐ŸŽฏ Unit 5.4 โ€” GC ์ข…๋ฅ˜์™€ ์„ ํƒ ๊ธฐ์ค€ โ˜…โ˜…โ˜…

F-lab Java 1์ฃผ์ฐจ / Phase 5 / Unit 5.4 ๋ณธ๊ฒฉ ํ•™์Šต ์ž๋ฃŒ โ€” Phase 5 ๋งˆ๋ฌด๋ฆฌ!
9-์„น์…˜ ๋งˆ์Šคํ„ฐ ํ”„๋กฌํ”„ํŠธ ํ˜•์‹์œผ๋กœ ๊นŠ์ด ํŒŒํ—ค์นœ๋‹ค.

์„ ์ˆ˜ ์ง€์‹: Unit 5.3 (GC ์•Œ๊ณ ๋ฆฌ์ฆ˜ 4๊ฐ€์ง€)
๋‹ค์Œ Phase: Phase 6 โ€” ๋ฐ์ดํ„ฐ ๋‹ค๋ฃจ๊ธฐ (๋ฌธ์ž์—ดยท์ปฌ๋ ‰์…˜)

์ด Unit์˜ ์˜๋ฏธ: ์šด์˜ ํ™˜๊ฒฝ์—์„œ GC ๋ฅผ ์„ ํƒํ•˜๋Š” ์‹ค์šฉ ๊ฐ€์ด๋“œ.
Serial, Parallel, CMS, G1, ZGC, Shenandoah ์˜ ์ •ํ™•ํ•œ ์ฐจ์ด.
ILIC ์šด์˜์— ์–ด๋–ค GC ๊ฐ€ ๋งž๋Š”์ง€ ๊ฒฐ์ • ๊ฐ€๋Šฅ.


๐ŸŒ 1. ์„ธ์ƒ ์† ๋น„์œ 

GC ์ข…๋ฅ˜ = "๋‹ค์–‘ํ•œ ์ฒญ์†Œ ์„œ๋น„์Šค"

ํฐ ์‚ฌ๋ฌด์‹ค์˜ ์ฒญ์†Œ ์„œ๋น„์Šค ์˜ต์…˜:

1. 1์ธ ์ฒญ์†Œ๋ถ€ (Serial GC)

  • ํ•œ ๋ช…์ด ๋ชจ๋“  ๊ณณ ์ฒญ์†Œ
  • ์ฒญ์†Œ ๋™์•ˆ ๋ชจ๋“  ์ง์› ๋Œ€๊ธฐ (๊ธด STW)
  • ์žฅ์ : ๋น„์šฉ ์ €๋ ด
  • ๋‹จ์ : ๋А๋ฆผ
  • ์ ํ•ฉ: ์ž‘์€ ์‚ฌ๋ฌด์‹ค (1์ธ ํšŒ์‚ฌ)

2. ์ฒญ์†Œ ํŒ€ (Parallel GC)

  • ์—ฌ๋Ÿฌ ๋ช…์ด ๊ฐ™์ด ์ฒญ์†Œ
  • ๋ชจ๋“  ์ง์› ๋Œ€๊ธฐ๋Š” ๋™์ผํ•˜์ง€๋งŒ ๋” ๋นจ๋ฆฌ ๋๋‚จ
  • ์žฅ์ : ์ฒ˜๋ฆฌ๋Ÿ‰ โ†‘
  • ๋‹จ์ : ์—ฌ์ „ํžˆ STW
  • ์ ํ•ฉ: ์ค‘๊ฐ„ ๊ทœ๋ชจ, ์ฒ˜๋ฆฌ๋Ÿ‰ ์šฐ์„ 

3. ๋™์‹œ ์ฒญ์†Œ + ์ž‘์€ STW (CMS)

  • ์ฒญ์†Œ๋ถ€๊ฐ€ ์ง์›๊ณผ ํ•จ๊ป˜ ์ผํ•˜๋ฉด์„œ ์ฒญ์†Œ
  • ์ •๋ง ํ•„์š”ํ•  ๋•Œ๋งŒ ์ž ๊น ๋ฉˆ์ถค
  • ์žฅ์ : ์‘๋‹ต์„ฑ โ†‘
  • ๋‹จ์ : ๋‹จํŽธํ™”, ๋ณต์žก
  • ์ ํ•ฉ: ์‘๋‹ต ์‹œ๊ฐ„ ์ค‘์š” (deprecated)

4. ๊ตฌ์—ญ๋ณ„ ์ฒญ์†Œ (G1)

  • ์‚ฌ๋ฌด์‹ค์„ ์—ฌ๋Ÿฌ ๊ตฌ์—ญ์œผ๋กœ ๋‚˜๋ˆ”
  • ๊ฐ€์žฅ ๋”๋Ÿฌ์šด ๊ตฌ์—ญ๋ถ€ํ„ฐ ์ฒญ์†Œ
  • ์žฅ์ : ํฐ ์‚ฌ๋ฌด์‹ค์—์„œ๋„ ํšจ๊ณผ์ 
  • ๋‹จ์ : ๊ตฌ์กฐ ๋ณต์žก
  • ์ ํ•ฉ: ์ผ๋ฐ˜ ์„œ๋ฒ„ (ํ˜„์žฌ ๊ธฐ๋ณธ)

5. ๊ฑฐ์˜ ๋ฉˆ์ถค ์—†๋Š” ์ฒญ์†Œ (ZGC)

  • ๋งค์šฐ ๋น ๋ฅธ ๋ถ€๋ถ„ ์ฒญ์†Œ
  • ์ง์›์ด ๊ฑฐ์˜ ์ธ์ง€ ๋ชป ํ•จ
  • ์žฅ์ : ๋งค์šฐ ์งง์€ STW (~ms)
  • ๋‹จ์ : ๋ฉ”๋ชจ๋ฆฌ ์•ฝ๊ฐ„ ๋” ์‚ฌ์šฉ
  • ์ ํ•ฉ: ์ €์ง€์—ฐ ์‹œ์Šคํ…œ

โ†’ ์ด๊ฒŒ ์ž๋ฐ” GC ์˜ 6๊ฐ€์ง€ ์ข…๋ฅ˜.


ํ•ต์‹ฌ ํ•œ ๋ฌธ์žฅ

"GC ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๊ฐ™์•„๋„ ๊ตฌํ˜„ (๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ, Concurrent, Region ๊ธฐ๋ฐ˜) ์— ๋”ฐ๋ผ ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜๋กœ ์ง„ํ™”ํ–ˆ๋‹ค."

๊ฐ GC ์˜ trade-off:

  • ์ฒ˜๋ฆฌ๋Ÿ‰ vs ์‘๋‹ต์„ฑ
  • ๋‹จ์ˆœํ•จ vs ๋ณต์žกํ•จ
  • Heap ํฌ๊ธฐ

๋น„์œ  ์ •๋ฆฌ:

๋น„์œ GC ์ข…๋ฅ˜์ ํ•ฉ
1์ธ ์ฒญ์†Œ๋ถ€Serial์ž‘์€ ํ™˜๊ฒฝ
์ฒญ์†Œ ํŒ€Parallel์ฒ˜๋ฆฌ๋Ÿ‰ ์šฐ์„ 
๋™์‹œ ์ฒญ์†ŒCMS์‘๋‹ต์„ฑ (deprecated)
๊ตฌ์—ญ๋ณ„ ์ฒญ์†ŒG1์ผ๋ฐ˜ (๊ธฐ๋ณธ)
๋ฉˆ์ถค ์—†๋Š” ์ฒญ์†ŒZGC์ €์ง€์—ฐ

๐Ÿ”ฅ 2. ํƒ„์ƒ ๋ฐฐ๊ฒฝ

"ํ•œ ๊ฐ€์ง€ GC ๋กœ ๋ชจ๋“  ํ™˜๊ฒฝ?" โ€” ๋ถˆ๊ฐ€๋Šฅ

GC ์˜ ํ•ต์‹ฌ trade-off:

[์ฒ˜๋ฆฌ๋Ÿ‰ (Throughput)]  โ†โ€”โ€”โ€”โ€”โ€”โ€”โ†’  [์‘๋‹ต์„ฑ (Latency)]
   ๋ฐฐ์น˜, ๋Œ€๋Ÿ‰ ์ฒ˜๋ฆฌ                   ์‚ฌ์šฉ์ž ์‘๋‹ต
   STW ๊ธธ์–ด๋„ OK                    STW ์งง์•„์•ผ

ํ•œ ๊ฐ€์ง€ GC ๋กœ๋Š” ๋ชจ๋“  ํ™˜๊ฒฝ ๋งŒ์กฑ ๋ถˆ๊ฐ€:

  • ๋ฐฐ์น˜: ์ฒ˜๋ฆฌ๋Ÿ‰ ์šฐ์„ 
  • ์›น ์„œ๋ฒ„: ์‘๋‹ต์„ฑ ์šฐ์„ 
  • ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ: ํšจ์œจ ์šฐ์„ 

โ†’ ๋‹ค์–‘ํ•œ GC ๊ฐ€ ๋“ฑ์žฅ.


Java ๋ฒ„์ „๋ณ„ ๊ธฐ๋ณธ GC โญ

์ž๋ฐ” ๋ฒ„์ „๋งˆ๋‹ค ๊ธฐ๋ณธ GC ๊ฐ€ ์ง„ํ™”:

์ž๋ฐ” ๋ฒ„์ „๊ธฐ๋ณธ GC
1.0~1.4Serial
1.5~1.7Parallel (Heap ํฐ ๊ฒฝ์šฐ)
8Parallel โญ
9~G1 โญ
11~G1 (ZGC ์‹คํ—˜์ )
15~G1 (ZGC ์ •์‹)
17~G1 (Generational ZGC ์‹คํ—˜์ )
21~G1 (Generational ZGC ์ •์‹)

๋ฐ•์Šน์ œ๋‹˜์˜ Java 17 ํ™˜๊ฒฝ:

  • ILIC ๊ฐ€ Java 17 ์‚ฌ์šฉ ์‹œ โ†’ G1 GC ๊ฐ€ ๊ธฐ๋ณธ

GC ์ง„ํ™”์˜ ๋™๊ธฐ

1. Heap ํฌ๊ธฐ ์ฆ๊ฐ€

  • 1990๋…„๋Œ€: ์ˆ˜์‹ญ~์ˆ˜๋ฐฑ MB
  • 2000๋…„๋Œ€: GB ๋‹จ์œ„
  • 2010๋…„๋Œ€: ์ˆ˜์‹ญ GB
  • 2020๋…„๋Œ€: ์ˆ˜๋ฐฑ GB

โ†’ ํฐ Heap ์—์„œ๋„ ํšจ์œจ์ ์ธ GC ํ•„์š”.

2. ์‘๋‹ต์„ฑ ์š”๊ตฌ ์ฆ๊ฐ€

  • ์˜›๋‚ : ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ โ†’ STW 1์ดˆ OK
  • ์ง€๊ธˆ: ์›น API โ†’ STW 100ms ๋„ ๋ถ€๋‹ด
  • โ†’ ์ €์ง€์—ฐ GC ํ•„์š”.

3. ๋ฉ€ํ‹ฐ ์ฝ”์–ด ์‹œ๋Œ€

  • ์˜›๋‚ : ๋‹จ์ผ CPU โ†’ Serial ๋งŒ์œผ๋กœ OK
  • ์ง€๊ธˆ: ์ˆ˜์‹ญ ์ฝ”์–ด โ†’ ๋ณ‘๋ ฌ GC ํ™œ์šฉ

๊ฐ GC ์˜ ๋“ฑ์žฅ ์ด์œ 

Serial GC (1995, Java 1.0)

  • ์ž๋ฐ”์˜ ์ฒซ GC
  • ๋‹จ์ผ ์Šค๋ ˆ๋“œ
  • ์ž‘์€ ํ™˜๊ฒฝ์— ์ ํ•ฉ

Parallel GC (Java 1.4)

  • ๋ฉ€ํ‹ฐ ์ฝ”์–ด ํ™œ์šฉ
  • ์ฒ˜๋ฆฌ๋Ÿ‰ ์šฐ์„ 
  • Java 8 ์˜ ๊ธฐ๋ณธ

CMS (Java 1.4)

  • Concurrent Mark-Sweep
  • STW ์ค„์ด๊ธฐ ์œ„ํ•œ ์ฒซ ์‹œ๋„
  • ๋‹จํŽธํ™” + ๋ณต์žก์„ฑ์œผ๋กœ Java 9 ์—์„œ deprecated, Java 14 ์—์„œ ์ œ๊ฑฐ

G1 (Java 7+, 9 default) โญ

  • Garbage First
  • Region ๊ธฐ๋ฐ˜
  • ํฐ Heap ํšจ์œจ์ 
  • ํ˜„์žฌ ๊ธฐ๋ณธ GC

ZGC (Java 11+) โญ

  • Z Garbage Collector
  • ms ๋‹จ์œ„ STW
  • ํฐ Heap (์ˆ˜ TB) ๋„ ๊ฐ€๋Šฅ
  • ์ €์ง€์—ฐ ์šฐ์„ 

Shenandoah (Java 12+)

  • Red Hat ๊ฐœ๋ฐœ
  • ZGC ์œ ์‚ฌ (์ €์ง€์—ฐ)
  • OpenJDK 11+ ๋ฐฑํฌํŠธ

ํ•ต์‹ฌ ํ†ต์ฐฐ

"GC ์ข…๋ฅ˜ ์„ ํƒ์€ '๋‚ด ํ™˜๊ฒฝ์˜ ์šฐ์„ ์ˆœ์œ„' ์˜ ๋‹ต์ด๋‹ค."

์ฒ˜๋ฆฌ๋Ÿ‰์ธ๊ฐ€ ์‘๋‹ต์„ฑ์ธ๊ฐ€? ์ž‘์€ Heap ์ธ๊ฐ€ ํฐ Heap ์ธ๊ฐ€? ๋‹จ์ผ CPU ์ธ๊ฐ€ ๋ฉ€ํ‹ฐ CPU ์ธ๊ฐ€?

๋ชจ๋“  ํ™˜๊ฒฝ์— ๋งž๋Š” ๋‹จ์ผ GC ๋Š” ์—†๋‹ค. ์ƒํ™ฉ์— ๋งž๊ฒŒ ์„ ํƒ. ์‹œ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ๊ฐ GC ์˜ ํŠน์„ฑ์„ ์•Œ๊ณ  ํ™˜๊ฒฝ์— ๋งž๋Š” ์„ ํƒ ๊ฐ€๋Šฅํ•ด์•ผ.


๐Ÿ’ฃ 3. ์—†์œผ๋ฉด ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ

GC ์ข…๋ฅ˜๋ฅผ ๋ชจ๋ฅด๋ฉด ์šด์˜ ํ™˜๊ฒฝ์—์„œ ๋‹ค์–‘ํ•œ ๋ฌธ์ œ ๋ฐœ์ƒ.

์‹œ๋‚˜๋ฆฌ์˜ค 1: "๊ธฐ๋ณธ GC ๋งŒ ์‚ฌ์šฉ"

java -jar ilic.jar  # ๊ธฐ๋ณธ GC (Java 17 โ†’ G1)

์•Œ๊ณ  ์‚ฌ์šฉ: ์˜๋„์  G1 ์„ ํƒ โœ…
๋ชจ๋ฅด๊ณ  ์‚ฌ์šฉ: ์–ด๋–ค GC ์ธ์ง€๋„ ๋ชจ๋ฆ„ โŒ

๋ฌธ์ œ ์‹œ:

  • "GC ๊ฐ€ ๋А๋ ค์š”" ๋ผ๊ณ ๋งŒ
  • ์–ด๋–ค GC ์ธ์ง€ ๋ชจ๋ฆ„ โ†’ ๋ถ„์„ ๋ถˆ๊ฐ€

์‹œ๋‚˜๋ฆฌ์˜ค 2: ์ž˜๋ชป๋œ GC ์„ ํƒ

Case A: ์ž‘์€ ํ™˜๊ฒฝ์— G1

java -XX:+UseG1GC -Xmx512m -jar small.jar

๋ฌธ์ œ:

  • G1 ์˜ Region ์˜ค๋ฒ„ํ—ค๋“œ
  • ์ž‘์€ Heap ์—๋Š” ๋น„ํšจ์œจ
  • Serial ๋˜๋Š” Parallel ์ด ๋” ์ ํ•ฉ

Case B: ์‘๋‹ต์„ฑ ์ค‘์š”ํ•œ๋ฐ Parallel

java -XX:+UseParallelGC -jar webapp.jar

๋ฌธ์ œ:

  • Full GC ์‹œ 5์ดˆ STW
  • ์‚ฌ์šฉ์ž ์‘๋‹ต 5์ดˆ ๋Š๊น€
  • ๋งค์ถœ ์†์‹ค
  • โ†’ G1 ๋˜๋Š” ZGC ๊ฐ€ ์ ํ•ฉ

์‹œ๋‚˜๋ฆฌ์˜ค 3: ILIC ์šด์˜ ํ™˜๊ฒฝ

ILIC ์„œ๋น„์Šค:
- Heap: 4GB
- API ์‘๋‹ต ์‹œ๊ฐ„ SLA: P99 < 500ms
- ์‚ฌ์šฉ GC: ๋ชจ๋ฆ„ (๊ธฐ๋ณธ)

๋ฌธ์ œ:
๊ฐ€๋” ์‘๋‹ต ์‹œ๊ฐ„ 2์ดˆ โ†’ SLA ์œ„๋ฐ˜

GC ์ข…๋ฅ˜ ๋ชจ๋ฅด๋ฉด:

  • "DB ๊ฐ€ ๋А๋ฆฐ๊ฐ€?" ์ถ”์ธก

GC ์ข…๋ฅ˜ ์•Œ๋ฉด:

  • GC ๋กœ๊ทธ ๋ถ„์„
  • "G1 ์˜ Mixed GC ๊ฐ€ 800ms"
  • โ†’ ํŠœ๋‹ ๋˜๋Š” ZGC ์ „ํ™˜

์‹œ๋‚˜๋ฆฌ์˜ค 4: ๋ฉด์ ‘ ๊นŠ์ด ์งˆ๋ฌธ

"ILIC ์—์„œ ์–ด๋–ค GC ์‚ฌ์šฉํ–ˆ๊ณ , ์™œ ๊ทธ GC ์ธ๊ฐ€์š”?"

๋‹ต ๋ชปํ•จ:

  • "๊ธฐ๋ณธ GC ์‚ฌ์šฉํ–ˆ์–ด์š”"
  • โ†’ ์‹œ๋‹ˆ์–ด ์ž๊ฒฉ ์˜์‹ฌ

์ž˜ ๋‹ตํ•จ:

  • "Java 17 ๊ธฐ๋ณธ์ธ G1 ์‚ฌ์šฉ. 4GB Heap ์— ์ ํ•ฉํ•˜๊ณ , MaxGCPauseMillis=200 ์œผ๋กœ ์‘๋‹ต์„ฑ ํ™•๋ณด"
  • "๋งŒ์•ฝ ์‘๋‹ต ์‹œ๊ฐ„์ด ๋” ์ค‘์š”ํ•ด์ง€๋ฉด ZGC ๋„ ๊ณ ๋ ค"
  • โ†’ ์‹œ๋‹ˆ์–ด ์ธ์‹

์‹œ๋‚˜๋ฆฌ์˜ค 5: GC ํŠœ๋‹ ์‹œ ์„ ํƒ์ง€ ๋ชจ๋ฆ„

๋ฌธ์ œ: Full GC ๋นˆ๋ฒˆ, STW ๊น€

GC ์ข…๋ฅ˜ ๋ชจ๋ฅด๋ฉด:

  • ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ• ์ง€ ๋ชจ๋ฆ„

GC ์ข…๋ฅ˜ ์•Œ๋ฉด:

  • ์˜ต์…˜ 1: Heap ๋Š˜๋ฆฌ๊ธฐ (G1 ์œ ์ง€)
  • ์˜ต์…˜ 2: G1 ํŠœ๋‹ (MaxGCPauseMillis)
  • ์˜ต์…˜ 3: ZGC ์ „ํ™˜ (์ €์ง€์—ฐ)
  • ์˜ต์…˜ 4: Parallel ์ „ํ™˜ (๋ฐฐ์น˜๋ผ๋ฉด)
  • โ†’ ์ƒํ™ฉ๋ณ„ ์„ ํƒ

์‹œ๋‚˜๋ฆฌ์˜ค 6: Java ๋ฒ„์ „ ์—…๊ทธ๋ ˆ์ด๋“œ

Java 8 โ†’ Java 17 ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜
๊ธฐ๋ณธ GC ๋ณ€๊ฒฝ: Parallel โ†’ G1

GC ์ข…๋ฅ˜ ๋ชจ๋ฅด๋ฉด:

  • ๋™์ž‘ ์ฐจ์ด ๋ชจ๋ฆ„
  • ์„ฑ๋Šฅ ๋ณ€ํ™”์— ๋‹นํ™ฉ

GC ์ข…๋ฅ˜ ์•Œ๋ฉด:

  • "Parallel ์˜ Throughput ์šฐ์„  โ†’ G1 ์˜ ๊ท ํ˜•"
  • "๊ธฐ์กด ์˜ต์…˜ ํ˜ธํ™˜ ํ™•์ธ"
  • โ†’ ๊ณ„ํš์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜

GC ์ข…๋ฅ˜ ์ดํ•ด์˜ ์ค‘์š”์„ฑ

์‹œ๋‚˜๋ฆฌ์˜คGC ์ข…๋ฅ˜ ๋ชจ๋ฅด๋ฉดGC ์ข…๋ฅ˜ ์•Œ๋ฉด
๊ธฐ๋ณธ GC ์‚ฌ์šฉ๋ฌด์ง€์‹์˜๋„ ๋ช…ํ™•
GC ์„ ํƒ์ž˜๋ชป ์„ ํƒ์ƒํ™ฉ์— ๋งž๋Š” ์„ ํƒ
์šด์˜ ๋ถ„์„๋ง‰๋ง‰ํ•จ์ •ํ™•ํ•œ ์ง„๋‹จ
๋ฉด์ ‘ํƒˆ๋ฝ์‹œ๋‹ˆ์–ด ์ธ์‹
ํŠœ๋‹์˜ต์…˜ ๋ชจ๋ฆ„๋‹ค์–‘ํ•œ ์„ ํƒ์ง€
๋ฒ„์ „ ์—…๊ทธ๋ ˆ์ด๋“œ๋‹นํ™ฉ๊ณ„ํš์ 

โ†’ GC ์ข…๋ฅ˜ ์ดํ•ด๋Š” ์‹œ๋‹ˆ์–ด ์ž๋ฐ” ๊ฐœ๋ฐœ์ž์˜ ํ•„์ˆ˜.


โœ… 4. ํ•ด๊ฒฐ์ฑ… โ€” 6๊ฐ€์ง€ GC ์ •ํ™•ํžˆ

1. Serial GC โญ

ํ•ต์‹ฌ ํŠน์ง•

  • ๋‹จ์ผ ์Šค๋ ˆ๋“œ GC
  • Stop-the-World
  • ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ GC

์•Œ๊ณ ๋ฆฌ์ฆ˜

  • Young: Copying GC
  • Old: Mark-Sweep-Compact

์žฅ์ 

  • ๋‹จ์ˆœ, ์•ˆ์ •
  • ๋ฉ”๋ชจ๋ฆฌ ์ ๊ฒŒ ์‚ฌ์šฉ
  • ๋‹จ์ผ CPU์— ํšจ์œจ

๋‹จ์ 

  • ๋ฉ€ํ‹ฐ ์ฝ”์–ด ํ™œ์šฉ X
  • STW ๊น€

์ ํ•ฉ

  • ์ž‘์€ Heap (~์ˆ˜ MB)
  • ๋‹จ์ผ CPU ํ™˜๊ฒฝ
  • ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜
  • ์ปจํ…Œ์ด๋„ˆ (์ œํ•œ๋œ ์ž์›)

JVM ์˜ต์…˜

java -XX:+UseSerialGC -jar app.jar

2. Parallel GC โญ

ํ•ต์‹ฌ ํŠน์ง•

  • ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ GC (๋ฉ€ํ‹ฐ ์ฝ”์–ด ํ™œ์šฉ)
  • Stop-the-World (๋‹จ์ถ•๋จ)
  • Throughput Collector ๋ผ๊ณ ๋„ ๋ถ€๋ฆ„

์•Œ๊ณ ๋ฆฌ์ฆ˜

  • Young: Parallel Copying
  • Old: Parallel Mark-Sweep-Compact

์žฅ์ 

  • ์ฒ˜๋ฆฌ๋Ÿ‰ โ†‘
  • ๋ฉ€ํ‹ฐ ์ฝ”์–ด ํ™œ์šฉ
  • ๋‹จ์ˆœํ•œ ๋™์ž‘

๋‹จ์ 

  • ์—ฌ์ „ํžˆ STW (์‘๋‹ต์„ฑ X)
  • Full GC ์‹œ ๊ธธ์–ด์ง

์ ํ•ฉ

  • ์ฒ˜๋ฆฌ๋Ÿ‰ ์šฐ์„  (๋ฐฐ์น˜, ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ)
  • Java 8 ์˜ ๊ธฐ๋ณธ
  • ์‘๋‹ต ์‹œ๊ฐ„ < ์ฒ˜๋ฆฌ๋Ÿ‰

JVM ์˜ต์…˜

java -XX:+UseParallelGC -jar app.jar

# ์ฒ˜๋ฆฌ๋Ÿ‰ ๋ชฉํ‘œ
-XX:GCTimeRatio=99           # 1% ์ด๋‚ด GC
-XX:MaxGCPauseMillis=200     # ๋ชฉํ‘œ STW

3. CMS (Concurrent Mark Sweep) โ€” Deprecated

ํ•ต์‹ฌ ํŠน์ง•

  • Concurrent GC (Application Thread ์™€ ๋™์‹œ ์‹คํ–‰)
  • STW ์ตœ์†Œํ™” ์‹œ๋„
  • Java 9 ์—์„œ deprecated, Java 14 ์—์„œ ์ œ๊ฑฐ

์•Œ๊ณ ๋ฆฌ์ฆ˜

  • Young: Parallel Copying
  • Old: Concurrent Mark-Sweep (์••์ถ• X)

์žฅ์ 

  • ์งง์€ STW
  • ์‘๋‹ต์„ฑ โ†‘

๋‹จ์ 

  • ๋‹จํŽธํ™” ๋ฐœ์ƒ (Compact ์—†์Œ)
  • CPU ์‚ฌ์šฉ๋Ÿ‰ โ†‘
  • Promotion Failure ๊ฐ€๋Šฅ
  • ๋ณต์žกํ•œ ๊ตฌํ˜„
  • โ†’ Java 14 ์—์„œ ์™„์ „ ์ œ๊ฑฐ

์ ํ•ฉ

  • ์‘๋‹ต์„ฑ ์ค‘์š”ํ•œ ์‹œ์Šคํ…œ (deprecated ์ด์ „)
  • โ†’ ํ˜„์žฌ๋Š” G1 ๋˜๋Š” ZGC ์‚ฌ์šฉ

JVM ์˜ต์…˜ (Java 14 ์ด์ „๋งŒ)

java -XX:+UseConcMarkSweepGC -jar app.jar  # โŒ Java 14+์—์„œ ์‚ฌ์šฉ ๋ถˆ๊ฐ€

4. G1 GC (Garbage First) โญโญ (ํ˜„์žฌ ๊ธฐ๋ณธ)

ํ•ต์‹ฌ ํŠน์ง•

  • Region ๊ธฐ๋ฐ˜
  • Heap ์„ ์ž‘์€ Region ๋“ค (1~32MB) ๋กœ ๋ถ„ํ• 
  • ๊ฐ Region ์ด ๋™์  ์—ญํ•  (Eden/Survivor/Old)
  • Garbage ๊ฐ€ ๋งŽ์€ Region ๋ถ€ํ„ฐ ์ฒญ์†Œ

์•Œ๊ณ ๋ฆฌ์ฆ˜

  • Concurrent Marking
  • Parallel Copying
  • Mixed GC (Young + ์ผ๋ถ€ Old)

Region ๊ตฌ์กฐ

[Heap]
โ”œโ”€โ”€ Region 0 (Eden)
โ”œโ”€โ”€ Region 1 (Survivor)
โ”œโ”€โ”€ Region 2 (Old)
โ”œโ”€โ”€ Region 3 (Humongous)
โ”œโ”€โ”€ Region 4 (Free)
โ””โ”€โ”€ ... ์ˆ˜๋ฐฑ~์ˆ˜์ฒœ Region

์žฅ์ 

  • ํฐ Heap ํšจ์œจ์ 
  • ๋‹จํŽธํ™” ์ ์Œ (Region ๋‹จ์œ„ ์••์ถ•)
  • ๋ชฉํ‘œ STW ์„ค์ • ๊ฐ€๋Šฅ (MaxGCPauseMillis)
  • ๊ท ํ˜• ์žกํžŒ GC

๋‹จ์ 

  • ๋งค์šฐ ์ž‘์€ Heap ์—์„œ๋Š” ์˜ค๋ฒ„ํ—ค๋“œ
  • ๋ฉ”๋ชจ๋ฆฌ ์•ฝ๊ฐ„ ๋” ์‚ฌ์šฉ (Region ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ)

์ ํ•ฉ โญ

  • ์ผ๋ฐ˜ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„ (๊ฐ€์žฅ ๋งŽ์€ ์ผ€์ด์Šค)
  • Heap 4GB ~ ์ˆ˜์‹ญ GB
  • Java 9+ ์˜ ๊ธฐ๋ณธ

JVM ์˜ต์…˜

java -XX:+UseG1GC -jar app.jar

# ์ฃผ์š” ํŠœ๋‹ ์˜ต์…˜
-XX:MaxGCPauseMillis=200      # ๋ชฉํ‘œ STW (๊ธฐ๋ณธ 200ms)
-XX:G1HeapRegionSize=4m       # Region ํฌ๊ธฐ (์ž๋™ ๊ณ„์‚ฐ๋„ OK)
-XX:InitiatingHeapOccupancyPercent=45  # Mixed GC ํŠธ๋ฆฌ๊ฑฐ
-XX:ConcGCThreads=2           # Concurrent ์Šค๋ ˆ๋“œ ์ˆ˜

5. ZGC (Z Garbage Collector) โญ (์ €์ง€์—ฐ)

ํ•ต์‹ฌ ํŠน์ง•

  • ๋งค์šฐ ์งง์€ STW (~10ms ์ดํ•˜)
  • ๊ฑฐ์˜ ๋ชจ๋“  ์ž‘์—…์ด Concurrent
  • ํฐ Heap (์ˆ˜ TB) ๋„ ๊ฐ€๋Šฅ
  • Java 15+ ์ •์‹

์•Œ๊ณ ๋ฆฌ์ฆ˜

  • Colored Pointers (ํฌ์ธํ„ฐ์— ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ)
  • Load Barrier (์ฐธ์กฐ ์‹œ ์ž๋™ ์ž‘์—…)
  • Region ๊ธฐ๋ฐ˜ (G1 ๋ณด๋‹ค ํฐ Region)

์žฅ์  โญ

  • STW < 10ms (Heap ํฌ๊ธฐ ๋ฌด๊ด€)
  • ํฐ Heap ์— ํšจ์œจ
  • ์ €์ง€์—ฐ ์‹œ์Šคํ…œ ์ ํ•ฉ

๋‹จ์ 

  • CPU ์‚ฌ์šฉ๋Ÿ‰ โ†‘
  • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ โ†‘ (Colored Pointer)
  • ์ฒ˜๋ฆฌ๋Ÿ‰ ์•ฝ๊ฐ„ โ†“
  • ์ž‘์€ Heap ์—์„œ๋Š” G1 ๋ณด๋‹ค ๋น„ํšจ์œจ

์ ํ•ฉ โญ

  • ์‘๋‹ต์„ฑ ๋งค์šฐ ์ค‘์š” (์‹ค์‹œ๊ฐ„ ์‹œ์Šคํ…œ)
  • ํฐ Heap (32GB+)
  • Java 15+ ํ™˜๊ฒฝ

JVM ์˜ต์…˜

java -XX:+UseZGC -jar app.jar

# Generational ZGC (Java 21+)
java -XX:+UseZGC -XX:+ZGenerational -jar app.jar

6. Shenandoah (Red Hat)

ํ•ต์‹ฌ ํŠน์ง•

  • ZGC ์œ ์‚ฌ (์ €์ง€์—ฐ)
  • OpenJDK 11+ ๋ฐฑํฌํŠธ (ZGC ์™€ ์ฐจ๋ณ„์ )
  • Red Hat ๊ฐœ๋ฐœ

์žฅ์ 

  • ์ €์ง€์—ฐ
  • OpenJDK 8/11 ์—์„œ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ZGC ์™€ ์œ ์‚ฌํ•œ ์„ฑ๋Šฅ

๋‹จ์ 

  • ZGC ์™€ ๋น„์Šทํ•œ ๋‹จ์ 

JVM ์˜ต์…˜

java -XX:+UseShenandoahGC -jar app.jar

6๊ฐ€์ง€ ๋น„๊ต ํ‘œ โญโญ (๋ฉด์ ‘ ๋‹ต๋ณ€ ํ•ต์‹ฌ)

GC๋“ฑ์žฅ์•Œ๊ณ ๋ฆฌ์ฆ˜STW์ฒ˜๋ฆฌ๋Ÿ‰์ ํ•ฉ ํ™˜๊ฒฝ
Serial1.0๋‹จ์ผ ์Šค๋ ˆ๋“œ๊น€๋ณดํ†ต์ž‘์€ ํ™˜๊ฒฝ, ๋‹จ์ผ CPU
Parallel1.4๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๊น€ (๋‹จ์ถ•)๋†’์Œ์ฒ˜๋ฆฌ๋Ÿ‰ ์šฐ์„ , ๋ฐฐ์น˜
CMS1.4Concurrent์งง์Œ๋ณดํ†ต(deprecated)
G17+, 9 defaultRegion๋ณดํ†ต๋†’์Œ์ผ๋ฐ˜ ๋ฐฑ์—”๋“œ โญ
ZGC11+Colored Pointer๋งค์šฐ ์งง์Œ๋ณดํ†ต์ €์ง€์—ฐ, ํฐ Heap
Shenandoah12+Red Hat๋งค์šฐ ์งง์Œ๋ณดํ†ต์ €์ง€์—ฐ, OpenJDK

์„ ํƒ ๊ฐ€์ด๋“œ โญโญโญ (์‹ค์šฉ)

๊ฒฐ์ • ํŠธ๋ฆฌ

Heap ํฌ๊ธฐ?
โ”œโ”€โ”€ ~100MB
โ”‚   โ””โ”€โ”€ Serial (๋‹จ์ˆœ, ํšจ์œจ)
โ”‚
โ”œโ”€โ”€ 100MB ~ 4GB
โ”‚   โ”œโ”€โ”€ ์ฒ˜๋ฆฌ๋Ÿ‰ ์šฐ์„ ?
โ”‚   โ”‚   โ””โ”€โ”€ Parallel
โ”‚   โ””โ”€โ”€ ์‘๋‹ต์„ฑ ์šฐ์„ ?
โ”‚       โ””โ”€โ”€ G1
โ”‚
โ”œโ”€โ”€ 4GB ~ 32GB
โ”‚   โ””โ”€โ”€ G1 (๊ธฐ๋ณธ ๊ถŒ์žฅ) โญ
โ”‚
โ””โ”€โ”€ 32GB+
    โ””โ”€โ”€ ์‘๋‹ต์„ฑ ๋งค์šฐ ์ค‘์š”?
        โ”œโ”€โ”€ YES: ZGC
        โ””โ”€โ”€ NO:  G1

ILIC ํ™˜๊ฒฝ๋ณ„ ๊ถŒ์žฅ

Case 1: ์ผ๋ฐ˜ API ์„œ๋ฒ„ (Heap 2~4GB):

java -XX:+UseG1GC \
     -Xms2g -Xmx2g \
     -XX:MaxGCPauseMillis=200 \
     -jar ilic.jar

Case 2: ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ (๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ):

java -XX:+UseParallelGC \
     -Xms8g -Xmx8g \
     -jar batch.jar

Case 3: ์‹ค์‹œ๊ฐ„ ์‹œ์Šคํ…œ (์ €์ง€์—ฐ):

java -XX:+UseZGC \
     -Xms16g -Xmx16g \
     -jar realtime.jar

๐Ÿ—๏ธ 5. ๋‚ด๋ถ€ ๋™์ž‘ ์›๋ฆฌ

Serial GC ์˜ ๋™์ž‘

1. STW ์‹œ์ž‘ (๋ชจ๋“  Application Thread ์ •์ง€)
2. ๋‹จ์ผ GC ์Šค๋ ˆ๋“œ๊ฐ€ Mark + Sweep + Compact
3. STW ์ข…๋ฃŒ

โ†’ ๋‹จ์ˆœ. ์ž‘์€ Heap ์—์„œ๋Š” ์˜คํžˆ๋ ค ๋น ๋ฅผ ์ˆ˜ ์žˆ์Œ.


Parallel GC ์˜ ๋™์ž‘

1. STW ์‹œ์ž‘
2. ์—ฌ๋Ÿฌ GC ์Šค๋ ˆ๋“œ๊ฐ€ ๋ณ‘๋ ฌ๋กœ Mark + Sweep + Compact
3. STW ์ข…๋ฃŒ

์Šค๋ ˆ๋“œ ์ˆ˜:

๊ธฐ๋ณธ: CPU ์ฝ”์–ด ์ˆ˜
์กฐ์ •: -XX:ParallelGCThreads=N

โ†’ STW ์‹œ๊ฐ„ = Serial ์˜ 1/N (N = ์Šค๋ ˆ๋“œ ์ˆ˜).


G1 GC ์˜ ์ž์„ธํ•œ ๋™์ž‘ โญ

Region ๊ตฌ์กฐ

[G1 Heap]
โ”œโ”€โ”€ Eden Region (์—ฌ๋Ÿฌ ๊ฐœ)
โ”œโ”€โ”€ Survivor Region (์—ฌ๋Ÿฌ ๊ฐœ)
โ”œโ”€โ”€ Old Region (์—ฌ๋Ÿฌ ๊ฐœ)
โ”œโ”€โ”€ Humongous Region (ํฐ ๊ฐ์ฒด)
โ””โ”€โ”€ Free Region (์‚ฌ์šฉ ๊ฐ€๋Šฅ)

G1 ์˜ GC ์ข…๋ฅ˜

1. Young GC (Minor GC):

  • Eden + Survivor ์˜ Live ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฅธ Region ์œผ๋กœ ๋ณต์‚ฌ
  • ๋‹จํŽธํ™” ์ž๋™ ํ•ด์†Œ

2. Concurrent Marking:

  • Application Thread ์™€ ๋™์‹œ ์‹คํ–‰
  • Old Region ์˜ Live ๊ฐ์ฒด ๋งˆํ‚น

3. Mixed GC:

  • Young Region + ์ผ๋ถ€ Old Region ์ฒญ์†Œ
  • "Garbage ๋งŽ์€ Old Region" ๋ถ€ํ„ฐ (์ด๋ฆ„ ์˜๋ฏธ: Garbage First)

4. Full GC (ํ”ผํ•ด์•ผ ํ• ):

  • ๋ชจ๋“  Region ์ฒญ์†Œ
  • STW ๊ธธ์Œ

Garbage First ์˜ ์˜๋ฏธ

[Heap]
โ”œโ”€โ”€ Region A: 80% Garbage (target)
โ”œโ”€โ”€ Region B: 30% Garbage
โ”œโ”€โ”€ Region C: 90% Garbage (target)
โ”œโ”€โ”€ Region D: 10% Garbage
โ””โ”€โ”€ ...

GC ์šฐ์„  ์ฒญ์†Œ: Region A, C

โ†’ ๊ฐ€์žฅ ํšจ์œจ์ ์ธ Region ๋ถ€ํ„ฐ ์ฒญ์†Œ.

๋ชฉํ‘œ STW ๋‹ฌ์„ฑ

-XX:MaxGCPauseMillis=200:

  • ๋ชฉํ‘œ STW 200ms
  • G1 ์ด ์ž๋™์œผ๋กœ:
    • ์ฒญ์†Œํ•  Region ์ˆ˜ ๊ฒฐ์ •
    • 200ms ์•ˆ์— ๋๋‚ผ ๋งŒํผ๋งŒ ์ฒ˜๋ฆฌ

ZGC ์˜ ์ž์„ธํ•œ ๋™์ž‘ โญ

Colored Pointers

์ผ๋ฐ˜ 64-bit ํฌ์ธํ„ฐ:
[       64 bits (์ฃผ์†Œ)       ]

ZGC ์˜ Colored Pointer:
[ 4 bits (color) ][ 60 bits (์ฃผ์†Œ) ]

Color ์˜๋ฏธ:
- Marked0: Live (์ด๋ฒˆ ์‚ฌ์ดํด)
- Marked1: Live (๋‹ค์Œ ์‚ฌ์ดํด)
- Remapped: ์žฌ๋ฐฐ์น˜๋จ
- Finalizable: finalize ๋Œ€์ƒ

โ†’ ํฌ์ธํ„ฐ ์ž์ฒด์— GC ์ •๋ณด ์ €์žฅ.

Load Barrier

// ์‚ฌ์šฉ์ž ์ฝ”๋“œ
Customer c = customers.get(0);  // ๊ฐ์ฒด ์ฐธ์กฐ ์‹œ

// JVM ๋‚ด๋ถ€ (Load Barrier)
- ํฌ์ธํ„ฐ ์ƒ‰์ƒ ํ™•์ธ
- ํ•„์š” ์‹œ ๋™์‹œ ๋งˆํ‚น
- ํ•„์š” ์‹œ ์žฌ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ

โ†’ ๋งค ์ฐธ์กฐ ์‹œ ์•ฝ๊ฐ„์˜ ์ž‘์—…, ๊ทธ๋Ÿฌ๋‚˜ STW ๊ฑฐ์˜ ์—†์Œ.

ZGC ๋‹จ๊ณ„

1. Pause Mark Start (~1ms)
   - GC Root ๋งˆํ‚น

2. Concurrent Marking
   - Application ๊ณผ ๋™์‹œ ์‹คํ–‰
   - Heap ์ „์ฒด ๋งˆํ‚น

3. Pause Mark End (~1ms)
   - ๋งˆํ‚น ๋งˆ๋ฌด๋ฆฌ

4. Concurrent Relocation
   - Live ๊ฐ์ฒด ์žฌ๋ฐฐ์น˜
   - Application ๊ณผ ๋™์‹œ

โ†’ STW ๋Š” ์ˆ˜ ms ๋งŒ. Heap ํฌ๊ธฐ ๋ฌด๊ด€.


G1 vs ZGC ๋น„๊ต

G1ZGC
Region ํฌ๊ธฐ1~32MB~์ˆ˜ GB
STW~200ms (๋ชฉํ‘œ)~10ms ์ดํ•˜
Heap4GB~์ˆ˜๋ฐฑ GB์ˆ˜ TB ๊ฐ€๋Šฅ
CPU ์‚ฌ์šฉ๋ณดํ†ต์•ฝ๊ฐ„ โ†‘
๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ณดํ†ต์•ฝ๊ฐ„ โ†‘
์ฒ˜๋ฆฌ๋Ÿ‰๋†’์Œ์•ฝ๊ฐ„ โ†“
์ ํ•ฉ์ผ๋ฐ˜ ์„œ๋ฒ„์ €์ง€์—ฐ

Concurrent GC ์˜ trade-off

Concurrent GC ์˜ ์žฅ์ :

  • STW ์งง์Œ
  • ์‘๋‹ต์„ฑ โ†‘

Concurrent GC ์˜ ๋‹จ์ :

  • CPU ์‚ฌ์šฉ๋Ÿ‰ โ†‘
  • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ โ†‘
  • ๋ณต์žกํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ์ฒ˜๋ฆฌ๋Ÿ‰ ์•ฝ๊ฐ„ โ†“

โ†’ ์‘๋‹ต์„ฑ์„ ์œ„ํ•ด ๋‹ค๋ฅธ ์ž์› ๋” ์‚ฌ์šฉ.


๐Ÿ’ป 6. ์‹ค์ „ ์ฝ”๋“œ ์˜ˆ์‹œ

์˜ˆ์‹œ 1: ํ˜„์žฌ GC ํ™•์ธ

# ๋ฐฉ๋ฒ• 1: PrintCommandLineFlags
java -XX:+PrintCommandLineFlags -version

# ์ถœ๋ ฅ ์˜ˆ์‹œ:
# -XX:+UseG1GC โ† ์‚ฌ์šฉ ์ค‘์ธ GC

# ๋ฐฉ๋ฒ• 2: GC ๋กœ๊ทธ
java -Xlog:gc -jar myapp.jar
# ์ถœ๋ ฅ์—์„œ GC ์ด๋ฆ„ ํ™•์ธ

์˜ˆ์‹œ 2: ILIC ํ™˜๊ฒฝ์— ๋งž๋Š” GC ์„ค์ •

# ์ผ๋ฐ˜ ๋ฐฑ์—”๋“œ (Heap 2~4GB)
java -XX:+UseG1GC \
     -Xms2g -Xmx2g \
     -XX:MaxGCPauseMillis=200 \
     -XX:+HeapDumpOnOutOfMemoryError \
     -XX:HeapDumpPath=/var/log/heap-dump.hprof \
     -Xlog:gc*:file=/var/log/gc.log:time,uptime,level,tags \
     -jar ilic.jar

์˜ˆ์‹œ 3: GC ์ข…๋ฅ˜๋ณ„ ์„ฑ๋Šฅ ์ธก์ •

public class GCBenchmark {
    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        
        List<byte[]> survivors = new ArrayList<>();
        for (int i = 0; i < 1_000_000; i++) {
            byte[] data = new byte[1024];  // 1KB
            
            if (i % 1000 == 0) {
                survivors.add(data);
            }
        }
        
        long elapsed = System.currentTimeMillis() - start;
        System.out.println("Total time: " + elapsed + "ms");
    }
}

๋‹ค๋ฅธ GC ๋กœ ์‹คํ–‰:

# Serial
java -XX:+UseSerialGC GCBenchmark
# ์ถœ๋ ฅ: ~3000ms (๋‹จ์ผ ์Šค๋ ˆ๋“œ)

# Parallel
java -XX:+UseParallelGC GCBenchmark
# ์ถœ๋ ฅ: ~1500ms (๋ณ‘๋ ฌ, ์ฒ˜๋ฆฌ๋Ÿ‰ โ†‘)

# G1
java -XX:+UseG1GC GCBenchmark
# ์ถœ๋ ฅ: ~2000ms (๊ท ํ˜•)

# ZGC
java -XX:+UseZGC GCBenchmark
# ์ถœ๋ ฅ: ~2200ms (์‘๋‹ต์„ฑ, ์ฒ˜๋ฆฌ๋Ÿ‰ ์•ฝ๊ฐ„ โ†“)

โ†’ GC ์„ ํƒ์ด ์„ฑ๋Šฅ์— ์ง๊ฒฐ.


์˜ˆ์‹œ 4: ์ด์ƒ์ ์ธ GC ์˜ต์…˜ (ILIC ์šด์˜)

# ์šด์˜ ํ™˜๊ฒฝ โ€” ๊ฒ€์ฆ๋œ ์„ค์ •
java \
    # GC ์•Œ๊ณ ๋ฆฌ์ฆ˜
    -XX:+UseG1GC \
    
    # Heap ํฌ๊ธฐ (๊ณ ์ • ๊ถŒ์žฅ)
    -Xms4g -Xmx4g \
    
    # ๋ชฉํ‘œ STW
    -XX:MaxGCPauseMillis=200 \
    
    # OOM ์‹œ ์ž๋™ ๋คํ”„
    -XX:+HeapDumpOnOutOfMemoryError \
    -XX:HeapDumpPath=/var/log/heap-dump-%t.hprof \
    
    # GC ๋กœ๊ทธ
    -Xlog:gc*:file=/var/log/gc.log:time,uptime,level,tags:filecount=10,filesize=100M \
    
    # ์ถ”๊ฐ€ ๋ชจ๋‹ˆํ„ฐ๋ง
    -XX:+PrintTenuringDistribution \
    -XX:+UnlockExperimentalVMOptions \
    
    -jar ilic.jar

์˜ˆ์‹œ 5: Java 17 ๊ธฐ๋ณธ GC ํ™œ์šฉ

๋ฐ•์Šน์ œ๋‹˜์ด Java 17 ์‚ฌ์šฉ ์‹œ:

  • ๊ธฐ๋ณธ: G1 GC
  • ๊ถŒ์žฅ ์˜ต์…˜:
java \
    -Xms2g -Xmx2g \
    -XX:MaxGCPauseMillis=200 \
    -Xlog:gc*:file=/var/log/gc.log \
    -jar ilic.jar

โ†’ ๊ธฐ๋ณธ G1 ์‚ฌ์šฉ. ๋ช…์‹œ์  UseG1GC ์˜ต์…˜ ๋ถˆํ•„์š”.


์˜ˆ์‹œ 6: ZGC ์ „ํ™˜ (Java 17+)

์ €์ง€์—ฐ ํ•„์š” ์‹œ:

# Java 17+ ์˜ ZGC
java \
    -XX:+UseZGC \
    -Xms8g -Xmx8g \
    -Xlog:gc*:file=/var/log/gc.log \
    -jar ilic.jar

Java 21 ์ด์ƒ:

# Generational ZGC (๋” ํšจ์œจ์ )
java \
    -XX:+UseZGC \
    -XX:+ZGenerational \
    -Xms8g -Xmx8g \
    -jar ilic.jar

์˜ˆ์‹œ 7: GC ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ

# 1. JConsole
jconsole <pid>

# 2. VisualVM
visualvm

# 3. JFR (Java Flight Recorder)
java -XX:StartFlightRecording=duration=60s,filename=recording.jfr -jar app.jar

# 4. JMC (Java Mission Control) ๋กœ ๋ถ„์„
jmc

# 5. GC ๋กœ๊ทธ ๋ถ„์„ ๋„๊ตฌ
# - GCViewer (์˜คํ”ˆ์†Œ์Šค)
# - gceasy.io (์›น ์„œ๋น„์Šค)

โš ๏ธ 7. ์ฃผ์˜์‚ฌํ•ญ & ํ”ํ•œ ์‹ค์ˆ˜

์‹ค์ˆ˜ 1: ๊ธฐ๋ณธ GC ๊ฐ€ ํ•ญ์ƒ ์˜ณ๋‹ค๊ณ  ์ƒ๊ฐ

java -jar myapp.jar  # ๋ฌด์กฐ๊ฑด ๊ธฐ๋ณธ

๋ฌธ์ œ:

  • Java 8 ์˜ Parallel = ์ฒ˜๋ฆฌ๋Ÿ‰ ์šฐ์„ 
  • ์›น API ์—๋Š” ์‘๋‹ต์„ฑ ๋ถ€์กฑ โ†’ ์‚ฌ์šฉ์ž ์˜ํ–ฅ

๊ถŒ์žฅ: ์ƒํ™ฉ์— ๋งž๋Š” GC ๋ช…์‹œ์  ์„ ํƒ.


์‹ค์ˆ˜ 2: CMS ์‚ฌ์šฉ ์‹œ๋„ (Java 14+)

java -XX:+UseConcMarkSweepGC -jar app.jar  # โŒ Java 14+์—์„œ ์ œ๊ฑฐ

๋Œ€์ฒด:

  • G1 (์ €์ง€์—ฐ OK)
  • ZGC (๋งค์šฐ ์ €์ง€์—ฐ)

์‹ค์ˆ˜ 3: ๋ฌด์กฐ๊ฑด ZGC

"์ €์ง€์—ฐ = ZGC = ์ข‹๋‹ค"

์ง„์‹ค:

  • ์ž‘์€ Heap ์—์„œ๋Š” ์˜ค๋ฒ„ํ—ค๋“œ
  • CPU/๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ โ†‘
  • ์ฒ˜๋ฆฌ๋Ÿ‰ ์•ฝ๊ฐ„ โ†“

์›์น™: Heap ํฌ๊ธฐ + ์šฐ์„ ์ˆœ์œ„ ์— ๋งž๊ฒŒ.


์‹ค์ˆ˜ 4: -Xmx ๋งŒ ์„ค์ •, ๋‹ค๋ฅธ ์˜ต์…˜ ๋ฌด์‹œ

java -Xmx8g -jar myapp.jar

๋ˆ„๋ฝ:

  • -Xms (์ดˆ๊ธฐ Heap) โ€” ์ดˆ๊ธฐ ์ž‘์œผ๋ฉด ๋™์  ํ™•์žฅ ๋น„์šฉ
  • -Xlog:gc (๋กœ๊ทธ) โ€” ๋ถ„์„ ๋ถˆ๊ฐ€
  • -XX:+HeapDumpOnOutOfMemoryError โ€” ์‚ฌ๊ณ  ์‹œ ๋คํ”„ X

๊ถŒ์žฅ ์ตœ์†Œ ์˜ต์…˜:

java -Xms4g -Xmx4g \
     -Xlog:gc*:file=/var/log/gc.log \
     -XX:+HeapDumpOnOutOfMemoryError \
     -XX:HeapDumpPath=/var/log/ \
     -jar myapp.jar

์‹ค์ˆ˜ 5: -Xms โ‰  -Xmx

java -Xms512m -Xmx4g -jar myapp.jar

๋ฌธ์ œ:

  • ์ดˆ๊ธฐ 512MB โ†’ ๋™์  ํ™•์žฅ ์‹œ ๋น„์šฉ
  • GC ๊ฐ€ ์ž‘์€ Heap ์—์„œ ์ž์ฃผ ๋ฐœ์ƒ
  • โ†’ ์ ์ง„์  ์„ฑ๋Šฅ ์ €ํ•˜

๊ถŒ์žฅ: Xms == Xmx (๋™์ผ ๊ฐ’)

java -Xms4g -Xmx4g -jar myapp.jar

์‹ค์ˆ˜ 6: GC ๋กœ๊ทธ ๋ฌด์„ค์ •

์šด์˜ ํ™˜๊ฒฝ:

  • GC ๋กœ๊ทธ X
  • ์‚ฌ๊ณ  ๋ฐœ์ƒ โ†’ ๋ถ„์„ ๋ถˆ๊ฐ€

ํ•ด๊ฒฐ: ํ•ญ์ƒ GC ๋กœ๊ทธ ํ™œ์„ฑํ™”.


์‹ค์ˆ˜ 7: G1 ์˜ Region ํฌ๊ธฐ ์ž˜๋ชป ์„ค์ •

java -XX:+UseG1GC -XX:G1HeapRegionSize=64m -Xmx2g -jar app.jar

๋ฌธ์ œ:

  • 2GB Heap ์— 64MB Region โ†’ 32๊ฐœ๋งŒ
  • G1 ์˜ ํšจ์œจ X

๊ถŒ์žฅ: G1 ์ž๋™ ๊ณ„์‚ฐ ์‚ฌ์šฉ (์˜ต์…˜ ์ƒ๋žต).


๐Ÿ”— 8. ์—ฐ๊ด€ ๊ฐœ๋… ๋งต

Phase 5 (GC) ์™„์„ฑ โญ

[Unit 5.1: GC ๊ธฐ๋ณธ + ์•ฝํ•œ ์„ธ๋Œ€ ๊ฐ€์„ค] โœ“
        โ†“
[Unit 5.2: Heap ์˜ ์„ธ๋Œ€ ๊ตฌ์กฐ] โœ“
        โ†“
[Unit 5.3: GC ์•Œ๊ณ ๋ฆฌ์ฆ˜ 4๊ฐ€์ง€] โœ“
        โ†“
[Unit 5.4: GC ์ข…๋ฅ˜์™€ ์„ ํƒ ๊ธฐ์ค€] โ† ์ง€๊ธˆ ์—ฌ๊ธฐ โ˜…
        โ†“
[Phase 5 ์™„๋ฃŒ!] ๐ŸŽ‰

โ†’ Phase 5 ์™„๋ฃŒ. ๋‹ค์Œ์€ Phase 6 ๋ฐ์ดํ„ฐ ๋‹ค๋ฃจ๊ธฐ.


Phase 4 ์™€์˜ ํ†ตํ•ฉ

ํ•™์ŠตGC ์„ ํƒ ๊ด€์ 
Unit 4.1 (Heap ์˜์—ญ)GC ์˜ ๋ฌด๋Œ€
Unit 4.2 (Pass by Value)๊ฐ์ฒด ์ฐธ์กฐ โ†’ GC ์˜ํ–ฅ
Unit 5.1 (์•ฝํ•œ ์„ธ๋Œ€)Generational ์˜ ๊ธฐ๋ฐ˜
Unit 5.2 (์„ธ๋Œ€ ๊ตฌ์กฐ)G1 ์˜ Region ์ดํ•ด
Unit 5.3 (์•Œ๊ณ ๋ฆฌ์ฆ˜)GC ์ข…๋ฅ˜์˜ ํ† ๋Œ€

๋ฏธ๋ž˜ ์ฃผ์ฐจ์™€์˜ ์—ฐ๊ฒฐ

4์ฃผ์ฐจ (๋™์‹œ์„ฑ):

  • ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ + GC
  • Concurrent GC (G1, ZGC) ๊ฐ€ Application Thread ์™€ ๋™์‹œ

5์ฃผ์ฐจ (Spring DI):

  • Bean Singleton โ†’ Old Generation
  • GC ์˜ํ–ฅ ์ ์Œ

11-12์ฃผ์ฐจ (JPA):

  • ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ โ†’ ํŠธ๋žœ์žญ์…˜ ๋‹จ์œ„
  • ํŠธ๋žœ์žญ์…˜ ์ข…๋ฃŒ ์‹œ GC

13-14์ฃผ์ฐจ (DB/Cache):

  • ํฐ ์บ์‹œ = Heap ์••๋ฐ•
  • WeakHashMap, Caffeine ํ™œ์šฉ

17์ฃผ์ฐจ (MSA):

  • ๊ฐ ์„œ๋น„์Šค ๋ณ„๋„ JVM
  • ์„œ๋น„์Šค๋งˆ๋‹ค GC ์„ ํƒ

19์ฃผ์ฐจ (ํ…Œ์ŠคํŠธ):

  • ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ GC (๋ณดํ†ต Serial ๋„ OK)

์šด์˜ GC ์„ ํƒ ๊ฐ€์ด๋“œ โญ (์‹ค์šฉ)

์ƒˆ ILIC ์„œ๋น„์Šค ์‹œ์ž‘
        โ†“
Java ๋ฒ„์ „?
  โ”œโ”€โ”€ 8: Parallel ๊ธฐ๋ณธ (๋ณ€๊ฒฝ ๊ถŒ์žฅ โ€” G1)
  โ””โ”€โ”€ 11+: G1 ๊ธฐ๋ณธ (๋Œ€๋ถ€๋ถ„ ๊ทธ๋Œ€๋กœ)
        โ†“
์‘๋‹ต ์‹œ๊ฐ„ SLA?
  โ”œโ”€โ”€ 1์ดˆ+ OK: G1 (๊ธฐ๋ณธ)
  โ”œโ”€โ”€ 200ms ๋ชฉํ‘œ: G1 + MaxGCPauseMillis=200
  โ””โ”€โ”€ 100ms ๋ฏธ๋งŒ: ZGC ๊ณ ๋ ค
        โ†“
Heap ํฌ๊ธฐ?
  โ”œโ”€โ”€ ~4GB: G1
  โ”œโ”€โ”€ 4~32GB: G1 (ํŠœ๋‹ ๊ฐ€๋Šฅ)
  โ””โ”€โ”€ 32GB+: ZGC ๊ฐ•๋ ฅ ๊ถŒ์žฅ
        โ†“
Java 21+?
  โ””โ”€โ”€ ZGC ์‚ฌ์šฉ ์‹œ +ZGenerational

๋ฉด์ ‘ ๋‹จ๊ณจ ์งˆ๋ฌธ ๋งคํ•‘

์งˆ๋ฌธ์ด Unit์—์„œ์˜ ๋‹ต
"GC ์ข…๋ฅ˜?"Serial, Parallel, CMS (deprecated), G1, ZGC, Shenandoah
"Java 8/9 ๊ธฐ๋ณธ GC ๋ณ€ํ™”?"Parallel โ†’ G1
"G1 vs ZGC?"G1 = ๊ท ํ˜•, ZGC = ์ €์ง€์—ฐ
"ILIC ์—์„œ ์–ด๋–ค GC?""G1 ์‚ฌ์šฉํ–ˆ๊ณ , MaxGCPauseMillis=200"
"CMS ๊ฐ€ deprecated ๋œ ์ด์œ ?"๋‹จํŽธํ™” + ๋ณต์žก์„ฑ

๐Ÿ“ 9. ํ•ต์‹ฌ ์š”์•ฝ โ€” 3์ค„ ์ •๋ฆฌ

1๏ธโƒฃ ์ž๋ฐ” GC ๋Š” 6๊ฐ€์ง€ โ€” Serial, Parallel, CMS (deprecated), G1, ZGC, Shenandoah.

Serial = ๋‹จ์ผ ์Šค๋ ˆ๋“œ (์ž‘์€ ํ™˜๊ฒฝ), Parallel = ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ (Java 8 ๊ธฐ๋ณธ, ์ฒ˜๋ฆฌ๋Ÿ‰), CMS = Concurrent (Java 14์—์„œ ์ œ๊ฑฐ), G1 = Region ๊ธฐ๋ฐ˜ (Java 9+ ๊ธฐ๋ณธ, ์ผ๋ฐ˜ ๋ฐฑ์—”๋“œ), ZGC = Colored Pointer (์ €์ง€์—ฐ, ํฐ Heap), Shenandoah = Red Hat ์˜ ZGC ์œ ์‚ฌํ’ˆ. ๋ชจ๋‘ Generational + ์ถ”๊ฐ€ ์ตœ์ ํ™”.

2๏ธโƒฃ G1 ์€ ์ผ๋ฐ˜ ๋ฐฑ์—”๋“œ์˜ ํ‘œ์ค€, ZGC ๋Š” ์ €์ง€์—ฐ์˜ ๋‹ต.

G1 ์˜ Region ๊ธฐ๋ฐ˜ + Garbage First ์ „๋žต์œผ๋กœ ๋ชฉํ‘œ STW ์„ค์ • (MaxGCPauseMillis=200) ๊ฐ€๋Šฅ. ํฐ Heap ์—์„œ๋„ ํšจ์œจ์ . ZGC ์˜ Colored Pointer + Load Barrier ๋กœ STW 10ms ์ดํ•˜ (Heap ํฌ๊ธฐ ๋ฌด๊ด€). ์‘๋‹ต์„ฑ vs ์ฒ˜๋ฆฌ๋Ÿ‰/๋ฉ”๋ชจ๋ฆฌ์˜ trade-off โ€” ๋ฐ•์Šน์ œ๋‹˜์˜ Java 17 + ILIC 4GB Heap ํ™˜๊ฒฝ์ด๋ผ๋ฉด G1 ์ด ์ •๋‹ต.

3๏ธโƒฃ GC ์„ ํƒ์€ Heap ํฌ๊ธฐ + ์šฐ์„ ์ˆœ์œ„์˜ ๋‹ต์ด๋‹ค.

~100MB โ†’ Serial, ~4GB โ†’ G1 (๋˜๋Š” ์ฒ˜๋ฆฌ๋Ÿ‰ ์šฐ์„ ์ด๋ฉด Parallel), 4~32GB โ†’ G1, 32GB+ ๋˜๋Š” ์ €์ง€์—ฐ โ†’ ZGC. ์šด์˜ ์‹œ ํ•ญ์ƒ GC ๋กœ๊ทธ ํ™œ์„ฑํ™” + HeapDumpOnOutOfMemoryError + Xms=Xmx ๊ถŒ์žฅ. Java 14+ ์—์„œ CMS ์‚ฌ์šฉ ์‹œ๋„๋Š” X. ์ด๋Ÿฐ ๋ช…ํ™•ํ•œ ๊ธฐ์ค€์œผ๋กœ GC ์„ ํƒํ•  ์ˆ˜ ์žˆ์–ด์•ผ ์‹œ๋‹ˆ์–ด ์ž๋ฐ” ๊ฐœ๋ฐœ์ž.


๐ŸŽ“ ํ•™์Šต ์ž๊ธฐ ์ ๊ฒ€

๊ธฐ๋ณธ ์ดํ•ด

  • 6๊ฐ€์ง€ GC ์ข…๋ฅ˜๋ฅผ ๋‚˜์—ดํ•  ์ˆ˜ ์žˆ๋‹ค
  • ๊ฐ GC ์˜ ํŠน์ง•์„ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค
  • Java ๋ฒ„์ „๋ณ„ ๊ธฐ๋ณธ GC ์˜ ๋ณ€ํ™”๋ฅผ ์•ˆ๋‹ค
  • CMS ๊ฐ€ deprecated ๋œ ์ด์œ ๋ฅผ ์•ˆ๋‹ค

์‹ค์ „ ์ ์šฉ

  • ILIC ํ™˜๊ฒฝ์— ๋งž๋Š” GC ๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค
  • JVM ์˜ต์…˜์œผ๋กœ GC ๋ฅผ ๋ช…์‹œ์  ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค
  • GC ๋กœ๊ทธ์—์„œ ์‚ฌ์šฉ GC ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค
  • Heap ํฌ๊ธฐ์— ๋งž๋Š” GC ๋ฅผ ๊ถŒ์žฅํ•  ์ˆ˜ ์žˆ๋‹ค

๋ฉด์ ‘ ๋Œ€๋น„ (5๋ถ„ ๋‹ต๋ณ€)

  • "GC ์ข…๋ฅ˜?" ๋‹ต๋ณ€ ๊ฐ€๋Šฅ
  • "G1 vs ZGC?" ๋‹ต๋ณ€ ๊ฐ€๋Šฅ
  • "ILIC ์—์„œ ์–ด๋–ค GC?" ๋‹ต๋ณ€ ๊ฐ€๋Šฅ
  • "Java 9 ๊ธฐ๋ณธ GC ๋ณ€๊ฒฝ ์ด์œ ?" ๋‹ต๋ณ€ ๊ฐ€๋Šฅ

์ž๊ธฐ ์ ๊ฒ€ ์งˆ๋ฌธ ๋‹ต๋ณ€

Q1: G1 GC ๊ฐ€ ํฐ Heap ์— ์ ํ•ฉํ•œ ์ด์œ ๋Š”?

ํ•œ ์ค„ ๋‹ต: Region ๊ธฐ๋ฐ˜ + Garbage First ์ „๋žต + ๋ชฉํ‘œ STW ์„ค์ • ๊ฐ€๋Šฅ ์œผ๋กœ ํฐ Heap ์—์„œ๋„ STW ์งง๊ฒŒ ์œ ์ง€.

์ƒ์„ธ ์„ค๋ช…:

์ „ํ†ต Generational GC ์˜ ๋ฌธ์ œ

๊ธฐ์กด (Parallel, Serial) GC:

[Heap 16GB]
โ”œโ”€โ”€ Young (5GB)
โ””โ”€โ”€ Old (11GB)

Old GC (Major GC) ์‹œ:

  • 11GB ์ „์ฒด ๋งˆํ‚น + ์••์ถ•
  • ๋‹จ์ผ ์ž‘์—…์œผ๋กœ ์ฒ˜๋ฆฌ
  • โ†’ STW ๋งค์šฐ ๊น€ (์ˆ˜ ์ดˆ)

ํฐ Heap = ๊ธด STW โš ๏ธ.


G1 ์˜ ํ•ด๊ฒฐ โ€” Region ๋ถ„ํ• 

[Heap 16GB]
โ”œโ”€โ”€ Region 0 (4MB)
โ”œโ”€โ”€ Region 1 (4MB)
โ”œโ”€โ”€ Region 2 (4MB)
โ”œโ”€โ”€ ... 4000๊ฐœ Region
โ””โ”€โ”€ Region 3999

Region ์˜ ์˜๋ฏธ:

  • Heap ์„ 4MB Region ๋“ค๋กœ ๋ถ„ํ• 
  • ๊ฐ Region ์ด ๋™์  ์—ญํ•  (Eden/Survivor/Old/Humongous)
  • ํ•œ ๋ฒˆ์— ์ผ๋ถ€ Region ๋งŒ ์ฒ˜๋ฆฌ

Garbage First ์ „๋žต

GC ์‹œ ๊ฒฐ์ •:
"์–ด๋–ค Region ๋ถ€ํ„ฐ ์ฒญ์†Œํ• ๊นŒ?"

๊ฐ Region ์˜ Garbage ๋น„์œจ ๋ถ„์„:
- Region A: 80% Garbage
- Region B: 20% Garbage
- Region C: 90% Garbage
- Region D: 10% Garbage

์„ ํƒ: ํšจ์œจ ๋†’์€ ์ˆœ์„œ
- Region C (90%)
- Region A (80%)
- Region B (20%) โ€” ํšจ์œจ ๋‚ฎ์Œ โ†’ ์Šคํ‚ต

ํšจ๊ณผ:

  • Garbage ๊ฐ€ ๋งŽ์€ Region = ์ฒญ์†Œ ๋น„์šฉ ๋Œ€๋น„ ํšŒ์ˆ˜๋Ÿ‰ ๋งŽ์Œ
  • โ†’ ์‹œ๊ฐ„ ๋Œ€๋น„ ํšจ์œจ โ†‘

๋ชฉํ‘œ STW ์„ค์ •

-XX:MaxGCPauseMillis=200   # ๋ชฉํ‘œ STW 200ms

G1 ์˜ ๋™์ž‘:
1. 200ms ์•ˆ์— ๋๋‚ผ ์ˆ˜ ์žˆ๋Š” Region ์ˆ˜ ๊ณ„์‚ฐ
2. ๊ทธ๋งŒํผ๋งŒ ์ฒญ์†Œ
3. ๋‹ค์Œ GC ์—์„œ ๋‚˜๋จธ์ง€ ์ฒ˜๋ฆฌ

์˜ˆ์‹œ:

  • 200ms ์•ˆ์— 50 Region ์ฒญ์†Œ ๊ฐ€๋Šฅ ์ถ”์ •
  • ํšจ์œจ ๋†’์€ 50 Region ์„ ์ •
  • ์ฒญ์†Œ ํ›„ STW ์ข…๋ฃŒ

โ†’ ํ•ญ์ƒ 200ms ์•ˆ์— GC ์™„๋ฃŒ.


Concurrent Marking

G1 ์€ ์ผ๋ถ€ ์ž‘์—…์„ Application Thread ์™€ ๋™์‹œ ์‹คํ–‰:

1. Initial Mark (STW, ์งง์Œ)
2. Concurrent Mark (Application ๊ณผ ๋™์‹œ) โญ
3. Remark (STW, ์งง์Œ)
4. Cleanup (Concurrent + ์งง์€ STW)
5. Mixed GC (Young + ์ผ๋ถ€ Old)

ํšจ๊ณผ:

  • ํฐ Heap ์˜ ๋งˆํ‚น ์ž‘์—…์ด Concurrent ๋กœ ์ฒ˜๋ฆฌ
  • STW ๋Š” ์งง์€ ๋‹จ๊ณ„๋งŒ

ํฐ Heap ์—์„œ์˜ ํšจ๊ณผ ๋น„๊ต

Heap 16GB, Old ๊ฐ€๋“:

Parallel GC:

Full GC:
- 16GB ์ „์ฒด ๋งˆํ‚น (์ˆ˜ ์ดˆ)
- ์••์ถ• (์ˆ˜ ์ดˆ)
- ์ด STW: 5~10์ดˆ โš ๏ธ

G1 GC:

Mixed GC:
- Concurrent Mark (์ˆ˜ ์ดˆ, ๋™์‹œ ์‹คํ–‰)
- 200ms ๋งŒํผ Region ์ฒญ์†Œ
- ๋ถ€์กฑํ•˜๋ฉด ๋‹ค์Œ GC ์—์„œ ๋”
- ์ด STW: 200ms โœ…

โ†’ ํฐ Heap ์ผ์ˆ˜๋ก G1 ์˜ ํšจ๊ณผ โ†‘.


Humongous Object ์ฒ˜๋ฆฌ

G1 ๋งŒ์˜ ํŠน์ˆ˜ ์ฒ˜๋ฆฌ:

  • Region ์˜ ์ ˆ๋ฐ˜ ์ด์ƒ ๊ฐ์ฒด = Humongous
  • ๋ณ„๋„ Humongous Region
  • ํฐ ๊ฐ์ฒด ํšจ์œจ์  ์ฒ˜๋ฆฌ

๊ฒฐ๋ก 

"G1 ์˜ Region ๊ธฐ๋ฐ˜ ์„ค๊ณ„์™€ Garbage First ์ „๋žต์ด ํฐ Heap ์—์„œ STW ๋ฅผ ์งง๊ฒŒ ์œ ์ง€.
Concurrent Marking ์œผ๋กœ Application ๊ณผ ๋™์‹œ ์ž‘์—… + ๋ชฉํ‘œ STW ์„ค์ • ์œผ๋กœ ์‘๋‹ต์„ฑ ๋ณด์žฅ.
๊ทธ๋ž˜์„œ 4GB ์ด์ƒ ํฐ Heap ์— ์ ํ•ฉ."


Q2: ZGC ์™€ G1 ์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด๋Š”?

ํ•œ ์ค„ ๋‹ต: STW ๊ธธ์ด์˜ ์ฐจ์›์ด ๋‹ค๋ฆ„ โ€” G1 ~200ms vs ZGC ~10ms ์ดํ•˜.

์ƒ์„ธ ๋น„๊ต:

1. STW ์‹œ๊ฐ„

G1ZGC
๋ชฉํ‘œ STW~200ms~10ms ์ดํ•˜
Heap ํฌ๊ธฐ์™€ ๊ด€๊ณ„์–ด๋А ์ •๋„ ๋น„๋ก€๋ฌด๊ด€
ํฐ Heap ์—์„œSTW ๊ธธ์–ด์งSTW ๊ทธ๋Œ€๋กœ

ZGC ์˜ ๋งˆ๋ฒ• โ€” Heap ์ด 100GB ๋“  1TB ๋“  STW ๋™์ผ (~10ms).


2. ๋™์ž‘ ๋ฉ”์ปค๋‹ˆ์ฆ˜

G1:

  • Region ๊ธฐ๋ฐ˜
  • Concurrent Marking + ๋ถ€๋ถ„ GC
  • ์ผ๋ถ€ ์ž‘์—…์€ STW

ZGC:

  • Colored Pointers (ํฌ์ธํ„ฐ์— ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ)
  • Load Barrier (์ฐธ์กฐ ์‹œ ์ž๋™ ์ฒ˜๋ฆฌ)
  • ๊ฑฐ์˜ ๋ชจ๋“  ์ž‘์—…์ด Concurrent
  • STW ๋Š” ๋งค์šฐ ์งง์€ ๋‹จ๊ณ„๋งŒ

3. ๋ฉ”๋ชจ๋ฆฌ/CPU ์‚ฌ์šฉ

G1ZGC
๋ฉ”๋ชจ๋ฆฌ ์˜ค๋ฒ„ํ—ค๋“œ๋ณดํ†ต์•ฝ๊ฐ„ โ†‘
CPU ์‚ฌ์šฉ๋ณดํ†ต์•ฝ๊ฐ„ โ†‘
์ฒ˜๋ฆฌ๋Ÿ‰๋†’์Œ์•ฝ๊ฐ„ โ†“

โ†’ ZGC ๋Š” ์‘๋‹ต์„ฑ์„ ์œ„ํ•ด ๋‹ค๋ฅธ ์ž์› ๋” ์‚ฌ์šฉ.


4. Heap ํฌ๊ธฐ ๊ถŒ์žฅ

G1:

  • 4GB ~ ์ˆ˜์‹ญ GB
  • ๋งค์šฐ ์ž‘์€ Heap ์—์„œ๋Š” ์˜ค๋ฒ„ํ—ค๋“œ

ZGC:

  • ์ˆ˜ GB ~ ์ˆ˜ TB (16TB ๊นŒ์ง€ ๊ฒ€์ฆ๋จ)
  • ํฐ Heap ์—์„œ ์ง„๊ฐ€ ๋ฐœํœ˜
  • ์ž‘์€ Heap (~์ˆ˜ GB) ์—์„œ๋Š” G1 ๋ณด๋‹ค ๋น„ํšจ์œจ

5. ๋“ฑ์žฅ ์‹œ๊ธฐ์™€ ์„ฑ์ˆ™๋„

G1:

  • Java 7 ๋„์ž… (2011)
  • Java 9 ๊ธฐ๋ณธ (2017)
  • ๋งค์šฐ ์„ฑ์ˆ™, ๊ธฐ๋ณธ ๊ถŒ์žฅ

ZGC:

  • Java 11 ์‹คํ—˜์  (2018)
  • Java 15 ์ •์‹ (2020)
  • Java 21 Generational ZGC (2023)
  • ๋น ๋ฅด๊ฒŒ ์„ฑ์ˆ™ ์ค‘

6. ์ ํ•ฉ ํ™˜๊ฒฝ

G1 ์˜ ์˜์—ญ:

  • ์ผ๋ฐ˜ ๋ฐฑ์—”๋“œ (๋Œ€๋ถ€๋ถ„์˜ ILIC ๊ฐ™์€ ์‹œ์Šคํ…œ)
  • 4GB ~ 32GB Heap
  • ์‘๋‹ต์„ฑ ์ค‘์š”ํ•˜์ง€๋งŒ ms ๋‹จ์œ„๋Š” ์•„๋‹˜

ZGC ์˜ ์˜์—ญ:

  • ์ €์ง€์—ฐ ์‹œ์Šคํ…œ (์‹ค์‹œ๊ฐ„ ๊ฑฐ๋ž˜, ๊ฒŒ์ž„ ์„œ๋ฒ„)
  • ํฐ Heap (32GB+)
  • ms ๋‹จ์œ„ ์‘๋‹ต์„ฑ ํ•„์ˆ˜

๋น„์œ  โ€” ์ฒญ์†Œ ์„œ๋น„์Šค

G1 = ์ •๊ธฐ ์ฒญ์†Œ:

  • ์‚ฌ๋ฌด์‹ค ์ž ๊น ๋ฉˆ์ถ”๊ณ  (200ms)
  • ํšจ์œจ์ ์œผ๋กœ ์ฒญ์†Œ
  • ๋น„์šฉ ํ•ฉ๋ฆฌ์ 

ZGC = 24์‹œ๊ฐ„ ์ฒญ์†Œ๋ถ€:

  • ๊ฑฐ์˜ ๋ฉˆ์ถ”์ง€ ์•Š๊ณ 
  • ํ•ญ์ƒ ๋ฐฐ๊ฒฝ์—์„œ ์ž‘์—…
  • ์ธ์ง€ ๋ชป ํ•จ (10ms ์ •๋„๋งŒ)
  • ๋น„์šฉ ๋” ๋“ฆ (CPU/๋ฉ”๋ชจ๋ฆฌ)

ILIC ์‹œ๋‚˜๋ฆฌ์˜ค๋ณ„ ์„ ํƒ

Case 1: ์ผ๋ฐ˜ ILIC API (Heap 4GB):

G1 โญ
- ์ถฉ๋ถ„ํ•œ ์‘๋‹ต์„ฑ (200ms)
- ๋‹จ์ˆœํ•œ ์šด์˜
- Java 17 ๊ธฐ๋ณธ

Case 2: ILIC ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ (Heap 8GB):

G1 ๊ฐ€๋Šฅ, ZGC ๋„ OK
- G1 + MaxGCPauseMillis=100 ์‹œ๋„
- ๋ถ€์กฑํ•˜๋ฉด ZGC ์ „ํ™˜

Case 3: ILIC ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ๋ถ„์„ (Heap 64GB):

ZGC โญ
- ํฐ Heap ์—์„œ STW ์•ˆ์ •
- ์ฒ˜๋ฆฌ๋Ÿ‰ ์•ฝ๊ฐ„ ์†์‹ค OK

๊ฒฐ๋ก 

"G1 = ์ผ๋ฐ˜ ๋ฐฑ์—”๋“œ์˜ ๊ท ํ˜• (์‘๋‹ต์„ฑ + ์ฒ˜๋ฆฌ๋Ÿ‰),
ZGC = ์ €์ง€์—ฐ ์‹œ์Šคํ…œ์˜ ๋‹ต (์‘๋‹ต์„ฑ ์ตœ์šฐ์„ ).
์ฐจ์ด๋Š” STW ์˜ ์ฐจ์› ๊ณผ Heap ํฌ๊ธฐ ์˜์กด์„ฑ.
ILIC ๊ฐ™์€ ์ผ๋ฐ˜ ๋ฐฑ์—”๋“œ๋Š” G1 ๊ฐ€ ์ •๋‹ต, ์ €์ง€์—ฐ ํ•„์š” ์‹œ ZGC ๊ฒ€ํ† ."


๐ŸŽ‰ Phase 5 ์™„๋ฃŒ ์ถ•ํ•˜!

ํ•™์Šตํ•œ 4๊ฐœ Unit

Unit์ฃผ์ œํ•ต์‹ฌ
5.1GC ๊ธฐ๋ณธ + ์•ฝํ•œ ์„ธ๋Œ€ ๊ฐ€์„ค โ˜…โ˜…โ˜…Reachability, GC Root, STW
5.2Heap ์˜ ์„ธ๋Œ€ ๊ตฌ์กฐ โ˜…โ˜…โ˜…Eden/Survivor/Old, Promotion
5.3GC ์•Œ๊ณ ๋ฆฌ์ฆ˜ 4๊ฐ€์ง€RC, Mark-Sweep, MSC, Generational
5.4GC ์ข…๋ฅ˜์™€ ์„ ํƒ ๊ธฐ์ค€ โ˜…โ˜…โ˜…Serial/Parallel/G1/ZGC

Phase 5 ์˜ ํ•ต์‹ฌ ํ†ต์ฐฐ

"GC ๋Š” ์ž๋ฐ”์˜ ์ •์ˆ˜๋‹ค. ์„ธ๋Œ€ ๊ฐ€์„ค โ†’ ์„ธ๋Œ€ ๊ตฌ์กฐ โ†’ ์•Œ๊ณ ๋ฆฌ์ฆ˜ โ†’ ์ข…๋ฅ˜ โ†’ ์„ ํƒ โ€” ๋ชจ๋‘ ํ•œ ํ๋ฆ„."

์•ฝํ•œ ์„ธ๋Œ€ ๊ฐ€์„ค์ด๋ผ๋Š” ํ†ต์ฐฐ์ด Heap ์˜ ์„ธ๋Œ€ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค๊ณ , ์˜์—ญ๋งˆ๋‹ค ๋‹ค๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉํ•˜๊ณ , ๊ฐ ํ™˜๊ฒฝ์— ๋งž๋Š” GC ์ข…๋ฅ˜๋กœ ์ง„ํ™”. Phase 4 + Phase 5 ๊ฐ€ ์ž๋ฐ” ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์˜ ์™„์ „ํ•œ ์ดํ•ด.

Phase 6 ๋ฏธ๋ฆฌ๋ณด๊ธฐ โ€” ๋ฐ์ดํ„ฐ ๋‹ค๋ฃจ๊ธฐ

๋‹ค์Œ์€ ์ž๋ฐ”์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ•:

  • String, StringBuilder, StringBuffer โ€” ๋ฌธ์ž์—ด์˜ ์ง„์‹ค
  • String Constant Pool โ€” ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ
  • ArrayList vs LinkedList โ€” ์ปฌ๋ ‰์…˜ ์„ ํƒ
  • HashMap, TreeMap, LinkedHashMap โ€” Map ์˜ ์ข…๋ฅ˜

โ†’ ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋ธ (Phase 4-5) ์ดํ•ด ์œ„์—์„œ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋‹ค๋ฃธ.


๋‹ค์Œ ํ•™์Šต์œผ๋กœ

  • Phase 6 ํ•™์Šต ์ค€๋น„ ์™„๋ฃŒ
  • String Constant Pool, ์ปฌ๋ ‰์…˜ ์ž๋ฃŒ๊ตฌ์กฐ๊ฐ€ ๊ถ๊ธˆํ•˜๋‹ค
  • HashMap ์˜ ๋‚ด๋ถ€ ๋™์ž‘์„ ๋งŒ๋‚  ์ค€๋น„ ์™„๋ฃŒ
profile
Software Developer

0๊ฐœ์˜ ๋Œ“๊ธ€