[Java] ๐Ÿงน GC๋ž€?

Sangho Hanยท2025๋…„ 6์›” 5์ผ
2

โ˜•๏ธย Java

๋ชฉ๋ก ๋ณด๊ธฐ
17/17
post-thumbnail

๐Ÿงน Garbage Collector(GC)๋ž€?

GC๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ์˜ ์ค€๋ง๋กœ, ํž™ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ์กด์žฌํ•˜๋Š” ๊ฐ์ฒด๋“ค์„ ์ •๊ธฐ์ ์œผ๋กœ ์ •๋ฆฌํ•ด ์ฃผ๋ฉฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ๋งก๋Š”๋‹ค.

์ด๋Š” 1) ์ธํ„ฐํ”„๋ฆฌํ„ฐ 2) JIT ์ปดํŒŒ์ผ๋Ÿฌ์™€ ํ•จ๊ป˜ JVM ์‹คํ–‰ ์—”์ง„(Execution Engine)๋‚ด์— ์†ํ•ด ์žˆ๋‹ค.

GC๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

JVM ๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ ์ค‘, ํž™ ์˜์—ญ์—๋Š” new ๋กœ ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑํ•œ ๊ฐ์ฒด๋“ค์ด ์˜ฌ๋ผ๊ฐ„๋‹ค.

์ด๋Ÿฌํ•œ ๊ฐ์ฒด๋“ค์€ ์Šคํƒ ์˜์—ญ์— ์žˆ๋Š” ์Šคํƒ ํ”„๋ ˆ์ž„๊ณผ ๋‹ค๋ฅด๊ฒŒ ๋ช…ํ™•ํ•œ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ฐ–๊ณ  ์žˆ์ง€ ์•Š์•„์„œ, ์ €์ ˆ๋กœ ์†Œ๋ฉธํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋•Œ๋ฌธ์— GC๊ฐ€ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ด๋ฅผ ์Šค์บ”ํ•˜๋ฉฐ, ์ฐธ์กฐ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด(Unreachable)์— ๋Œ€ํ•ด์„œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ํ•ด์ œํ•˜๋ฉฐ ์ œ๊ฑฐํ•˜๊ฒŒ ๋œ๋‹ค.

์™œ ํž™ ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š” ๊ฐ์ฒด๋“ค์€ ์•Œ์•„์„œ ์†Œ๋ฉธํ•˜์ง€ ์•Š์„๊นŒ?

์Šคํƒ ์˜์—ญ์— ์˜ฌ๋ผ๊ฐ€๋Š” ๋ฐ์ดํ„ฐ๋“ค์€ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ์— ์Šคํƒ ํ”„๋ ˆ์ž„์ด ์žกํžˆ๊ณ , ๋ฉ”์„œ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ํ”„๋ ˆ์ž„ ์ž์ฒด๊ฐ€ ์ œ๊ฑฐ๋˜์–ด ์†Œ๋ฉธํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ํž™ ์˜์—ญ์— ์žˆ๋Š” ๊ฐ์ฒด๋“ค์€ ๋™์ผํ•˜๊ฒŒ ์ œ๊ฑฐํ•  ์ˆ˜๊ฐ€ ์—†๋Š”๋ฐ, ์ด๋Š” ์ฐธ์กฐ๋œ๋‹ค๋Š” ํŠน์„ฑ ๋•Œ๋ฌธ์ด๋‹ค.

Java์—์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ํ•ด๋‹น ๊ฐ์ฒด ์ž์ฒด๋Š” ํž™์— ์ €์žฅ๋˜๊ณ , ๊ทธ ์ฃผ์†Œ(์ฐธ์กฐ๊ฐ’)๊ฐ€ ์Šคํƒ์— ์ €์žฅ๋œ๋‹ค. ์ด ์ฐธ์กฐ๊ฐ’์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ ๋ฉ”์„œ๋“œ์—์„œ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉฐ, ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๊ฐ์ฒด๋ฅผ ๋„˜๊ธฐ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

๋•Œ๋ฌธ์—, ๋‹จ์ˆœํžˆ ๋ฉ”์„œ๋“œ๊ฐ€ ๋๋‚ฌ๋‹ค๊ณ  ํ•ด์„œ ๊ฐ์ฒด๋ฅผ ๋ฐ”๋กœ ์‚ญ์ œํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด๋‹ค.

์–ผ๋งˆ๋‚˜ ์ฃผ๊ธฐ์ ์œผ๋กœ ์Šค์บ”ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ?

1. ํž™ ๊ณต๊ฐ„ ๋ถ€์กฑ

  • Eden ์˜์—ญ์ด๋‚˜ Old ์˜์—ญ์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ผ์ • ๋น„์œจ ์ด์ƒ ์‚ฌ์šฉ๋˜์—ˆ์„ ๋•Œ GC๊ฐ€ ๋ฐœ์ƒ
  1. System.gc() ํ˜ธ์ถœ
  • ๋ช…์‹œ์ ์œผ๋กœ GC ์š”์ฒญ. ํ•˜์ง€๋งŒ JVM์ด ๋ฌด์กฐ๊ฑด ์‹คํ–‰ํ•˜์ง„ ์•Š์Œ
  1. ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์‹คํŒจ
  • ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํž™ ๊ณต๊ฐ„์ด ๋ถ€์กฑํ•˜๋ฉด, GC๋กœ ๊ณต๊ฐ„ ํ™•๋ณด ํ›„ ๋‹ค์‹œ ์‹œ๋„

์œ„์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์—์„œ ์Šค์บ”ํ•˜๋ฉฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ™•๋ณดํ•˜๋ ค๊ณ  ์‹œ๋„ํ•œ๋‹ค.

์ด์™ธ์—๋„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ์—์„œ ์ง€์†์ ์œผ๋กœ GC๊ฐ€ ๋™์ž‘ํ•˜๊ธฐ๋„ ํ•˜๋Š”๋ฐ, ์ด๋Š” GC์˜ ์ข…๋ฅ˜๋งˆ๋‹ค ๋‹ฌ๋ผ์ง„๋‹ค.

์ฐธ์กฐ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด์— ๋Œ€ํ•ด์„œ๋งŒ ์ œ๊ฑฐํ• ๊นŒ?

๊ทธ๋ ‡๋‹ค. ํ•˜๋‚˜๋ผ๋„ ์ฐธ์กฐ๋˜๊ณ  ์žˆ๋Š” ๊ฐ์ฒด์— ๋Œ€ํ•ด์„œ๋Š” ์ ˆ๋Œ€๋กœ ์ œ๊ฑฐํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋งŒ์•ฝ ์ด๋ฅผ ์ œ๊ฑฐํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ์น˜๋ช…์ ์ธ ์‹œ์Šคํ…œ ์žฅ์• ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์•ˆ์ „ํ•˜๊ฒŒ ํšŒ์ˆ˜ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด์— ๋Œ€ํ•ด์„œ๋งŒ ์ •๋ฆฌํ•œ๋‹ค.

GC์˜ ์žฅ๋‹จ์ 

์žฅ์ 

C/C++๊ณผ ๊ฐ™์€ Unmanaged ์–ธ์–ด๋Š”, ๊ฐœ๋ฐœ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๊ณผ ํ•ด์ œ๋ฅผ ํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์กด์žฌํ•œ๋‹ค.

๋ฐ˜๋ฉด GC๋Š” ์ฐธ์กฐ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋“ค์„ ์•Œ์•„์„œ ์ •๋ฆฌํ•ด์คŒ์œผ๋กœ์จ, ๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์— ๋Œ€ํ•œ ์‹ ๊ฒฝ์„ ์“ฐ์ง€ ์•Š๊ณ  ์˜ค๋กœ์ง€ ๊ฐœ๋ฐœ์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

ํŠนํžˆ, ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Memory Leak)๋‚˜ ์ด์ค‘ ํ•ด์ œ(Double Free)์™€ ๊ฐ™์€ ๋ฌธ์ œ์—์„œ ๋น„๊ต์  ์ž์œ ๋กœ์›Œ์งˆ ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ GC๋Š” Java์—๋งŒ ์กด์žฌํ•˜๋Š” ๊ฐœ๋…์€ ์•„๋‹ˆ๋ฉฐ, Python & JS & Go ๋“ฑ ๋‹ค๋ฅธ ๋งŽ์€ ์–ธ์–ด์—์„œ๋„ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‚ด์žฅ๋˜์–ด ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋“ค์„ Managed ์–ธ์–ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Memory Leak)๋ž€?
๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์ง€๋งŒ, ์—ฌ์ „ํžˆ ์ฐธ์กฐ๋˜๊ณ  ์žˆ์–ด์„œ GC(๋˜๋Š” ์‹œ์Šคํ…œ)๊ฐ€ ํšŒ์ˆ˜ํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋“ฑ๋กํ–ˆ์ง€๋งŒ ํ•ด์ œํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ & ์ปฌ๋ ‰์…˜์— ๊ฐ์ฒด๋ฅผ ๊ณ„์† ๋‹ด์•„๋‘๊ณ  ์ œ๊ฑฐํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ๋“ฑ์ด ์กด์žฌํ•œ๋‹ค.

์ด ๊ฒฝ์šฐ์—๋Š” ์ ์  ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ค„์–ด๋“ค์–ด ์„ฑ๋Šฅ ์ €ํ•˜๋‚˜ OOM(OutOfMemoryError) ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ์ด ์กด์žฌํ•œ๋‹ค.

๋ฌผ๋ก  GC์—์„œ๋„ ํ•ด๋‹น ๋ฌธ์ œ๊ฐ€ ์ผ์–ด๋‚  ์—ฌ์ง€๊ฐ€ ์žˆ์œผ๋‚˜, ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฐธ์กฐ๋งŒ ๋Š๋Š”๋‹ค๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์ •๋ฆฌ๊ฐ€ ๋˜๊ธฐ์— ๋น„๊ต์  ์ž์œ ๋กญ๋‹ค.

์ด์ค‘ ํ•ด์ œ (Double Free)๋ž€?
์ด๋ฏธ ํ•ด์ œํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋‹ค์‹œ ํ•ด์ œํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด free(ptr); ํ˜ธ์ถœ ํ›„, ๊ฐ™์€ ptr์„ ๋‹ค์‹œ free(ptr); ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

๊ทธ ๊ฒฐ๊ณผ ๋ฉ”๋ชจ๋ฆฌ ์˜ค๋ฅ˜, ์‹œ์Šคํ…œ ํฌ๋ž˜์‹œ ๋“ฑ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

GC๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์–ธ์–ด์—์„œ๋Š” ์ง์ ‘ ํ•ด์ œ๋ฅผ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ์ด์ค‘ ํ•ด์ œ ๋ฌธ์ œ์—์„œ๋Š” ์ž์œ ๋กœ์šธ ์ˆ˜ ์žˆ๋‹ค.

๋‹จ์ 

GC๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์–ธ์–ด๋Š” ๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ ๋˜๋‹ˆ ๋งค์šฐ ํŽธ๋ฆฌํ•˜๊ฒŒ ๋А๊ปด์ง„๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๊ณผ์—ฐ ์ข‹์€ ์ ๋งŒ ์กด์žฌํ• ๊นŒ? ๋ฌผ๋ก  ์•„๋ž˜์™€ ๊ฐ™์€ ๋‹จ์ ๋„ ์กด์žฌํ•œ๋‹ค.

1. Stop-the-World ๋ฐœ์ƒ
๋Œ€ํ‘œ์ ์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์ ์œผ๋กœ, GC๊ฐ€ ๋™์ž‘ํ•  ๋•Œ ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์ผ์‹œ ์ค‘์ง€๋˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

์งง์œผ๋ฉด ์ˆ˜ ๋ฐ€๋ฆฌ์ดˆ, ๊ธธ๋ฉด ์ˆ˜ ์ดˆ๊นŒ์ง€ ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž ์ฒด๊ฐ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ณ , ํŠนํžˆ ์‹ค์‹œ๊ฐ„์„ฑ์ด ์ค‘์š”ํ•œ ์„œ๋น„์Šค์— ์น˜๋ช…์ ์ด๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์—, ๊ฒŒ์ž„ & ์ž„๋ฒ ๋””๋“œ ๋“ฑ ์‹ค์‹œ๊ฐ„์„ฑ๊ณผ ์ •๋ฐ€ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ œ์–ด๊ฐ€ ์ค‘์š”ํ•œ ํ™˜๊ฒฝ์—์„œ๋Š” C++๊ณผ ๊ฐ™์€ Unmanaged ์–ธ์–ด๊ฐ€ ์„ ํƒ๋œ๋‹ค.

2. GC ํƒ€์ด๋ฐ ์˜ˆ์ธก ๋ถˆ๊ฐ€
GC๋Š” JVM์˜ ๋‚ด๋ถ€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์˜ํ•ด ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ์ •ํ™•ํ•œ ์‹คํ–‰ ์‹œ์ ์„ ์ œ์–ดํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค.

๋งŒ์•ฝ ํŠน์ • ์‹œ์ ์— ๊ผญ ํ•„์š”ํ•œ ์ž‘์—…์ด ์žˆ๋Š”๋ฐ, ๊ทธ ์ง์ „์— GC๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ ˆ์ดํ„ด์‹œ๊ฐ€ ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

3. ์ฒ˜๋ฆฌ ๋น„์šฉ(์˜ค๋ฒ„ํ—ค๋“œ) ๋ฐœ์ƒ
GC ์ž‘์—…๋„ CPU ์ž์›์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜๋ฆฌ ๋น„์šฉ์ด ๋ฌผ๋ก  ๋ฐœ์ƒํ•œ๋‹ค.

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


๐Ÿƒ๐Ÿป GC์˜ ๋™์ž‘์›๋ฆฌ

์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ, ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋Š” ํž™ ์˜์—ญ ๋‚ด์— ์ €์žฅ๋˜๋ฉฐ ์ด๋ฅผ ์Šคํƒ & ๋ฉ”์†Œ๋“œ ์˜์—ญ์—์„œ ์ฐธ์กฐํ•˜๊ฒŒ ๋œ๋‹ค.

๋งŒ์•ฝ 1๊ณณ์—์„œ๋ผ๋„ ์ฐธ์กฐ๋˜๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋ผ๋ฉด Reachableํ•˜๋‹ค๊ณ  ๋งํ•˜๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š๊ณ  ์•„๋ฌด๋„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋ฉด Unreachableํ•œ ์ƒํƒœ๊ฐ€ ๋˜์–ด์„œ GC์˜ ๋Œ€์ƒ์ด ๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ํŒ๋‹จํ•˜๊ธฐ ์œ„ํ•ด์„œ GC๋Š” ๋„๋‹ฌ์„ฑ ๋ถ„์„์„ ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.

๋„๋‹ฌ์„ฑ ๋ถ„์„์ด๋ž€?

๋„๋‹ฌ์„ฑ ๋ถ„์„์€ GC Root์—์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ๊ฐ์ฒด๋“ค์ด ์„œ๋กœ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์—ฐ๊ฒฐ ๊ด€๊ณ„๋ฅผ ๋”ฐ๋ผ๊ฐ€๋ฉฐ, ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ์ง€๋ฅผ ํŒ๋‹จํ•˜๋Š” ๊ณผ์ •์„ ๋งํ•œ๋‹ค.

๋„๋‹ฌ์ด ๊ฐ€๋Šฅํ•œ, ์ฆ‰ Reachableํ•œ ๊ฐ์ฒด๋Š” ์•„์ง ์‹œ์Šคํ…œ ๋‚ด์—์„œ ์‚ฌ์šฉ์ค‘์ด๊ธฐ์— ์ œ๊ฑฐํ•˜์ง€ ์•Š๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์€ Unreachableํ•œ ๊ฐ์ฒด๋Š” ์ œ๊ฑฐํ•˜๊ฒŒ ๋œ๋‹ค.

ํ•ด๋‹น ๊ณผ์ •์€ ์ผ๋ฐ˜์ ์œผ๋กœ BFS ๋˜๋Š” DFS๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.

GC Root?

JVM์—์„œ ๋„๋‹ฌ์„ฑ ๋ถ„์„์„ ํ•  ๋•Œ ๊ธฐ์ค€์ด ๋˜๋Š” ์ถœ๋ฐœ์ ์œผ๋กœ, ๋ฃจํŠธ๋“ค๋กœ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ์ฐธ์กฐ ๊ทธ๋ž˜ํ”„๋ฅผ ๋”ฐ๋ผ๊ฐ€๊ฒŒ ๋œ๋‹ค.

๋Œ€ํ‘œ์ ์œผ๋กœ GC Root์˜ ์ข…๋ฅ˜๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  1. ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์Šค๋ ˆ๋“œ์˜ ์Šคํƒ ํ”„๋ ˆ์ž„ ์•ˆ์— ์žˆ๋Š” ์ง€์—ญ & ๋งค๊ฐœ ๋ณ€์ˆ˜
  2. ํด๋ž˜์Šค์˜ static ํ•„๋“œ์—์„œ ์ฐธ์กฐํ•˜๋Š” ๊ฐ์ฒด
  3. JNI์—์„œ ์ฐธ์กฐ ์ค‘์ธ ๊ฐ์ฒด

Mark-and-Sweep

Mark-and-Sweep ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ GC ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ, ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด ๋  ๋Œ€์ƒ ๊ฐ์ฒด๋ฅผ ์‹๋ณ„(Mark)ํ•˜๊ณ  ์ œ๊ฑฐ(Sweep)ํ•ด ๋‚˜๊ฐ„๋‹ค.

์ดํ›„ GC ์ข…๋ฅ˜์— ๋”ฐ๋ผ์„œ, ํŒŒํŽธํ™”๋œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ์•ž์—์„œ๋ถ€ํ„ฐ ์ฑ„์›Œ๋‚˜๊ฐ€๋ฉฐ ์••์ถ•ํ•˜๋Š” Compact ๊ณผ์ •์ด ์กด์žฌํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

1. Mark ๊ณผ์ •

  • GC Root์—์„œ ์‹œ์ž‘ํ•˜์—ฌ ์ฐธ์กฐ ๊ทธ๋ž˜ํ”„๋ฅผ ๋”ฐ๋ผ๊ฐ€๋ฉฐ, ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด๋Š” ๋ชจ๋‘ ๋งˆํ‚นํ•œ๋‹ค.

2. Sweep ๊ณผ์ •

  • Mark ๊ณผ์ •์ด ๋๋‚œ ์ดํ›„, ๋„๋‹ฌํ•˜์ง€ ๋ชป ํ•˜๋Š”(Unreachable) ๊ฐ์ฒด๋“ค์„ ํž™ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์—์„œ ์ œ๊ฑฐํ•œ๋‹ค.

์žฅ์ 

  1. ๋‚ด๋ถ€ ๊ตฌ์กฐ๊ฐ€ ์ง๊ด€์ ์ด๋ผ ๊ตฌํ˜„๊ณผ ์ดํ•ดํ•˜๊ธฐ์— ์‰ฝ๋‹ค.
  2. ๋ชจ๋“  ๊ฐ์ฒด์— ๋Œ€ํ•œ ์„ ํ˜• ํƒ์ƒ‰์ด ์ด๋ฃจ์–ด์ง€๊ธฐ์— ์ •ํ™•ํ•˜๋‹ค.

๋‹จ์ 

  1. ์†๋„๊ฐ€ ๋А๋ ค Stop-the-World ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง„๋‹ค.
  2. Compact ๊ณผ์ •์ด ์—†๋‹ค๋ฉด, ๋ฉ”๋ชจ๋ฆฌ ๋‹จํŽธํ™”๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
  3. ์ตœ์ ํ™”๊ฐ€ ๋ถ€์กฑํ•ด, ๊ฐ์ฒด๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ์„ฑ๋Šฅ์ด ์ €ํ•˜๋œ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ๋‹จํŽธํ™”?

๊ฐ์ฒด๋“ค์ด ์ œ๊ฑฐ๋œ ํ›„ ๋นˆ ๊ณต๊ฐ„์ด ๋œ ๋ฉ”๋ชจ๋ฆฌ๋“ค์ด, ์—ฌ๊ธฐ์ €๊ธฐ์— ํฉ์–ด์ ธ ์žˆ์–ด์„œ ์—ฐ์†๋˜์ง€ ์•Š์€ ์กฐ๊ฐ์œผ๋กœ ๋‚จ์•„ ๋น„ํšจ์œจ์ ์ธ ์ƒํ™ฉ์„ ๋งํ•œ๋‹ค.

[ A ][   ][ C ][   ][ E ]

ํ•ด๋‹น ์ƒํ™ฉ์—์„œ ๋นˆ ๊ณต๊ฐ„์€ 2์นธ์ด์ง€๋งŒ, ๋‘ ์นธ์ด ์—ฐ์†๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์ด์ฆˆ๊ฐ€ 2์ธ ๊ฐ์ฒด๋ฅผ ๋„ฃ์„ ์ˆ˜๋Š” ์—†๋‹ค.
์ด ๋•Œ๋ฌธ์— ์ „์ฒด ์‚ฌ์šฉ๋Ÿ‰์€ ๋‚ฎ์€๋ฐ๋„ OOM์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธด๋‹ค.

๐Ÿง‘๐Ÿปโ€๐Ÿ’ป ๋ฉ”๋ชจ๋ฆฌ ๋‹จํŽธํ™”์™€ ๊ฐ™์€ ๋ฌธ์ œ ๋•Œ๋ฌธ์—, Compact ๊ณผ์ •์ด ๋„์ž…๋˜๊ธฐ๋„ ํ•œ๋‹ค.
์ด ๊ณผ์ •์€ ์‚ด์•„์žˆ๋Š” ๊ฐ์ฒด๋“ค์„ ํ•œ์ชฝ์œผ๋กœ ๋ชฐ์•„๋ถ™์—ฌ ์—ฐ์†๋œ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

ํ•˜์ง€๋งŒ ๊ฐ์ฒด๋ฅผ ์ด๋™์‹œํ‚ค๋Š” ๋ฐ์—๋Š” ์ถ”๊ฐ€ ์—ฐ์‚ฐ๊ณผ ํฌ์ธํ„ฐ ๊ฐฑ์‹  ๋น„์šฉ์ด ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์—,
์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ํฌ๊ณ , ์—ฌ์ „ํžˆ Stop-the-World๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋Š” ํ•œ๊ณ„๊ฐ€ ์กด์žฌํ•œ๋‹ค.

ํž™ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ

ํž™ ์˜์—ญ์€ ์ฒ˜์Œ ์„ค๊ณ„๋  ๋•Œ, ์•„๋ž˜ 2๊ฐ€์ง€๋ฅผ ์ „์ œ๋กœ ์„ค๊ณ„๋˜์—ˆ๋‹ค.

Weak Generational Hypothesis(์•ฝํ•œ ์„ธ๋Œ€ ๊ฐ€์„ค)

  1. ๋Œ€๋ถ€๋ถ„์˜ ๊ฐ์ฒด๋Š” ๊ธˆ๋ฐฉ ์ ‘๊ทผ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ƒํƒœ(Unreachable)๊ฐ€ ๋œ๋‹ค.
  2. ์˜ค๋ž˜๋œ ๊ฐ์ฒด์—์„œ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋กœ์˜ ์ฐธ์กฐ๋Š” ๋งค์šฐ ๋“œ๋ฌผ๊ฒŒ ์กด์žฌํ•œ๋‹ค.

์ฆ‰, ๋Œ€๋ถ€๋ถ„์˜ ๊ฐ์ฒด๋Š” ์ผํšŒ์„ฑ์ด๋ฉฐ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ค๋ž˜ ๋‚จ์•„์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋“œ๋ฌผ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋Ÿฌํ•œ ํŠน์„ฑ์„ ์ด์šฉํ•ด JVM ๊ฐœ๋ฐœ์ž๋“ค์€ ๋ณด๋‹ค ํšจ์œจ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด์„œ, 1) Young 2) Old๋กœ ๋ฌผ๋ฆฌ์ ์ธ ํž™ ์˜์—ญ์„ ๋‚˜๋ˆ„๊ฒŒ ๋˜์—ˆ๋‹ค.

1. Young ์˜์—ญ(Young Generation)

  • ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๊ฐ€ ํ• ๋‹น๋˜๋Š” ์˜์—ญ์ด๋‹ค.
  • ๋งŽ์€ ๊ฐ์ฒด๊ฐ€ Young ์˜์—ญ์— ์ƒ์„ฑ๋˜์—ˆ๋‹ค๊ฐ€, ์‚ฌ๋ผ์ง„๋‹ค.
  • Young ์˜์—ญ์—์„œ ๋ฐœ์ƒํ•˜๋Š” GC์ž‘์—…์„, Minor GC๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

2. Old ์˜์—ญ(Old Generation)

  • Young ์˜์—ญ์—์„œ, Reachable ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜์—ฌ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๊ฐ€ ๋ณต์‚ฌ๋˜๋Š” ์˜์—ญ์ด๋‹ค.
  • Young ์˜์—ญ๋ณด๋‹ค ํฌ๊ฒŒ ํ• ๋‹น๋˜๋Š”๋ฐ, ์ˆ˜๋ช…์ด ๊ธธ๊ณ  ์‚ฌ์ด์ฆˆ๊ฐ€ ํฐ ๊ฐ์ฒด๋“ค์ด ์ฃผ๋กœ Old ์˜์—ญ์— ํ• ๋‹น๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • Old ์˜์—ญ์—์„œ ๋ฐœ์ƒํ•˜๋Š” GC ์ž‘์—…์„, Major GC ๋˜๋Š” Full GC ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

์„ธ๋ถ€์ ์ธ Young ์˜์—ญ

Young ์˜์—ญ์—์„œ๋Š” ๊ฐ์ฒด๊ฐ€ ์ž์ฃผ ์ƒ์„ฑ๋˜๊ณ  ๊ธˆ๋ฐฉ ์‚ฌ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ์—, JVM์€ ์ด ์˜์—ญ์—์„œ์˜ GC ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘”๋‹ค.

๋•Œ๋ฌธ์— Young ์˜์—ญ์„ ๋‹ค์‹œ 3๊ฐ€์ง€ ์˜์—ญ์œผ๋กœ ๋‚˜๋ˆ„๊ฒŒ ๋œ๋‹ค.

1. Eden ์˜์—ญ

  • new๋ฅผ ํ†ตํ•ด์„œ ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋“ค์ด ์œ„์น˜ํ•˜๊ฒŒ ๋œ๋‹ค.
  • Minor GC ์ดํ›„ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋“ค์€ Survivor ์˜์—ญ์œผ๋กœ ๋ณด๋‚ด๊ฒŒ ๋œ๋‹ค.
  • ์—ฌ๊ธฐ์„œ Eden์€, ์„ฑ๊ฒฝ์—์„œ ์—๋ด ๋™์‚ฐ์˜ ์—๋ด๊ณผ ๋™์ผํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„๋‹ค.

2. Survivor 0, 1 ์˜์—ญ

  • ์ตœ์†Œ 1๋ฒˆ ์ด์ƒ์˜ Minor GC์—์„œ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋“ค์ด ์กด์žฌํ•˜๋Š” ์˜์—ญ์ด๋‹ค.
  • ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ํฌ์ธํŠธ๋Š”, Survivor 0 ๋˜๋Š” Survivor 1 ์˜์—ญ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋Š” ๊ผญ ๋น„์–ด์žˆ๋Š” ๊ณต๊ฐ„์ด์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

Minor GC

์œ„์—์„œ Minor GC๋Š” Young ์˜์—ญ์—์„œ ๋ฐœ์ƒํ•˜๋Š” GC ์ž‘์—…์ด๋ผ๊ณ  ์–ธ๊ธ‰ํ•˜์˜€๋‹ค.
Minor GC๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๋™์ž‘ ๊ณผ์ •์„ ๊ฐ€์ง„๋‹ค.

  1. ์ฒ˜์Œ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋“ค์€ Eden ์˜์—ญ์— ์œ„์น˜ํ•œ๋‹ค.
  2. ๊ฐ์ฒด๊ฐ€ ๊ณ„์† ์ƒ์„ฑ๋˜์–ด, Eden ์˜์—ญ์ด ๊ฝ‰ ์ฐจ๊ฒŒ ๋˜๋ฉด Minor GC๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
  3. Mark ๋‹จ๊ณ„์—์„œ Reachableํ•œ ๊ฐ์ฒด๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.
  4. Eden ์˜์—ญ์—์„œ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋Š”, ํ•˜๋‚˜์˜ Survivor ์˜์—ญ์œผ๋กœ ์ด๋™ํ•œ๋‹ค.
  5. Eden ์˜์—ญ์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด(Unreachable)๋“ค์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•œ๋‹ค.(Sweep ๋‹จ๊ณ„)
  6. ์‚ด์•„๋‚จ์€ ๋ชจ๋“  ๊ฐ์ฒด๋“ค์€ Age ๊ฐ’์ด 1์”ฉ ์ฆ๊ฐ€ํ•œ๋‹ค.

Age ๊ฐ’์ด๋ž€?

Survivor ์˜์—ญ์—์„œ ๊ฐ์ฒด๊ฐ€ ์‚ด์•„๋‚จ์€ ํšŸ์ˆ˜๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, Object Header์— ๊ธฐ๋ก๋œ๋‹ค.

  • Eden์— ์žˆ๋Š” ๊ฐ์ฒด์˜ ์ดˆ๊ธฐ age ๊ฐ’์€ 0์ด๋‹ค.
  • Object Header๋Š” JVM์ด ๊ฐ์ฒด์— ๋ถ€์—ฌํ•˜๋Š” ๋‚ด๋ถ€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๊ณต๊ฐ„์ด๋‹ค.

๋งŒ์•ฝ age ๊ฐ’์ด ์ž„๊ณ„๊ฐ’์— ๋‹ค๋‹ค๋ฅธ๋‹ค๋ฉด Promotion(Old ์˜์—ญ์œผ๋กœ ์ด๋™ํ•˜๋Š”) ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.
๊ฐ€์žฅ ๋ณดํŽธ์ ์ธ HotSpot JVM์˜ ๊ฒฝ์šฐ์—๋Š” age์˜ ๊ธฐ๋ณธ ์ž„๊ณ„๊ฐ’์ด 15์ด๋‹ค.

์ฆ‰, age๊ฐ€ 15์— ๋„๋‹ฌํ•˜๋ฉด Young -> Old ์˜์—ญ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

Minor GC๋ฅผ ์•Œ์•„๋ณด๋ฉฐ, ์•„๋ž˜์™€ ๊ฐ™์€ ๊ถ๊ธˆ์ฆ์ด ์ƒ๊ฒจ๋‚ฌ๋‹ค.

1. Minor GC๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์ œ๊ฑฐ๋˜๋Š” ๋Œ€์ƒ์€ Eden ์˜์—ญ ๋ฟ์ธ์ง€?

๊ทธ๋ ‡์ง€ ์•Š๋‹ค. ์—ฌ๊ธฐ์—๋Š” Survivor From ์˜์—ญ๋„ ํฌํ•จ๋œ๋‹ค.

Survivor From ์˜์—ญ์ด๋ž€?

์œ„์—์„œ Survivor 0, 1 ์˜์—ญ์„ ์„ค๋ช…ํ•˜๋ฉฐ, ๋‘˜ ์ค‘ ํ•˜๋‚˜๋Š” ๊ผญ ๋น„์–ด ์žˆ์–ด์•ผํ•œ๋‹ค๊ณ  ๋งํ•˜์˜€๋‹ค.

๊ทธ ์ด์œ ๋Š” Minor GC์—์„œ ์‚ด์•„๋‚จ์•„, age๋ฅผ +1 ํ•˜๊ฒŒ ๋œ ๊ฐ์ฒด๋“ค์ด ๋ณต์‚ฌ๋  ๊นจ๋—ํ•œ ๊ณต๊ฐ„์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์—ฌ๊ธฐ์„œ Survivor From์€ Eden๊ณผ ํ•จ๊ป˜ Minor GC์˜ ๋Œ€์ƒ์ด ๋˜๋Š” ์˜์—ญ์ด๋ฉฐ, Survivor To๋Š” ๋ณต์‚ฌ๊ฐ€ ๋˜๋Š” ๊ณต๊ฐ„์ด ๋œ๋‹ค.

์ด๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ, Survivor 0, 1์€ ๋ฒˆ๊ฐˆ์•„ ๊ฐ€๋ฉฐ From, To ์—ญํ• ์„ ๋งก๊ฒŒ ๋œ๋‹ค.

์ฆ‰, Survivor 0์ด From์ธ ์ƒํƒœ์—์„œ Minor GC๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๋ฉด, Survivor 1์ด To์ธ ์ƒํƒœ์ด๋ฏ€๋กœ age + 1 ๋œ ๊ฐ์ฒด๋“ค์„ ๋ณต์‚ฌํ•˜๊ฒŒ ๋˜๊ณ , ๋‹ค์Œ ๊ณผ์ •์—์„œ๋Š” ๊ทธ ๋ฐ˜๋Œ€๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

Survivor From, to (=Survivor 0, 1)์„ ์™”๋‹ค๊ฐ”๋‹คํ•˜๋ฉฐ(age++) ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋งŒ์ด, Old ์˜์—ญ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

2. Eden์ด ๊ฝ‰ ์ฐฌ ๊ฒฝ์šฐ์—๋งŒ Minor GC๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ธ์ง€?

์ผ๋ฐ˜์ ์œผ๋กœ๋Š” Eden์ด ๊ฝ‰ ์ฐฌ ๊ฒฝ์šฐ์— ๋ฐœ์ƒํ•˜๊ณ ๋Š” ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ Survivor ๊ณต๊ฐ„์ด ๋ถ€์กฑํ•˜๊ฑฐ๋‚˜, System.gc() ํ˜ธ์ถœ ๋“ฑ ์™ธ๋ถ€ ์š”์ธ์œผ๋กœ ์ธํ•ด์„œ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ๋„ ์กด์žฌํ•œ๋‹ค.

Survivor ๊ณต๊ฐ„์ด ๋ถ€์กฑํ•œ ๊ฒฝ์šฐ?

Survivor From -> To๋กœ ์ด๋™์‹œ์ผœ์•ผ ํ•˜๋Š”๋ฐ, ๊ณต๊ฐ„์ด ๋ถ€์กฑํ•˜๋‹ค๋ฉด JVM์€ Early Promotion (์กฐ๊ธฐ ์Šน๊ฒฉ)์˜ ๋ฐฉ์‹์„ ํƒํ•˜๊ฒŒ ๋œ๋‹ค.

์ด๋Š” age์™€ ์ƒ๊ด€์—†์ด ์•„์ง Old๋กœ ์Šน๊ฒฉํ•  ๋‚˜์ด๊ฐ€ ์•ˆ ๋œ ๊ฐ์ฒด๋ฅผ ๊ทธ๋ƒฅ Old ์˜์—ญ์œผ๋กœ ์Šน๊ฒฉ์‹œ์ผœ๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

์กฐ๊ธฐ ์Šน๊ฒฉ์ด ๋งŽ์ด ์ด๋ฃจ์–ด์ง€๊ฒŒ ๋œ๋‹ค๋ฉด, Old ์˜์—ญ์ด ํฌํ™”๋˜์–ด Major GC๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ํšŸ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค.

๋•Œ๋ฌธ์— ์ด๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด์„œ, Survivor ์˜์—ญ ํฌ๊ธฐ์™€, ์ž„๊ณ„๊ฐ’์„ ์ ์ ˆํ•˜๊ฒŒ ์กฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค.

3. age์˜ ๊ธฐ๋ณธ ์ž„๊ณ„๊ฐ’์€ ์™œ 15์ธ์ง€?

Java ๊ฐ์ฒด๋Š” ์ƒ์„ฑ๋  ๋•Œ Object Header ๋ผ๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์˜์—ญ์„ ๊ฐ–๋Š”๋‹ค.
์ด ์ค‘์—์„œ๋„ Mark Word๋Š” GC ์ˆ˜ํ–‰๊ณผ ๊ด€๋ จ๋œ ๋‹ค์–‘ํ•œ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๋Š” ํ•„๋“œ์ด๋‹ค.

์ด๋ฏธ์ง€ ์ถœ์ฒ˜

Mark Word๋Š” ๋ณดํ†ต 64๋น„ํŠธ ํฌ๊ธฐ์ด๋ฉฐ, ์ด ์•ˆ์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ์ •๋ณด๋“ค์ด ํฌํ•จ๋œ๋‹ค.

  1. Identity Hash Code
  2. Lock ์ƒํƒœ ์ •๋ณด (lightweight, biased locking ๋“ฑ)
  3. Object age (๊ฐ์ฒด ์ƒ์กด ํšŸ์ˆ˜)

์ด ์ค‘ Object age์—๊ฒŒ๋Š” ์•ฝ 5~6๋น„ํŠธ ์ •๋„์˜ ๊ณต๊ฐ„์ด ์ฃผ์–ด์ง„๋‹ค. ๋•Œ๋ฌธ์— 5๋น„ํŠธ๋ผ๊ณ  ํ•œ๋‹ค๋ฉด, 0~31๊นŒ์ง€์˜ ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ ‡๊ธฐ์— ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด Hotspot JVM์˜ ๊ธฐ๋ณธ ์ž„๊ณ„๊ฐ’์ด 31์ด๋ผ๊ณ ๋“ค ํ•˜๋Š”๋ฐ, ์ด๋Š” ์กฐ๊ธˆ ํ‹€๋ฆฐ ๋ถ€๋ถ„์ธ ๊ฒƒ ๊ฐ™๋‹ค.

31์€ ํ‘œํ˜„ ๊ฐ€๋Šฅํ•œ ๋ฒ”์œ„์˜ ๋, ์ฆ‰ ์ตœ๋Œ€๊ฐ’์ผ ๋ฟ์ด๋ฉฐ, Old ์˜์—ญ์œผ๋กœ ์Šน๊ฒฉ๋˜๋Š” ๊ธฐ์ค€ ์ž„๊ณ„๊ฐ’์€ ๊ธฐ๋ณธ์ ์œผ๋กœ 15์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ์ž„๊ณ„๊ฐ’์€, ํ•„์š”์— ๋”ฐ๋ผ -XX:MaxTenuringThreshold ์˜ต์…˜์œผ๋กœ ๊ฐœ๋ฐœ์ž๊ฐ€ ์กฐ์ • ๊ฐ€๋Šฅํ•˜๋‹ค.

๋‹ค์‹œ ์ •๋ฆฌํ•˜์ž๋ฉด, Object age๋Š” ์ด๋ก ์ ์œผ๋กœ ์ตœ๋Œ€ 31๊นŒ์ง€ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์„ฑ๋Šฅ ์ตœ์ ํ™”์™€ GC ํšจ์œจ์„ฑ์„ ๊ณ ๋ คํ•ด HotSpot JVM์€ ๊ธฐ๋ณธ ์ž„๊ณ„๊ฐ’์„ 15๋กœ ์„ค์ •ํ•ด๋‘์—ˆ๋‹ค.

Major GC

์ด์ œ๋ถ€ํ„ฐ๋Š” Old ์˜์—ญ ๋‚ด์—์„œ ๋ฐœ์ƒํ•˜๋Š” Major GC์— ๋Œ€ํ•ด ์ •๋ฆฌํ•˜๊ณ ์ž ํ•œ๋‹ค.

๋Œ€ํ‘œ์ ์œผ๋กœ Major GC๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋Š” ์ˆœ๊ฐ„์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

1. Old ์˜์—ญ์ด ๊ฐ€๋“ ์ฐฌ ๊ฒฝ์šฐ

  • Old ์˜์—ญ ์ž์ฒด๊ฐ€ ์ด๋ฏธ ๋Œ€๋ถ€๋ถ„ ์‚ฌ์šฉ ์ค‘์ธ ์ƒํƒœ์ด๋‹ค.
  • Old ์˜์—ญ์˜ ์‚ฌ์šฉ๋ฅ ์ด ๋†’์•„์„œ JVM์ด ์„ ์ œ์ ์œผ๋กœ Major GC๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  • ์ด ๊ฒฝ์šฐ์—๋Š” ์ •๊ธฐ์ ์ธ GC ๊ด€๋ฆฌ ์ฐจ์›์—์„œ ๋ฐœ์ƒํ•œ๋‹ค.

2. Promotion Failure (์Šน๊ฒฉ ์‹คํŒจ)

  • Minor GC ์ดํ›„, age๊ฐ€ ์ž„๊ณ„๊ฐ’์— ๋‹ค๋‹ค๋ฅธ ๊ฐ์ฒด๋“ค์„ Promotionํ•˜๋ ค๋Š” ์‹œ์ ์— Old ์˜์—ญ์— ์ž๋ฆฌ๊ฐ€ ์—†์–ด ์‹คํŒจํ•˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค.
  • ์ด ๋•Œ JVM์€ ์ฆ‰์‹œ Major GC๋ฅผ ๊ฐ•์ œ๋กœ ํŠธ๋ฆฌ๊ฑฐํ•˜์—ฌ Old ์˜์—ญ์„ ๋น„์šฐ๋ ค๊ณ  ์‹œ๋„ํ•œ๋‹ค.

Major GC ๐Ÿ†š Full GC?

  • Major GC๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ Old ์˜์—ญ๋งŒ์„ ๋Œ€์ƒ์œผ๋กœ ์ˆ˜ํ–‰๋˜๋Š” GC์ด๋‹ค. ์ฆ‰, Minor or Major GC๋กœ ์˜์—ญ์ด ๋ช…ํ™•ํ•˜๊ฒŒ ๊ตฌ๋ถ„๋˜์–ด ์žˆ๋‹ค.

๋ฐ˜๋ฉด, Full GC๋Š” Old + Young + ๊ธฐํƒ€ ์˜์—ญ(Metaspace ๋“ฑ)์„ ๋ชจ๋‘ ์ˆ˜์ง‘ํ•˜๋Š” ๋ฌด๊ฑฐ์šด ์ž‘์—…์ด๋‹ค.

  • JVM์ด ๊ฐ•์ œ์ ์œผ๋กœ ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ๊ฒ€ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ํŒ๋‹จํ•  ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค.
    • System.gc() ํ˜ธ์ถœ
    • Old ์˜์—ญ ํฌํ™” / Promotion ์‹คํŒจ
    • Permanent/Metaspace ๋ถ€์กฑ ๋“ฑ ..

G1 GC ๋“ฑ ์ผ๋ถ€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ๋Š” ๋‘ ์šฉ์–ด๊ฐ€ ์œ ์—ฐํ•˜๊ฒŒ ๊ฐ™์€ ์˜๋ฏธ๋กœ ์“ฐ์ด๊ธฐ๋„ ํ•œ๋‹ค.

Major GC๋Š” Minor GC์— ๋น„ํ•ด์„œ ๋งŽ์€ ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค. ๋•Œ๋ฌธ์— ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฉˆ์ถ”๋Š” Stop-the-World ๋ฌธ์ œ๊ฐ€ ๋”์šฑ ๋Œ€๋‘๋œ๋‹ค. (๋ฌผ๋ก  Minor GC์—์„œ๋„ Stop-the-World ๋ฌธ์ œ๋Š” ์žˆ๋‹ค.)

์™œ Major GC๊ฐ€ Minor GC๋ณด๋‹ค ์˜ค๋ž˜ ๊ฑธ๋ฆด๊นŒ?

1. ๋Œ€์ƒ ์˜์—ญ์˜ ํฌ๊ธฐ๊ฐ€ ํฌ๋‹ค

  • Major GC๋Š” Old ์˜์—ญ ์ „์ฒด๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š”๋ฐ, ์ผ๋ฐ˜์ ์œผ๋กœ Young ์˜์—ญ๋ณด๋‹ค ํฌ๊ธฐ๋„ ํฌ๊ณ  ๊ฐ์ฒด ์ˆ˜๋ช…๋„ ๊ธธ๋‹ค.
  • ์ฆ‰, ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๊ฒ€์‚ฌํ•  ๋Œ€์ƒ์ด ๋งŽ์œผ๋‹ˆ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆด ์ˆ˜๋ฐ–์— ์—†๋Š” ๊ฒƒ์ด๋‹ค.

2. ๊ฐ์ฒด ์ˆ˜๋ช…์ด ๊ธธ๋‹ค

  • Old ์˜์—ญ์—๋Š” ์˜ค๋žซ๋™์•ˆ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋“ค์ด ์กด์žฌํ•˜๋Š”๋ฐ, ์ด๋“ค์€ ์—ฐ๊ฒฐ ๊ด€๊ณ„๊ฐ€ ๋ณต์žกํ•˜๊ณ  ์ฐธ์กฐ ๊ทธ๋ž˜ํ”„๋„ ๊นŠ์€ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.
  • ๋•Œ๋ฌธ์— Reachable ํŒ๋ณ„(Mark ๋‹จ๊ณ„)์— ์‹œ๊ฐ„์ด ๋” ๋งŽ์ด ๋“ค๊ฒŒ ๋œ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€ GC๋ž€ ๋ฌด์—‡์ธ์ง€, ๋™์ž‘์›๋ฆฌ๋Š” ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€, ํž™ ์˜์—ญ์€ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๊ณ  ์–ด๋–ค GC๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์ •๋ฆฌ๋˜๋Š”์ง€ ๋“ฑ์„ ์•Œ์•„๋ณด์•˜๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ GC์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” Stop-the-World์ด๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐœ๋ฐœ์ž๋“ค์€ ๋Š์ž„์—†์ด GC ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ฐœ์ „์‹œ์ผœ ์™”๋‹ค.


๐Ÿง  GC ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ข…๋ฅ˜

Java๋ฅผ ์šด์˜ํ•˜๋Š” ํ™˜๊ฒฝ์ด ๊ณ„์†ํ•ด์„œ ๋ฐœ์ „ํ•จ์— ๋”ฐ๋ผ์„œ, ์ด๋ฅผ ๋งž์ถ”๊ธฐ ์œ„ํ•ด ํž™์˜ ์‚ฌ์ด์ฆˆ๋„ ์ ์  ์ปค์ง€๊ฒŒ ๋˜์—ˆ๋‹ค.

๋•Œ๋ฌธ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ง€์—ฐ ํ˜„์ƒ์ด ๋”์šฑ ๋ฌธ์ œ๊ฐ€ ๋˜์—ˆ๊ณ , ์ด๋ฅผ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋‹ค์–‘ํ•œ GC ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๊ฐœ๋ฐœ๋˜์—ˆ๋‹ค.

์•„๋ž˜์—์„œ ์†Œ๊ฐœํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ชจ๋‘ Java ๋‚ด์—์„œ ์„ค์ •์„ ํ†ตํ•ด ์ ์šฉํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ์ฆ‰, ์ƒํ™ฉ์— ๋”ฐ๋ผ์„œ ํ•„์š”ํ•œ GC ๋ฐฉ์‹์„ ์“ธ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

1. Serial GC

  • ์„œ๋ฒ„์˜ CPU ์ฝ”์–ด๊ฐ€ 1๊ฐœ์ผ ๋•Œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ฐœ๋ฐœ๋œ ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ GC์ด๋‹ค.
  • GC๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ 1๊ฐœ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์žฅ Stop-the-World ์‹œ๊ฐ„์ด ๊ธธ๋‹ค.
  • Minor GC์—์„œ๋Š” Mark-and-Sweep / Major GC์—์„œ๋Š” Mark-Sweep-Compact๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์‹ค๋ฌด์—์„œ๋Š” ๊ฑฐ์˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

2. Parallel GCย 

  • Java 8์˜ ๋””ํดํŠธ GC์ด๋‹ค.
  • Serial GC์™€ ๊ธฐ๋ณธ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ฐ™์ง€๋งŒ, Young ์˜์—ญ์˜ Minor GC๋ฅผ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋กœ ์ˆ˜ํ–‰ (Old ์˜์—ญ์€ ์—ฌ์ „ํžˆ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ)ํ•œ๋‹ค.
  • Serial GC์— ๋น„ํ•ด Stop-the-World ์‹œ๊ฐ„์ด ๊ฐ์†Œ๋˜์—ˆ๋‹ค.

3. Parallel Old GC (Parallel Compacting Collector)

  • Parallel GC๋ฅผ ๊ฐœ์„ ํ•œ ๋ฒ„์ „์ด๋‹ค.
  • Young ์˜์—ญ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, Old ์˜์—ญ์—์„œ๋„ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋กœ GC๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  • ์ƒˆ๋กœ์šด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ์ฒญ์†Œ ๋ฐฉ์‹์ธ Mark-Summary-Compact ๋ฐฉ์‹์„ ์ด์šฉํ•œ๋‹ค.

Summary ๋‹จ๊ณ„?

  • ํž™ ์ „์ฒด๋ฅผ ์Šค์บ”ํ•˜์—ฌ ์‚ด์•„์žˆ๋Š” ๊ฐ์ฒด๋“ค์˜ ์œ„์น˜ ์ •๋ณด๋ฅผ ์š”์•ฝ(Summary)ํ•œ๋‹ค.
  • ์ฆ‰, ์–ด๋–ค ์˜์—ญ์ด ๋น„์—ˆ๊ณ , ์–ด๋–ค ์˜์—ญ์€ ์‚ด์•„์žˆ์œผ๋ฉฐ, ์–ด๋””๋กœ ๋ณต์‚ฌํ•ด์•ผ ํ• ์ง€๋ฅผ ๋ฏธ๋ฆฌ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • ํ•ด๋‹น ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค์Œ ๋‹จ๊ณ„์—์„œ ์••์ถ•(compaction)์„ ํšจ์œจ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

4. CMS GC (Concurrentย Markย Sweep)

  • ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šค๋ ˆ๋“œ์™€ GC ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์‹คํ–‰๋˜์–ด Stop-the-World ์‹œ๊ฐ„์„ ์ตœ๋Œ€ํ•œ ์ค„์ด๊ธฐ ์œ„ํ•ด ๊ณ ์•ˆ๋œ GC ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.
  • ๋‹จ, GC ๊ณผ์ •์ด ๋งค์šฐ ๋ณต์žกํ•ด์ง€๋Š”๋ฐ, GC ๋Œ€์ƒ์„ ํŒŒ์•…ํ•˜๋Š” ๊ณผ์ •์ด ์—ฌ๋Ÿฌ๋‹จ๊ณ„๋กœ ์ˆ˜ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ GC ๋Œ€๋น„ CPU ์‚ฌ์šฉ๋Ÿ‰์ด ๋†’๋‹ค.
  • ๋˜ํ•œ ๋ฉ”๋ชจ๋ฆฌ ํŒŒํŽธํ™” ๋ฌธ์ œ๋„ ๋ฐœ์ƒํ•œ๋‹ค.
  • ๋•Œ๋ฌธ์— CMS GC๋Š” Java9 ๋ฒ„์ „๋ถ€ํ„ฐ deprecated ๋˜์—ˆ๊ณ  ๊ฒฐ๊ตญ Java14์—์„œ๋Š” ์‚ฌ์šฉ์ด ์ค‘์ง€๋˜์—ˆ๋‹ค.

5. G1 GC (Garbageย First)

  • CMS GC๋ฅผ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•ด jdk7 ๋ฒ„์ „์—์„œ ์ตœ์ดˆ๋กœ release๋œ GC์ด๋‹ค.
  • Java 9+ ๋ฒ„์ „์˜ ๋””ํดํŠธ GC๋กœ ์ง€์ •๋˜์—ˆ๋‹ค.
  • ๊ธฐ์กด์˜ Young/Old ์˜์—ญ์„ ๊ณ ์ •๋œ ๊ตฌ์—ญ์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๋ฐฉ์‹์ด ์•„๋‹Œ, Region์ด๋ผ๋Š” ๊ณ ์ • ํฌ๊ธฐ ๋ธ”๋ก๋“ค๋กœ ์ „์ฒด Heap์„ ๋ถ„ํ• ํ•ด์„œ ์œ ๋™์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

Region์ด๋ž€?

์ „์ฒด Heap ์˜์—ญ์„ Region์ด๋ผ๋Š” ์˜์—ญ์œผ๋กœ ์ฒด์Šค๊ฐ™์ด ๋ถ„ํ• ํ•˜์—ฌ ์ƒํ™ฉ์— ๋”ฐ๋ผ Eden, Survivor, Old ๋“ฑ ์—ญํ• ์„ ๊ณ ์ •์ด ์•„๋‹Œ ๋™์ ์œผ๋กœ ๋ถ€์—ฌํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

Eden / Survivor / Old Region๋Š” ๋ชจ๋‘ Generation ๊ณผ ๋™์ผํ•˜๋ฉฐ, ๋งค์šฐ ํฐ ๊ฐ์ฒด(Region ํฌ๊ธฐ์˜ 50%๋ฅผ ์ดˆ๊ณผ)๋ฅผ ์ €์žฅํ•˜๋Š” Humongous Region์ด ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด ์ฐจ์ด์ ์ด๋‹ค.

ps. G1 GC์— ๋Œ€ํ•ด์„œ๋Š” ๋” ์ž์„ธํžˆ ๋‹ค์Œ ๊ธ€์—์„œ ๋‹ค๋ฃจ์–ด ๋ณผ ์˜ˆ์ •์ด๋‹ค.

6. Shenandoah GC

  • Shenandoah GC๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šค๋ ˆ๋“œ์™€ GC ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ๋™์‹œ์„ฑ(Concurrent) GC๋กœ, Stop-The-World ์‹œ๊ฐ„์„ ๋ช‡ ms ์ˆ˜์ค€์œผ๋กœ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ์•ˆ๋œ GC ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.
  • ์ „์ฒด GC ๊ณผ์ •(Mark, Compact ๋“ฑ)์„ ๋Œ€๋ถ€๋ถ„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ์ด๋™(Compacting) ๋‹จ๊ณ„์กฐ์ฐจ๋„ ๋™์‹œ ์ฒ˜๋ฆฌ๋œ๋‹ค๋Š” ์ ์ด ํŠน์ง•์ด๋‹ค.
  • ๋‹จ์ ์œผ๋กœ๋Š” GC ๋กœ์ง์ด ๋ณต์žกํ•˜์—ฌ CPU ์‚ฌ์šฉ๋Ÿ‰์ด ๋†’๊ณ , GC ์ˆ˜ํ–‰ ์ค‘ ๊ฐ์ฒด๋ฅผ ์ด๋™์‹œํ‚ค๊ธฐ ์œ„ํ•œ ๋ฆฌ๋””๋ ‰์…˜ ํฌ์ธํ„ฐ ๋“ฑ ๋ถ€๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๋น„์šฉ์ด ๋ฐœ์ƒํ•œ๋‹ค.

์ฆ‰, GC๊ฐ€ ๋” ๋งŽ์€ CPU ์ž์›์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ Stop-The-World ์‹œ๊ฐ„์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค

  • Java 12 ์ด์ƒ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํž™ ํฌ๊ธฐ๊ฐ€ ํฌ๊ณ  ์งง์€ ์ง€์—ฐ ์‹œ๊ฐ„์ด ์š”๊ตฌ๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ํ•ฉํ•˜๋‹ค.

7. ZGC (Z Garbage Collector)

  • ZGC๋Š” ์ดˆ์ €์ง€์—ฐ(low-latency)์„ ๋ชฉํ‘œ๋กœ ์„ค๊ณ„๋œ GC๋กœ, Stop-The-World ์‹œ๊ฐ„์ด 1~2ms ์ˆ˜์ค€์„ ๋„˜์ง€ ์•Š๋„๋ก ๋ณด์žฅํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํฐ ํŠน์ง•์ด๋‹ค.
  • Java 15๋ถ€ํ„ฐ ์ •์‹ ๋ฆด๋ฆฌ์Šค๋˜์—ˆ์œผ๋ฉฐ, 8MB ~ 16TB์— ์ด๋ฅด๋Š” ์ดˆ๋Œ€ํ˜• ํž™์—์„œ๋„ ์ผ์ •ํ•œ ์‘๋‹ต ์‹œ๊ฐ„์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์—ˆ๋‹ค.
  • G1 GC์˜ Region ๊ฐœ๋…๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ZPage๋ผ๋Š” ๋‹จ์œ„๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜์ง€๋งŒ, ZPage๋Š” ๊ณ ์ • ํฌ๊ธฐ๊ฐ€ ์•„๋‹Œ 2MB ๋ฐฐ์ˆ˜์˜ ํฌ๊ธฐ๋กœ ๋™์  ํ™•์žฅ๋œ๋‹ค.
  • ๋Œ€๋ถ€๋ถ„์˜ GC ๋‹จ๊ณ„(Mark, Relocate ๋“ฑ)๋ฅผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋™์‹œ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ์˜ค์ง Root ์Šค์บ” ๋“ฑ ์ผ๋ถ€ ๋‹จ๊ณ„๋งŒ ๊ทนํžˆ ์งง์€ Stop-The-World ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

์ฐธ๊ณ ํ•œ ๋ธ”๋กœ๊ทธ

profile
์•ˆ๋…•ํ•˜์„ธ์š”. ๋น„์ฆˆ๋‹ˆ์Šค๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž, ํ•œ์ƒํ˜ธ์ž…๋‹ˆ๋‹ค.

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