๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’Ž/Java

[Java] GC ๋ฐฉ์‹

by dar0m! 2021. 8. 25.

JDK 5.0์ด์ƒ์—์„œ ์ง€์›ํ•˜๋Š” GC ๋ฐฉ์‹์—๋Š” ๋„ค๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. WAS๋‚˜ ์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ˆ˜ํ–‰์‹œ ์˜ต์…˜์„ ์ง€์ •ํ•˜์—ฌ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค.

4๊ฐ€์ง€ GC(๊ฐ€๋น„์ง€ ์ฝœ๋ ‰ํ„ฐ) ๋ฐฉ์‹

  1. Serial GC (์‹œ๋ฆฌ์–ผ ์ฝœ๋ ‰ํ„ฐ)
  2. Parallel GC (๋ณ‘๋ ฌ ์ฝœ๋ ‰ํ„ฐ)
  3. Parallel Compacting GC (Parallel Old GC, ๋ณ‘๋ ฌ ์ปดํŒฉํŒ… ์ฝœ๋ ‰ํ„ฐ)
  4. Concurrent Mark-Sweep GC (CMS ์ฝœ๋ ‰ํ„ฐ)
  5. Garbage First GC (G1 GC)

 

JVM GC ๋™์ž‘ ์ˆœ์„œ

์š”์•ฝํ•˜๋ฉด GC ๋™์ž‘์€ ์•„๋ž˜ 3 STEP์œผ๋กœ ๋‚˜๋ˆ ์ง„๋‹ค.

  1. Heap ์˜์—ญ์— ์กด์žฌํ•˜๋Š” ๊ฐ์ฒด๋“ค์— ๋Œ€ํ•ด ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธํ•œ๋‹ค.
  2. GC Root์—์„œ ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ์ฐธ์กฐ๊ฐ’์„ ๋”ฐ๋ผ๊ฐ€๋ฉฐ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด๋“ค์— Markํ•˜๋Š” ๊ณผ์ •์„ ์ง„ํ–‰ํ•œ๋‹ค.
  3. Mark ๋˜์ง€ ์•Š์€ ๊ฐ์ฒด ์ฆ‰, ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” ๊ฐ์ฒด๋Š” ์ œ๊ฑฐ(Sweep) ๋Œ€์ƒ์ด ๋œ๊ณ , ํ•ด๋‹น ๊ฐ์ฒด๋“ค์„ ์ œ๊ฑฐํ•œ๋‹ค.

์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด ํŒ๋‹จ ๊ณผ์ •

GC Root์—์„œ ์‹œ์ž‘ํ•ด์„œ ์ฐธ์กฐํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์ฐพ๊ณ , ๋˜ ๊ทธ ๊ฐ์ฒด๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์ฐพ์•„๊ฐ€๋ฉฐ Mark ํ•œ๋‹ค.

Mark ๋˜์ง€ ์•Š์€ ๊ฐ์ฒด๋Š” ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” ๊ฐ์ฒด (Unreachable Object)๋กœ ํŒ๋‹จํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋Œ๋ฉฐ ์ œ๊ฑฐ(Sweep)ํ•œ๋‹ค.

GC Root๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ๋Œ€์ƒ

  • JVM ๋ฉ”๋ชจ๋ฆฌ์˜ Stack ์˜์—ญ์— ์กด์žฌํ•˜๋Š” ์ฐธ์กฐ ๋ณ€์ˆ˜
  • Method Area์˜ static ๋ฐ์ดํ„ฐ
  • JNI์— ์˜ํ•ด ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋“ค

 

1. Serial GC

Young ์˜์—ญ๊ณผ Old ์˜์—ญ์ด ์‹œ๋ฆฌ์–ผํ•˜๊ฒŒ(์—ฐ์†์ ์œผ๋กœ) ์ฒ˜๋ฆฌ๋˜๋ฉฐ ํ•˜๋‚˜์˜ CPU๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์ด ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ๋ฅผ Stop-the-world๋ผ๊ณ  ํ‘œํ˜„ํ•œ๋‹ค. ๋‹ค์‹œ ๋งํ•˜๋ฉด, ์ฝœ๋ ‰์…˜์ด ์ˆ˜ํ–‰๋  ๋•Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ˆ˜ํ–‰์ด ์ •์ง€๋œ๋‹ค.

  • ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ๋ฐฉ์‹์˜ GC๋กœ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ(์Šค๋ ˆ๋“œ 1๊ฐœ)๋กœ ๋™์ž‘ํ•œ๋‹ค.
  • ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋กœ ๋™์ž‘ํ•˜์—ฌ ๋А๋ฆฌ๊ณ , ๊ทธ๋งŒํผ Stop The World ์‹œ๊ฐ„์ด ๋‹ค๋ฅธ GC์— ๋น„ํ•ด ๊ธธ๋‹ค.
  • Mark & Sweep & Compact ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉ
  • ๋ณดํ†ต ์‹ค๋ฌด์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์—†์Œ (๋””๋ฐ”์ด์Šค ์„ฑ๋Šฅ์ด ์•ˆ์ข‹์•„์„œ CPU ์ฝ”์–ด๊ฐ€ 1๊ฐœ์ธ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉ)

 

 

  1. ์ผ๋‹จ ์‚ด์•„์žˆ๋Š” ๊ฐ์ฒด๋“ค์€ Eden ์˜์—ญ์— ์žˆ๋‹ค.
  2. Eden ์˜์—ญ์ด ๊ฝ‰์ฐจ๊ฒŒ ๋˜๋ฉด To Survivor ์˜์—ญ(๋น„์–ด์žˆ๋Š” ์˜์—ญ)์œผ๋กœ ์‚ด์•„ ์žˆ๋Š” ๊ฐ์ฒด๊ฐ€ ์ด๋™ํ•œ๋‹ค. ์ด๋•Œ Survivor ์˜์—ญ์— ๋“ค์–ด๊ฐ€๊ธฐ์— ๋„ˆ๋ฌด ํฐ ๊ฐ์ฒด๋Š” ๋ฐ”๋กœ Old ์˜์—ญ์œผ๋กœ ์ด๋™ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  From Survivor ์˜์—ญ์— ์žˆ๋Š” ์‚ด์•„ ์žˆ๋Š” ๊ฐ์ฒด๋Š” To Survivor ์˜์—ญ์œผ๋กœ ์ด๋™ํ•œ๋‹ค.
  3. To Survivor ์˜์—ญ์ด ๊ฝ‰ ์ฐผ์„ ๊ฒฝ์šฐ, Eden ์˜์—ญ์ด๋‚˜ From Survivor ์˜์—ญ์— ๋‚จ์•„ ์žˆ๋Š” ๊ฐ์ฒด๋“ค์€ Old ์˜์—ญ์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

์ด ์ดํ›„์— Old ์˜์—ญ์ด๋‚˜ Perm ์˜์—ญ์— ์žˆ๋Š” ๊ฐ์ฒด๋“ค์€ Mark-sweep-compact ์ฝœ๋ ‰์…˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋”ฐ๋ฅธ๋‹ค. ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•ด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งํ•˜๋ฉด, ์•ˆ ์“ฐ๋Š” ๊ฑฐ ํ‘œ์‹œํ•ด์„œ ์‚ญ์ œํ•˜๊ณ  ํ•œ ๊ณณ์œผ๋กœ ๋ชจ์œผ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

Mark-sweep-compact ์•Œ๊ณ ๋ฆฌ์ฆ˜

1) Old ์˜์—ญ์œผ๋กœ ์ด๋™๋œ ๊ฐ์ฒด๋“ค ์ค‘ ์‚ด์•„ ์žˆ๋Š” ๊ฐœ์ฒด๋ฅผ ์‹๋ณ„ํ•œ๋‹ค. (Mark)
2) Old ์˜์—ญ์˜ ๊ฐ์ฒด๋“ค์„ ํ›‘๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์“ฐ๋ ˆ๊ธฐ ๊ฐ์ฒด๋ฅผ ์‹๋ณ„ํ•œ๋‹ค. (Sweep)
3) ํ•„์š” ์—†๋Š” ๊ฐ์ฒด๋“ค์„ ์ง€์šฐ๊ณ  ์‚ด์•„ ์žˆ๋Š” ๊ฐ์ฒด๋“ค์„ ํ•œ ๊ณณ์œผ๋กœ ๋ชจ์€๋‹ค. (Compact)

์ด๋ ‡๊ฒŒ ์ž‘๋™ํ•˜๋Š” ์‹œ๋ฆฌ์–ผ ์ฝœ๋ ‰ํ„ฐ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ ์ข…๋ฅ˜์˜ ์žฅ๋น„์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค. ๋‹ค์‹œ ๋งํ•˜๋ฉด, ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ๋งŽ์•„๋„ ํฌ๊ฒŒ ๋ฌธ์ œ๋˜์ง€ ์•Š๋Š” ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉ๋œ๋‹ค.

๋ช…์‹œ์  ์ง€์ • ๋ฐฉ๋ฒ•
-XX:+UseSerialGC

 

2. Parallel GC

์ด ๋ฐฉ์‹์€ throughput collector๋กœ๋„ ์•Œ๋ ค์ง„ ๋ฐฉ์‹์ด๋‹ค. ์ด ๋ฐฉ์‹์˜ ๋ชฉํ‘œ๋Š” ๋‹ค๋ฅธ CPU๊ฐ€ ๋Œ€๊ธฐ ์ƒํƒœ๋กœ ๋‚จ์•„ ์žˆ๋Š” ๊ฒƒ์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์‹œ๋ฆฌ์–ผ ์ฝœ๋ ‰ํ„ฐ์™€ ๋‹ฌ๋ฆฌ Young ์˜์—ญ์—์„œ์˜ ์ฝœ๋ ‰์…˜์„ ๋ณ‘๋ ฌ(Parallel)๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค. ๋งŽ์€ CPU ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— GC์˜ ๋ถ€ํ•˜๋ฅผ ์ค„์ด๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ์ฆ๊ฐ€์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

  • Java 8์˜ default GC
  • Young ์˜์—ญ์˜ GC๋ฅผ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, Serial GC์— ๋น„ํ•ด ์ƒ๋Œ€์ ์œผ๋กœ Stop The World ๊ฐ€ ์งง๋‹ค
    • Old ์˜์—ญ์€ ์•„๋‹˜
    • Old ์˜์—ญ์˜ GC๋Š” ์‹œ๋ฆฌ์–ผ ์ฝœ๋ ‰ํ„ฐ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Mark-Sweep-Compact ์ฝœ๋ ‰์…˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

๋ช…์‹œ์  ์ง€์ • ๋ฐฉ๋ฒ•
-XX:+UseParallelGC

 

3. Parallel Compacting GC

๋ณ‘๋ ฌ ์ฝœ๋ ‰ํ„ฐ์™€ ๋‹ค๋ฅธ ์ ์€ Old ์˜์—ญ GC์—์„œ ์ƒˆ๋กœ์šด ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•œ๋‹ค.

  • Parallel GC๋Š” Young ์˜์—ญ์— ๋Œ€ํ•ด์„œ๋งŒ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด, Parallel Old GC๋Š” Old์˜์—ญ๊นŒ์ง€ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ๋ฐฉ์‹์„ ์‚ฌ์šฉ

๊ทธ๋Ÿฌ๋ฏ€๋กœ Young ์˜์—ญ์— ๋Œ€ํ•œ GC๋Š” ๋ณ‘๋ ฌ ์ฝœ๋ ‰ํ„ฐ์™€ ๋™์ผํ•˜์ง€๋งŒ, Old ์˜์—ญ์˜ GC๋Š” ๋‹ค์Œ์˜ 3๋‹จ๊ณ„๋ฅผ ๊ฑฐ์น˜๊ฒŒ ๋œ๋‹ค.

  1. Mark ๋‹จ๊ณ„ : ์‚ด์•„ ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์‹๋ณ„ํ•˜์—ฌ ํ‘œ์‹œํ•ด ๋†“๋Š” ๋‹จ๊ณ„
  2. Sweep ๋‹จ๊ณ„ : ์ด์ „์— GC๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ปดํŒฉ์…˜๋œ ์˜์—ญ์— ์‚ด์•„ ์žˆ๋Š” ๊ฐ์ฒด์˜ ์œ„์น˜๋ฅผ ์กฐ์‚ฌํ•˜๋Š” ๋‹จ๊ณ„
  3. Compact ๋‹จ๊ณ„ : ์ปดํŒฉ์…˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‹จ๊ณ„. ์ˆ˜ํ–‰ ์ดํ›„์—๋Š” ์ปดํŒฉ์…˜๋œ ์˜์—ญ๊ณผ ๋น„์–ด ์žˆ๋Š” ์˜์—ญ์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.

๋ณ‘๋ ฌ ์ฝœ๋ ‰ํ„ฐ์™€ ๋™์ผํ•˜๊ฒŒ ์ด ๋ฐฉ์‹๋„ ์—ฌ๋Ÿฌ CPU๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์„œ๋ฒ„์— ์ ํ•ฉํ•˜๋‹ค. GC๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์Šค๋ ˆ๋“œ ๊ฐœ์ˆ˜๋Š” -XX:+ParallelGCThreads=n ์˜ต์…˜์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ช…์‹œ์  ์ง€์ •๋ฐฉ๋ฒ•
-XX:+UseParallelOldGC
-XX:+ParallelGCThreads=n

 

4. Concurrent Mark-Sweep GC

Stop The World๋กœ Java Application์ด ๋ฉˆ์ถ”๋Š” ํ˜„์ƒ์„ ์ค„์ด๊ณ ์ž ๋งŒ๋“  GC
Reacable ํ•œ ๊ฐ์ฒด๋ฅผ ํ•œ๋ฒˆ์— ์ฐพ์ง€ ์•Š๊ณ  ๋‚˜๋ˆ ์„œ ์ฐพ๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉ (4 STEP)

์ด ๋ฐฉ์‹์€ low-latency collector๋กœ๋„ ์•Œ๋ ค์ ธ ์žˆ์œผ๋ฉฐ, ํž™ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์˜ ํฌ๊ธฐ๊ฐ€ ํด ๋•Œ ์ ํ•ฉํ•˜๋‹ค. Young ์˜์—ญ์— ๋Œ€ํ•œ GC๋Š” ๋ณ‘๋ ฌ ์ฝœ๋ ‰ํ„ฐ์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. Old ์˜์—ญ์˜ GC๋Š” ๋‹ค์Œ 4๋‹จ๊ณ„๋ฅผ ๊ฑฐ์นœ๋‹ค.

  1. Initial Mark : GC Root๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๊ฐ์ฒด๋งŒ ๋งˆํ‚น (stop-the-world ๋ฐœ์ƒ)
    • ์‚ด์•„ ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์ฐพ๋Š” ๋‹จ๊ณ„
  2. Concurrent Mark : ์ฐธ์กฐํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋”ฐ๋ผ๊ฐ€๋ฉฐ, ์ง€์†์ ์œผ๋กœ ๋งˆํ‚น. (stop-the-world ์—†์ด ์ด๋ฃจ์–ด์ง)
    • ์„œ๋ฒ„ ์ˆ˜ํ–‰๊ณผ ๋™์‹œ์— ์‚ด์•„ ์žˆ๋Š” ๊ฐ์ฒด์— ํ‘œ์‹œ๋ฅผ ํ•ด๋†“๋Š” ๋‹จ๊ณ„
  3. Remark : concurrent mark ๊ณผ์ •์—์„œ ๋ณ€๊ฒฝ๋œ ์‚ฌํ•ญ์ด ์—†๋Š”์ง€ ๋‹ค์‹œ ํ•œ๋ฒˆ ๋งˆํ‚นํ•˜๋ฉฐ ํ™•์ •ํ•˜๋Š” ๊ณผ์ •. (stop-the-world ๋ฐœ์ƒ)
  4. Concurrent Sweep : ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” ๊ฐ์ฒด๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ณผ์ • (stop-the-world ์—†์ด ์ด๋ฃจ์–ด์ง)

์œ„์™€ ๊ฐ™์ด stop-the-world๊ฐ€ ์ตœ๋Œ€ํ•œ ๋œ ๋ฐœ์ƒํ•˜๋„๋ก ํ•˜์—ฌ, Java Application์ด ๋ฉˆ์ถ”๋Š” ํ˜„์ƒ์„ ์ค„์ธ๋‹ค.

CMS๋Š” ์ปดํŒฉ์…˜ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์™ผ์ชฝ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ชฐ์•„ ๋†“๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ž˜์„œ GC ์ดํ›„์— ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๋นˆ ๊ณต๊ฐ„์ด ๋ฐœ์ƒํ•˜๋ฏ€๋กœ, -XX:+CMSInitiatingOccupancyFraction=n ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ Old ์˜์—ญ์˜ %๋ฅผ n ๊ฐ’์— ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. (๊ธฐ๋ณธ๊ฐ’ : 68)

CMS ์ฝœ๋ ‰ํ„ฐ๋Š” ์ถ”๊ฐ€์ ์ธ ์˜ต์…˜์œผ๋กœ ์ ์ง„์  ๋ฐฉ์‹์„ ์ง€์›ํ•œ๋‹ค. ์ด ๋ฐฉ์‹์€ Young ์˜์—ญ์˜ GC๋ฅผ ๋” ์ž˜๊ฒŒ ์ชผ๊ฐœ์–ด ์„œ๋ฒ„์˜ ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. CPU๊ฐ€ ๋งŽ์ง€ ์•Š๊ณ  ์‹œ์Šคํ…œ์˜ ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ์งง์•„์•ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹๋‹ค.
์ ์ง„์ ์€ GC๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด -XX:+CMSIncrementalMode ์˜ต์…˜์„ ์ง€์ •ํ•˜๋ฉด ๋œ๋‹ค. JVM์— ๋”ฐ๋ผ์„œ๋Š” -Xingc๋ผ๋Š” ์˜ต์…˜์„ ์ง€์ •ํ•ด๋„ ๊ฐ™์€ ์˜๋ฏธ๊ฐ€ ๋œ๋‹ค. ํ•˜์ง€๋งŒ ์ด ์˜ต์…˜์„ ์ง€์ •ํ•  ๊ฒฝ์šฐ ์˜ˆ๊ธฐ์น˜ ๋ชปํ•œ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์ถฉ๋ถ„ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ํ•œ ํ›„์— ์šด์˜ ์„œ๋ฒ„์— ์ ์šฉํ•ด์•ผ ํ•œ๋‹ค.

CMS GC๋Š” 2๊ฐœ ์ด์ƒ์˜ ํ”„๋กœ์„ธ์„œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์„œ๋ฒ„์— ์ ๋‹นํ•˜๋‹ค. ๊ฐ€์žฅ ์ ๋‹นํ•œ ๋Œ€์ƒ์œผ๋กœ๋Š” ์›น ์„œ๋ฒ„๊ฐ€ ์žˆ๋‹ค.

๋ช…์‹œ์  ์ง€์ •๋ฐฉ๋ฒ•
-XX:+UseConcMarkSweepGC
-XX:+CMSInitiatingOccupancyFraction=n
-XX:+CMSIncrementalMode

CMS GC๋Š” Java9 ๋ฒ„์ ผ๋ถ€ํ„ฐ deprecated ๋˜์—ˆ๊ณ  ๊ฒฐ๊ตญ Java14์—์„œ๋Š” ์‚ฌ์šฉ์ด ์ค‘์ง€๋˜์—ˆ๋‹ค.

 

5. G1 GC

  • Java 9 ๋ถ€ํ„ฐ default GC
  • ํ˜„์žฌ GC ์ค‘ stop-the-world์˜ ์‹œ๊ฐ„์ด ์ œ์ผ ์งง์Œ
  • ์–ด๋– ํ•œ GC ๋ฐฉ์‹๋ณด๋‹ค ์ฒ˜๋ฆฌ ์†๋„๊ฐ€ ๋น ๋ฅด๋ฉฐ ํฐ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์—์„œ ๋ฉ€ํ‹ฐ ํ”„๋กœ๋ ˆ์Šค ๊ธฐ๋ฐ˜์œผ๋กœ ์šด์˜๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•ด ๊ณ ์•ˆ๋˜์—ˆ๋‹ค. ๋˜ํ•œ G1 GC๋Š” ๋‹ค๋ฅธ GC ๋ฐฉ์‹์˜ ์ฒ˜๋ฆฌ์†๋„๋ฅผ ๋Šฅ๊ฐ€ํ•œ๋‹ค.
  • CMS GC ๋ฅผ ๊ฐœ์„ ํ•˜์—ฌ ๋งŒ๋“  GC๋กœ ์œ„์—์„œ ์‚ดํŽด๋ณธ GC์™€๋Š” ๋‹ค๋ฅธ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„๋‹ค.

  • Heap์„ Region์ด๋ผ๋Š” ์ผ์ •ํ•œ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ ์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.
    • ๊ธฐ์กด GC์ฒ˜๋Ÿผ ๋ฌผ๋ฆฌ์ ์ธ ์˜์—ญ์œผ๋กœ ๋‚˜๋ˆ„์ง€ ์•Š๊ณ , Region(์ง€์—ญ)์ด๋ผ๋Š” ๊ฐœ๋…์„ ์ƒˆ๋กœ ๋„์ž…ํ•˜์—ฌ Heap์„ ๊ท ๋“ฑํ•˜๊ฒŒ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ง€์—ญ์œผ๋กœ ๋‚˜๋ˆ„๊ณ , ๊ฐ ์ง€์—ญ์„ ์—ญํ• ๊ณผ ํ•จ๊ป˜ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ(Eden ์ง€์—ญ์ธ์ง€, Survivor ์ง€์—ญ์ธ์ง€, Old ์ง€์—ญ์ธ์ง€) ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•œ๋‹ค.
  • G1 GC์—์„œ๋Š” Eden, Survivor, Old ์—ญํ• ์— ๋”ํ•ด Humongous์™€ Availalbe/Unused๋ผ๋Š” 2๊ฐ€์ง€ ์—ญํ• ์„ ์ถ”๊ฐ€ํ•˜์˜€๋‹ค. Humongous๋Š” Region ํฌ๊ธฐ์˜ 50%๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๋Š” Region์„ ์˜๋ฏธํ•˜๋ฉฐ, Availabe/Unused๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ Region์„ ์˜๋ฏธํ•œ๋‹ค. 
  • G1 GC์˜ ํ•ต์‹ฌ์€ ์ „์ฒด Heap์— ๋Œ€ํ•ด์„œ ํƒ์ƒ‰ํ•˜์ง€ ์•Š๊ณ  ๋ถ€๋ถ„์ ์œผ๋กœ Region ๋‹จ์œ„๋กœ ํƒ์ƒ‰ํ•˜์—ฌ, ๊ฐ€๋น„์ง€๊ฐ€ ๋งŽ์€ Region์—๋งŒ ์šฐ์„ ์ ์œผ๋กœ GC๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • G1 GC๋„ ๋‹ค๋ฅธ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ 2๊ฐ€์ง€ GC(Minor GC, Major GC)๋กœ ๋‚˜๋ˆ„์–ด ์ˆ˜ํ–‰๋œ๋‹ค.

1. Minor GC

ํ•œ ์ง€์—ญ์— ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•˜๋‹ค๊ฐ€ ํ•ด๋‹น ์ง€์—ญ์ด ๊ฝ‰ ์ฐจ๋ฉด ๋‹ค๋ฅธ ์ง€์—ญ์— ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•˜๊ณ , Minor GC๊ฐ€ ์‹คํ–‰๋œ๋‹ค. G1 GC๋Š” ๊ฐ ์ง€์—ญ์„ ์ถ”์ ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ€๋น„์ง€๊ฐ€ ๊ฐ€์žฅ ๋งŽ์€(Garbage First) ์ง€์—ญ์„ ์ฐพ์•„์„œ Mark and Sweep๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

Eden ์ง€์—ญ์—์„œ GC๊ฐ€ ์ˆ˜ํ–‰๋˜๋ฉด ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋ฅผ ์‹๋ณ„(Mark)ํ•˜๊ณ , ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšŒ์ˆ˜(Sweep)ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฅธ ์ง€์—ญ์œผ๋กœ ์ด๋™์‹œํ‚ค๊ฒŒ ๋œ๋‹ค. ๋ณต์ œ๋˜๋Š” ์ง€์—ญ์ด Available/Unused ์ง€์—ญ์ด๋ฉด ํ•ด๋‹น ์ง€์—ญ์€ ์ด์ œ Survivor ์˜์—ญ์ด ๋˜๊ณ , Eden ์˜์—ญ์€ Available/Unused ์ง€์—ญ์ด ๋œ๋‹ค.

2. Major GC(Full GC)

์‹œ์Šคํ…œ์ด ๊ณ„์† ์šด์˜๋˜๋‹ค๊ฐ€ ๊ฐ์ฒด๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„ ๋น ๋ฅด๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšŒ์ˆ˜ ํ•  ์ˆ˜ ์—†์„ ๋•Œ Major GC(Full GC)๊ฐ€ ์‹คํ–‰๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์„œ G1 GC์™€ ๋‹ค๋ฅธ GC์˜ ์ฐจ์ด์ ์ด ๋‘๊ฐ์„ ๋ณด์ธ๋‹ค.

๊ธฐ์กด์˜ ๋‹ค๋ฅธ GC ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ชจ๋“  Heap์˜ ์˜์—ญ์—์„œ GC๊ฐ€ ์ˆ˜ํ–‰๋˜์—ˆ์œผ๋ฉฐ, ๊ทธ์— ๋”ฐ๋ผ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์ด ์ƒ๋‹นํžˆ ์˜ค๋ž˜ ๊ฑธ๋ ธ๋‹ค. ํ•˜์ง€๋งŒ G1 GC๋Š” ์–ด๋А ์˜์—ญ์— ๊ฐ€๋น„์ง€๊ฐ€ ๋งŽ์€์ง€๋ฅผ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— GC๋ฅผ ์ˆ˜ํ–‰ํ•  ์ง€์—ญ์„ ์กฐํ•ฉํ•˜์—ฌ ํ•ด๋‹น ์ง€์—ญ์— ๋Œ€ํ•ด์„œ๋งŒ GC๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฌํ•œ ์ž‘์—…์€ Concurrentํ•˜๊ฒŒ ์ˆ˜ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ง€์—ฐ๋„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

๋ฌผ๋ก  G1 GC๋Š” ๋‹ค๋ฅธ GC ๋ฐฉ์‹์— ๋น„ํ•ด ์žฆ๊ฒŒ ํ˜ธ์ถœ๋  ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ž‘์€ ๊ทœ๋ชจ์˜ ๋ฉ”๋ชจ๋ฆฌ ์ •๋ฆฌ ์ž‘์—…์ด๊ณ  Concurrentํ•˜๊ฒŒ ์ˆ˜ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์ด ์ง€์—ฐ์ด ํฌ์ง€ ์•Š์œผ๋ฉฐ, ๊ฐ€๋น„์ง€๊ฐ€ ๋งŽ์€ ์ง€์—ญ์— ๋Œ€ํ•ด ์ •๋ฆฌ๋ฅผ ํ•˜๋ฏ€๋กœ ํ›จ์”ฌ ํšจ์œจ์ ์ด๋‹ค.

๋ช…์‹œ์  ์ง€์ •๋ฐฉ๋ฒ•
-XX:+UseG1GC

 

GC ๋ฐฉ์‹ ๋น„๊ต

๋„ค ์ข…๋ฅ˜ GC ๋ฐฉ์‹์— ๋Œ€ํ•œ ์„ฑ๋Šฅ ๋ฐ ๊ธฐ๋Šฅ ๋น„๊ต ํ‘œ

์œ„์˜ ๋‚ด์šฉ์„ ์ข…ํ•ฉํ•˜๋ฉด, GC ์ˆ˜ํ–‰ ์‹œ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ๊ฐ ์˜์—ญ์˜ ํ• ๋‹น๋œ ํฌ๊ธฐ์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ—ˆ์šฉ์น˜๋ฅผ ๋„˜์„ ๋•Œ
  2. ๊ฐœ๋ฐœ์ž๊ฐ€ ์ปจํŠธ๋กคํ•  ์˜์—ญ์€ ์•„๋‹˜

๊ฐœ๋ฐœ์ž๋ผ๋ฉด, ์ž๋ฐ”์˜ GC ๋ฐฉ์‹์„ ์™ธ์šฐ๋ฉด์„œ ๊ฐœ๋ฐœํ•˜๊ฑฐ๋‚˜ ์„œ๋ฒ„๋ฅผ ์„ธํŒ…ํ•  ํ•„์š”๋Š” ์—†๋‹ค. ์ดํ•ด๋งŒ ํ•˜๊ณ  ์žˆ์œผ๋ฉด ๋œ๋‹ค. ๋‹จ, ํ•„์š”ํ• ๋•Œ(์‹œ์Šคํ…œ ์˜คํ”ˆ ์ „ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ / ์„œ๋ฒ„ ์„ธํŒ… ์‹œ), ์•Œ๋งž์€ GC ๋ฐฉ์‹์„ ๊ฐœ๋ฐœํ•œ ์‹œ์Šคํ…œ์— ์ ์šฉํ•˜๋ฉด ๋œ๋‹ค๊ณ  ํ•œ๋‹ค.

 

์ฐธ๊ณ 

๋Œ“๊ธ€