Java Garbage Collection(GC)

๋ฌด์‹ฌ์ฝ”ยท2023๋…„ 1์›” 30์ผ
1

๐ŸงนJava๋Š” Java๊ฐ€ ์ฒญ์†Œํ•ด์ค˜!

C/C++์˜ ๊ฒฝ์šฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•  ๋•Œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฐ์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ํ•ด์ œ ํ•ด์ค˜์•ผ ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ Java์—์„œ๋Š” ๊ทธ ์—ญํ• ์„ ๋‹ค๋ฅธ ๋ˆ„๊ฐ€ ํ•ด์ค€๋‹ค. ๋ฐ”๋กœ Garbage Collection , GC์ด๋‹ค.
GC ๋Š” JVM ์ƒ์—์„œ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ํ• ๋‹น๋˜์–ด์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œ์‹œ์ผœ์ฃผ๋Š” ์žฅ์น˜์ด๋‹ค. JVM์—์„œ ์ž๋™์œผ๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Java๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ํ•ด์ค„ ํ•„์š”๊ฐ€ ์—†๋‹ค.(System.gc()๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ํ•ด์ œํ•  ๊ฒฝ์šฐ ์‹œ์Šคํ…œ ์„ฑ๋Šฅ์— ๋งค์šฐ ํฐ ์˜ํ–ฅ์„ ๋ผ์น˜๋ฏ€๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ํ•˜์ž)

stop-the-world

๋“ฃ์žํ•˜๋‹ˆ GC๋Š” ๊ฐœ๋ฐœ์ž์˜ ๊ด€๋ฆฌ ๋ฒ”์œ„๋ฅผ ์ค„์—ฌ์ฃผ๊ณ  ์ข€๋” ๋กœ์ง์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ด ์ข‹์€ GC๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋ฉด ํ• ์ˆ˜๋ก ์ข‹์„๊นŒ?
์˜ˆ์ƒํ–ˆ์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š๋‹ค. GC์˜ ์ž‘๋™์€ 'stop-the-world'๋ผ๋Š” ์šฉ์–ด๋กœ ์„ค๋ช…๋œ๋‹ค.
stop-the-world๋ž€, GC์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด JVM์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰์„ ๋ฉˆ์ถ”๋Š” ๊ฒƒ์ด๋‹ค. stop-the-world๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด GC๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์“ฐ๋ ˆ๋“œ๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ์“ฐ๋ ˆ๋“œ๋Š” ๋ชจ๋‘ ์ž‘์—…์„ ๋ฉˆ์ถ˜๋‹ค. GC ์ž‘์—…์„ ์™„๋ฃŒํ•œ ์ดํ›„์—์•ผ ์ค‘๋‹จํ–ˆ๋˜ ์ž‘์—…์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•œ๋‹ค.
์ฆ‰, GC๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋Š” ๋ฌด์ž‘์ • GC๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ stop-the-world ์‹œ๊ฐ„์„ ์ค„์ด๋Š” ๋ฐฉํ–ฅ์œผ๋กœ GC๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•˜๊ณ  GCํŠœ๋‹์ด๋ž€ ์ด ์‹œ๊ฐ„์„ ์ค„์ด๋Š” ๊ฒƒ์„ ์ด์•ผ๊ธฐํ•œ๋‹ค.

๐Ÿ”Ž GC ๋™์ž‘ ๋ฐฉ์‹

mark-sweep-compact

๊ทธ๋ ‡๋‹ค๋ฉด GC๋Š” ์–ด๋–ป๊ฒŒ ์ฐธ์กฐ๋˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐพ์„๊นŒ? ๊ฐ€์žฅ ์›์ดˆ์ ์ธ ๋ฐฉ์‹์ด 'mark-sweep-compact' ๋ฐฉ์‹์ด๋‹ค. mark-sweep-compact๋Š” ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ mark, sweep, compact 3๋‹จ๊ณ„๋กœ ์ด๋ค„์ง€๋Š” ๋ฐฉ์‹์ด๋‹ค.

  • mark : ์ฐธ์กฐ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ, ์ฐธ์กฐ๋˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‹๋ณ„ํ•œ๋‹ค.
  • sweep : Heap์˜ ์•ž๋ถ€๋ถ„๋ถ€ํ„ฐ ์ฐธ์กฐ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋งŒ ๋‚จ๊ธฐ๊ณ  ๋‚˜๋จธ์ง€๋Š” ์‚ญ์ œํ•œ๋‹ค.
  • compact : ๊ฐ ๊ฐ์ฒด๋“ค์ด ์—ฐ์†๋˜๊ฒŒ ์Œ“์ด๋„๋ก Heap์˜ ๊ฐ€์žฅ ์•ž ๋ถ€๋ถ„๋ถ€ํ„ฐ ์ฑ„์›Œ์„œ ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•˜๋Š” ๋ถ€๋ถ„๊ณผ ๊ฐ์ฒด๊ฐ€ ์—†๋Š” ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค.

Weak Generational Hypothesis

ํ•˜์ง€๋งŒ mark-sweep-compact ๋ฐฉ์‹์€ ์‹œ๊ฐ„๋„ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ณ  ๋น„ํšจ์œจ์ ์ด๋‹ค. ์•„๋ž˜์˜ ๊ทธ๋ž˜ํ”„๋ฅผ ๋ณด๋ฉด Y์ถ•์€ ํ• ๋‹น๋œ ๋ฐ”์ดํŠธ์˜ ์ˆ˜์ด๊ณ  X์ถ•์€ ๋ฐ”์ดํŠธ๊ฐ€ ํ• ๋‹น๋  ๋•Œ์˜ ์‹œ๊ฐ„์ด๋‹ค. ๊ทธ๋ž˜ํ”„ ์ƒ์—์„œ ์‹œ๊ฐ„์ด ์ง€๋‚ ์ˆ˜๋ก ์ ์€ ๊ฐ์ฒด๋งŒ ์‚ด์•„๋‚จ๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
์ฆ‰, ๊ฐ์ฒด ๋งˆ๋‹ค ์œ ์ง€๋œ ์‹œ๊ฐ„์— ๋”ฐ๋ผ ์ฐธ์กฐ๊ฐ€ ํ•ด์ œ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋‹ฌ๋ฆฌ์ง€๋‹ˆ ์ด ํŠน์„ฑ์„ ์ด์šฉํ•˜์—ฌ ๋” ํšจ์œจ์ ์ธ GC ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•  ๊ฒƒ์ด๋‹ค.

์œ„์—์„œ ํ™•์ธํ•œ ๊ทธ๋ž˜ํ”„๋ฅผ ํ† ๋Œ€๋กœ ๋งŒ๋“ค์–ด์ง„ ๊ฐ€์„ค์ด Weak Generational Hypothesis์ด๋‹ค. ํ•ด๋‹น ๊ฐ€์„ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ€์„ค์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค.

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

GC์˜ ํšจ์œจ์„ฑ์„ ์œ„ํ•œ Heap ๊ตฌ์„ฑ

Weak Generational Hypothesis์˜ ์žฅ์ ์„ ์ตœ๋Œ€ํ•œ ์‚ด๋ฆฌ๊ธฐ ์œ„ํ•ด์„œ HotSpot VM์—์„œ๋Š” ํฌ๊ฒŒ 2๊ฐœ๋กœ ๋ฌผ๋ฆฌ์  ๊ณต๊ฐ„์„ ๋‚˜๋ˆ„์—ˆ๋‹ค. ๋‘˜๋กœ ๋‚˜๋ˆˆ ๊ณต๊ฐ„์ด Heap์˜ Young ์˜์—ญ๊ณผ Old ์˜์—ญ์ด๋‹ค.

  • Young ์˜์—ญ(Yong Generation ์˜์—ญ): ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑํ•œ ๊ฐ์ฒด์˜ ๋Œ€๋ถ€๋ถ„์ด ์—ฌ๊ธฐ์— ์œ„์น˜ํ•œ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฐ์ฒด๊ฐ€ ๊ธˆ๋ฐฉ ์ ‘๊ทผ ๋ถˆ๊ฐ€๋Šฅ ์ƒํƒœ๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ๋งŽ์€ ๊ฐ์ฒด๊ฐ€ Young ์˜์—ญ์— ์ƒ์„ฑ๋˜์—ˆ๋‹ค๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค. ์ด ์˜์—ญ์—์„œ ๊ฐ์ฒด๊ฐ€ ์‚ฌ๋ผ์งˆ๋•Œ Minor GC๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ๋งํ•œ๋‹ค.
  • Old ์˜์—ญ(Old Generation ์˜์—ญ): Young ์˜์—ญ์—์„œ age threshold(๋ฌธ์ง€๋ฐฉ)๊นŒ์ง€ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๊ฐ€ ์—ฌ๊ธฐ๋กœ ๋ณต์‚ฌ๋œ๋‹ค. ๋Œ€๋ถ€๋ถ„ Young ์˜์—ญ๋ณด๋‹ค ํฌ๊ฒŒ ํ• ๋‹นํ•˜๋ฉฐ, ํฌ๊ธฐ๊ฐ€ ํฐ ๋งŒํผ Young ์˜์—ญ๋ณด๋‹ค GC๋Š” ์ ๊ฒŒ ๋ฐœ์ƒํ•œ๋‹ค. ์ด ์˜์—ญ์—์„œ ๊ฐ์ฒด๊ฐ€ ์‚ฌ๋ผ์งˆ ๋•Œ Major GC(ํ˜น์€ Full GC)๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ๋งํ•œ๋‹ค.

Minor GC ๊ณผ์ •

Minor GC๊ฐ€ ์ˆ˜ํ–‰๋˜๋Š” Young ์˜์—ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด 3๊ฐœ์˜ ์˜์—ญ์œผ๋กœ ๋‚˜๋‰œ๋‹ค.

  • Eden ์˜์—ญ
  • Survivor ์˜์—ญ(2๊ฐœ)

๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ€๋“์ฐจ๋Š” ์‹œ์ ์ด GC ์ˆ˜ํ–‰์˜ ์‹œ์ ์ด ๋œ๋‹ค.
Minor GC์˜ ์ˆ˜ํ–‰ ์ ˆ์ฐจ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

[ Minor GC ]

  • ์ƒˆ๋กœ ์ƒ์„ฑํ•œ ๋Œ€๋ถ€๋ถ„์˜ ๊ฐ์ฒด๋Š” Eden ์˜์—ญ์— ์œ„์น˜ํ•œ๋‹ค.
  • Eden ์˜์—ญ์—์„œ GC๊ฐ€ ํ•œ ๋ฒˆ ๋ฐœ์ƒํ•œ ํ›„ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋Š” Survivor ์˜์—ญ ์ค‘ ํ•˜๋‚˜๋กœ ์ด๋™๋œ๋‹ค.
  • Eden ์˜์—ญ์—์„œ GC๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ด๋ฏธ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•˜๋Š” Survivor ์˜์—ญ์œผ๋กœ ๊ฐ์ฒด๊ฐ€ ๊ณ„์† ์Œ“์ธ๋‹ค.
  • ํ•˜๋‚˜์˜ Survivor ์˜์—ญ์ด ๊ฐ€๋“ ์ฐจ๊ฒŒ ๋˜๋ฉด ๊ฐ€๋“์ฐฌ Survivor ์•ˆ์—์„œ GC๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ , ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฅธ Survivor ์˜์—ญ์œผ๋กœ ์ด๋™ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ€๋“ ์ฐฌ Survivor ์˜์—ญ์€ ์•„๋ฌด ๋ฐ์ดํ„ฐ๋„ ์—†๋Š” ์ƒํƒœ๋กœ ๋œ๋‹ค.
  • ์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋‹ค๊ฐ€ age threshold(๋ฌธ์ง€๋ฐฉ) ์ด์ƒ์œผ๋กœ ์‚ด์•„๋‚จ์•„ ์žˆ๋Š” ๊ฐ์ฒด๋Š” Old ์˜์—ญ์œผ๋กœ ์ด๋™ํ•˜๊ฒŒ ๋œ๋‹ค.

์œ„ ๊ทธ๋ฆผ์—์„œ๋„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์ง€๋งŒ Minor GC ๊ณผ์ •์—์„œ Survivor ์˜์—ญ ์ค‘ ํ•˜๋‚˜๋Š” ๋ฐ˜๋“œ์‹œ ๋น„์–ด ์žˆ๋Š” ์ƒํƒœ๋กœ ๋‚จ์•„ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๋งŒ์•ฝ ๋‘ Survivor ์˜์—ญ์— ๋ชจ๋‘ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜๊ฑฐ๋‚˜, ๋‘ ์˜์—ญ ๋ชจ๋‘ ์‚ฌ์šฉ๋Ÿ‰์ด 0์ด๋ผ๋ฉด ๋ฌด์–ธ๊ฐ€ ์ž˜๋ชป๋˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์•ผ ํ•œ๋‹ค.

+ ๋” ๋น ๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ์œ„ํ•œ ์ถ”๊ฐ€ ๋ฐฉ๋ฒ•

HotSpot VM์—์„œ๋Š” ๋ณด๋‹ค ๋น ๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ์œ„ํ•ด์„œ bump-the-pointer์™€ TLABs(Thread-Local Allocation Buffers) ๋ผ๋Š” ๊ธฐ์ˆ ์„ ์ถ”๊ฐ€๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

bump-the-pointer
bump-the-pointer๋Š” Eden ์˜์—ญ์— ํ• ๋‹น๋œ ๋งˆ์ง€๋ง‰ ๊ฐ์ฒด๋ฅผ ์ถ”์ ํ•œ๋‹ค. ๋งˆ์ง€๋ง‰ ๊ฐ์ฒด๋Š” Eden ์˜์—ญ์˜ ๋งจ ์œ„(top)์— ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋‹ค์Œ์— ์ƒ์„ฑ๋˜๋Š” ๊ฐ์ฒด๊ฐ€ ์žˆ์œผ๋ฉด, ํ•ด๋‹น ๊ฐ์ฒด์˜ ํฌ๊ธฐ๊ฐ€ Eden ์˜์—ญ์— ๋„ฃ๊ธฐ ์ ๋‹นํ•œ์ง€๋งŒ ํ™•์ธํ•œ๋‹ค. ๋งŒ์•ฝ ํ•ด๋‹น ๊ฐ์ฒด์˜ ํฌ๊ธฐ๊ฐ€ ์ ๋‹นํ•˜๋‹ค๊ณ  ํŒ์ •๋˜๋ฉด Eden ์˜์—ญ์— ๋„ฃ๊ฒŒ ๋˜๊ณ , ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๊ฐ€ ๋งจ ์œ„์— ์žˆ๊ฒŒ ๋œ๋‹ค.
๋”ฐ๋ผ์„œ, ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋งˆ์ง€๋ง‰์— ์ถ”๊ฐ€๋œ ๊ฐ์ฒด๋งŒ ์ ๊ฒ€ํ•˜๋ฉด ๋˜๋ฏ€๋กœ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ด ์ด๋ฃจ์–ด์ง„๋‹ค.

TLABs(Thread-Local Allocation Buffers)
๋งŒ์•ฝ bump-the-pointer๋ฅผ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด๋ฅผ Thread-Safeํ•˜๊ฒŒ Eden ์˜์—ญ์— ์ €์žฅํ•˜๊ณ  ์ถ”์ ํ•˜๋ ค๋ฉด ๋ฝ(lock)์ด ๋ฐœ์ƒํ•  ์ˆ˜ ๋ฐ–์— ์—†๊ณ , lock-contention ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์€ ๋งค์šฐ ๋–จ์–ด์ง€๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.
์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด TLAB๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ๊ฐ๊ฐ์˜ ๋ชซ์— ํ•ด๋‹นํ•˜๋Š” Eden ์˜์—ญ์˜ ์ž‘์€ ๋ฉ์–ด๋ฆฌ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋„๋ก ํ•˜์—ฌ ์ž๊ธฐ๊ฐ€ ๊ฐ–๊ณ  ์žˆ๋Š” ๋ฉ์–ด๋ฆฌ์—๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ถ„๋ฆฌํ•œ๋‹ค. TLAB๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด bump-the-pointer๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ๋ฝ ์—†์ด ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

Major GC ์ข…๋ฅ˜ ๋ฐ ๊ณผ์ •

Old ์˜์—ญ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ€๋“ ์ฐจ๋ฉด GC๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ์ด๋•Œ ์–ด๋–ค GC ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋ƒ์— ๋”ฐ๋ผ ๊ณผ์ •์ด ๋‹ฌ๋ฆฌ์ง€๋Š”๋ฐ JDK 7 ๊ธฐ์ค€์œผ๋กœ ์•„๋ž˜์™€ ๊ฐ™์ด 5๊ฐ€์ง€ ๋ฐฉ์‹์ด ์กด์žฌํ•œ๋‹ค.

Serial GC

์•ž์„œ ์‚ดํŽด๋ณธ mark-sweep-compact ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋Š” GC์ด๋‹ค. JDK 5,6 ์—์„œ ์‚ฌ์šฉ๋˜๋Š” GC๋กœ Minor GC์™€ Major GC ๋ชจ๋‘ ์‹ฑ๊ธ€์Šค๋ ˆ๋“œ๋กœ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— GC๊ฐ€ ์ง„ํ–‰๋˜๋Š” ์‹œ๊ฐ„(Stop-The-World)์ด ๋‹ค๋ฅธ GC์— ๋น„ํ•ด ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค. ์šด์˜ ์„œ๋ฒ„์—์„œ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

Parallel GC

Serial GC์™€ ๋™์ผํ•˜๊ฒŒ mark-sweep-compact ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ, Young ์˜์—ญ์—์„œ ๋ฐœ์ƒํ•˜๋Š” Minor GC ์ˆ˜ํ–‰์‹œ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋”ฐ๋ผ์„œ Serial GC๋ณด๋‹ค ๋น ๋ฅด๊ฒŒ ๊ฐ์ฒด๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์‚ฌ์šฉํ•˜๋Š” ์žฅ๋น„์˜ CPU๊ฐ€ ๋‹จ์ผ ์ฝ”์–ด์ธ ๊ฒฝ์šฐ Parallel GC๋กœ ์„ค์ •ํ•ด๋„ Serial GC๋กœ ์ˆ˜ํ–‰๋œ๋‹ค.

Parallel Old GC(Parallel Compacting GC)

JDK 5 update 6๋ถ€ํ„ฐ ์ œ๊ณตํ•œ GC ๋ฐฉ์‹์œผ๋กœ Parallel GC์™€ Young ์˜์—ญ์˜ ๋™์ž‘ ๋ฐฉ์‹์€ ๋™์ผํ•˜๋‹ค. ํ•˜์ง€๋งŒ Old ์˜์—ญ์—์„œ ๋ฐœ์ƒํ•˜๋Š” Full GC๋„ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, Old ์˜์—ญ์—์„œ ๋ฐœ์ƒํ•˜๋Š” GC๋ฅผ ์ฒ˜๋ฆฌํ• ๋•Œ Mark-Summary-Compaction ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•œ๋‹ค. Summary ๋‹จ๊ณ„๋Š” ์•ž์„œ GC๋ฅผ ์ˆ˜ํ–‰ํ•œ ์˜์—ญ์— ๋Œ€ํ•ด์„œ ๋ณ„๋„๋กœ ์‚ด์•„ ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์‹๋ณ„ํ•œ๋‹ค๋Š” ์ ์—์„œ Mark-Sweep-Compaction ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ Sweep ๋‹จ๊ณ„์™€ ๋‹ค๋ฅด๋ฉฐ, ์•ฝ๊ฐ„ ๋” ๋ณต์žกํ•œ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์นœ๋‹ค.

Concurrent Mark & Sweep GC(์ดํ•˜ CMS)

CMS GC๋Š” Old ์˜์—ญ์—์„œ ๋ฐœ์ƒํ•˜๋Š” Full GC์˜ ์ˆ˜ํ–‰์‹œ๊ฐ„์„ ์ตœ์†Œํ•œ์œผ๋กœ ํ•˜๋Š”๋ฐ ์ดˆ์ ์„ ๋‘” GC ๋ฐฉ์‹์ด๋‹ค. ์ฆ‰ Stop-The-World์˜ ์‹œ๊ฐ„์„ ์ตœ์†Œํ™” ํ•œ๋‹ค. ์ž‘๋™ ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

  • Initial Mark : ํด๋ž˜์Šค ๋กœ๋”์—์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ฐ์ฒด ์ค‘ ์‚ด์•„ ์žˆ๋Š” ๊ฐ์ฒด๋งŒ ์ฐพ๋Š”๋‹ค.
  • Concurrent Mark(STW ๋ฐœ์ƒX) : Initial ๊ณผ์ •์—์„œ ์ฐพ์€ ๊ฐ์ฒด์—์„œ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ๋”ฐ๋ผ๊ฐ€๋ฉด์„œ ํ™•์ธํ•œ๋‹ค. ํ•ด๋‹น ๊ณผ์ •์€ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ์ง„ํ–‰ํ•˜๋Š” ๊ณผ์ •์—์„œ ๋™์‹œ์— ์ง„ํ–‰๋œ๋‹ค.
  • Remark : Concurrent ๊ณผ์ •์—์„œ ์ƒˆ๋กœ ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ์ฐธ์กฐ๊ฐ€ ๋Š๊ธด ๊ฐ์ฒด๋ฅผ ํ™•์ธํ•œ๋‹ค.
  • Concurrent Sweep(STW ๋ฐœ์ƒX) : ์“ฐ๋ ˆ๊ธฐ๋ฅผ ์ •๋ฆฌํ•˜๋Š” ์ž‘์—…์„ ์‹คํ–‰ํ•œ๋‹ค. ํ•ด๋‹น ๊ณผ์ •๋„ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ์ง„ํ–‰ํ•˜๋Š” ๊ณผ์ •์—์„œ ๋™์‹œ์— ์ง„ํ–‰๋œ๋‹ค.

CMS GC๋ฐฉ์‹์€ ์œ„์—์„œ ํ™•์ธํ•œ ๊ฒƒ์ฒ˜๋Ÿผ Initial Mark ๊ณผ์ •๊ณผ Remark ๊ณผ์ •๋งŒ stop-the-world๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ stop-the-world ์‹œ๊ฐ„์ด ๋งค์šฐ ์งง๋‹ค. ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‘๋‹ต ์†๋„๊ฐ€ ๋งค์šฐ ์ค‘์š”ํ•  ๋•Œ CMS GC๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, Low Latency GC๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค.

์‹œ๊ฐ„์€ ๋งค์šฐ ์งง์ง€๋งŒ CMS GC์—๋„ ๋‹จ์ ์ด ์กด์žฌํ•œ๋‹ค.

  1. ๋‹ค๋ฅธ GC ๋ฐฉ์‹๋ณด๋‹ค ๋ฉ”๋ชจ๋ฆฌ์™€ CPU๋ฅผ ๋” ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.
  2. Compaction ๋‹จ๊ณ„๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณต๋˜์ง€ ์•Š๋Š”๋‹ค.
    ์ฆ‰, ๋ฉ”๋ชจ๋ฆฌ ๋‹จํŽธํ™”์— ๋Œ€ํ•œ ์šฐ๋ ค๊ฐ€ ์žˆ๋‹ค. ๋งŒ์•ฝ ์—ฐ์†์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ด ๋ถˆ๊ฐ€๋Šฅํ•  ์ •๋„๋กœ ๋ฉ”๋ชจ๋ฆฌ ๋‹จํŽธํ™”๊ฐ€ ์ง„ํ–‰๋˜์—ˆ๋‹ค๋ฉด Compaction ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ํ•ด๋‹น ์ž‘์—…์€ ๋‹ค๋ฅธ GC์—์„œ์˜ Compaction ์ž‘์—…์— ๋น„ํ•ด stop-the-world ์‹œ๊ฐ„์ด ๊ธธ๋‹ค. ๋”ฐ๋ผ์„œ CMS GC๋ฅผ ์‚ฌ์šฉํ• ๋•Œ๋Š” Compaction ์ž‘์—…์ด ์–ผ๋งˆ๋‚˜ ์ผ์–ด๋‚˜๋Š”์ง€ ํŒŒ์•…ํ•œ ํ›„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

G1(Garbage First) GC

๊ธฐ์กด GC์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋“ค๋กœ๋Š” ํฐ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ข‹์€ ์„ฑ๋Šฅ์„ ๋‚ด๊ธฐ ํž˜๋“ค์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ๊ฐœ์„ ํ•˜๊ณ ์ž ๋“ฑ์žฅํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. G1 GC ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ธฐ์กด์˜ ์ •ํ˜•ํ™”๋œ Heap ๊ตฌ์กฐ๊ฐ€ ์•„๋‹Œ Heap์„ Region์ด๋ผ๋Š” ๋…ผ๋ฆฌ์ ์ธ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ ์„œ ๊ด€๋ฆฌํ•˜๋ฉฐ ๊ฐ๊ฐ์˜ Region์— ํŠน์ • ์—ญํ• (Eden,Survivor,Old,Humonogous)์„ ๋™์ ์œผ๋กœ ๋ถ€์—ฌํ•œ๋‹ค.

JVM Heap์€ 2048๊ฐœ์˜ Region์œผ๋กœ ๋‚˜๋‰  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐ Region์˜ ํฌ๊ธฐ๋Š” 1MB ~ 32MB ์‚ฌ์ด๋กœ ์ง€์ •๋œ๋‹ค.
์œ„ ์—ญํ•  ์ค‘ Humonogous๋Š” Region ํฌ๊ธฐ์˜ 50%๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ณต๊ฐ„์ด๋ฉฐ, ์ด ๊ณต๊ฐ„์—์„œ๋Š” GC๊ฐ€ ํšจ์œจ์ ์œผ๋กœ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š” ์˜์—ญ์ด๋‹ค.

G1 GC์—์„œ Young GC ๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ๋Š” stop-the-world ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜๋ฉฐ, stop-the-world ์‹œ๊ฐ„์„ ์ตœ๋Œ€ํ•œ ์ค„์ด๊ธฐ ์œ„ํ•ด ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ๋กœ GC๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. Young GC๋Š” ๊ฐ Region ์ค‘ GC๋Œ€์ƒ ๊ฐ์ฒด๊ฐ€ ๊ฐ€์žฅ ๋งŽ์€ Region(Eden ๋˜๋Š” Survivor ์—ญํ• )์—์„œ ์ˆ˜ํ–‰ ๋˜๋ฉฐ, ์ด Region ์—์„œ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฅธ Region(Survivor ์—ญํ• ) ์œผ๋กœ ์˜ฎ๊ธด ํ›„, ๋น„์›Œ์ง„ Region์„ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ Region์œผ๋กœ ๋Œ๋ฆฌ๋Š” ํ˜•ํƒœ ๋กœ ๋™์ž‘ํ•œ๋‹ค.

G1 GC๋Š” CMS GC์™€ ๋‹ค๋ฅด๊ฒŒ Compaction ๋‹จ๊ณ„๋ฅผ ์ง„ํ–‰ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๋‹จํŽธํ™” ๋ฌธ์ œ๋ฅผ ์—†์•ด๋‹ค. ๋˜ํ•œ stop-the-world ์‹œ๊ฐ„์„ ์˜ˆ์ธกํ•  ์ˆ˜ ์žˆ๋‹ค.

Next..

๋‹ค์Œ ๊ธ€์—์„œ๋Š” GC๊ฐ€ ํŒ๋ณ„ํ•˜๋Š” ๊ฐ์ฒด์— ๋Œ€ํ•ด ๋‹ค๋ค„๋ณด๊ฒ ๋‹ค.

์ฐธ๊ณ  ์ž๋ฃŒ

Java Garbage Collection _ NAVER D2
JVM์— ๊ด€ํ•˜์—ฌ - Part 4, Garbage Collection ๊ธฐ์ดˆ _ Tecoble
Java Platform, Standard Edition HotSpot Virtual Machine Garbage Collection Tuning Guide _ Oracle Java 8

profile
์ง€๋‚˜์น˜์ง€ ์•Š๊ธฐ ์œ„ํ•˜์—ฌ

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