4 ๋ถ„ ์†Œ์š”


1. GC(Garbage Collector)๋ž€ ?


Java Application์€ ํ•„์š”์— ๋”ฐ๋ผ์„œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๊ฐ์ฒด๋ฅผ ์–ป๋Š”๋‹ค.
Application์ด ์ž‘์„ฑ๋œ ๋กœ์ง์„ ๋”ฐ๋ผ ์ง„ํ–‰๋˜๋ฉฐ ๋ฉ”๋ชจ๋ฆฌ์— ๊ณ„์†ํ•ด์„œ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋“ค์˜ ์ •๋ณด๊ฐ€ ์˜ฌ๋ผ๊ฐˆ ๊ฒƒ์ด๊ณ , Application์—์„œ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ •๋ณด๋„ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๋‹ค.
์ €์žฅ ๊ณต๊ฐ„์€ ๋ฌดํ•œํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๊ฐ€๋“ ์ฐจ๊ฒŒ ๋œ๋‹ค๋ฉด OOM Error(OutOfMemoryErrors)๋กœ ์ธํ•ด์„œ Application์ด ๋น„์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.

Application์—์„œ ๋”์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„ ์ฐธ์กฐ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋ฅผ Garbage๋ผ๊ณ  ํ•œ๋‹ค.
GC๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ์ค‘์ธ ๊ฐ์ฒด์™€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋ฅผ ์‹๋ณ„ํ•ด Garbage๋ฅผ ์ž๋™์œผ๋กœ ๊ฒฐ์ •ํ•˜๊ณ  ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋ฅผ ์‚ญ์ œํ•ด ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํšŒ์ˆ˜ํ•ด ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

Java์˜ GC๋Š” ์ž๋™ ํ”„๋กœ์„ธ์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— Java ๊ฐœ๋ฐœ์ž๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ฐ์ฒด๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ํ•ด์ œํ•ด์ค˜์•ผ ํ•˜๋Š” ๋ถ€๋‹ด์ด ์—†๋‹ค.
๋งŒ์•ฝ ๋ช…์‹œ์ ์œผ๋กœ ํ•ด์ œํ•ด์ฃผ๊ณ  ์‹ถ๋‹ค๋ฉด

Student student = new Student();
student.setName("์šฐ์˜์šฐ");
student = null;

System.gc();

์œ„์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ๊ฐ์ฒด์— null๋กœ ์ง€์ •ํ•˜๊ฑฐ๋‚˜ System.gc()๋ฅผ ์‚ฌ์šฉํ•ด GC๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. (System.gc()๋ฅผ ํ˜ธ์ถœํ•˜๋Š”๊ฑด ์‹œ์Šคํ…œ์˜ ์„ฑ๋Šฅ์— ๋งค์šฐ ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฏ€๋กœ ์ ˆ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋œ๋‹ค.)

2. GC์˜ ๊ตฌ์กฐ์™€ ์ฒ˜๋ฆฌ๊ณผ์ •

Reachability

Java GC๋Š” ๊ฐ์ฒด๊ฐ€ ๊ฐ€๋น„์ง€์ธ์ง€ ํŒ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด์„œ reachability๋ผ๋Š” ๊ฐœ๋…์„ ์‚ฌ์šฉํ•œ๋‹ค. ์–ด๋–ค ๊ฐ์ฒด์— ์œ ํšจํ•œ ์ฐธ์กฐ๊ฐ€ ์žˆ์œผ๋ฉด โ€˜reachableโ€™๋กœ ์—†์œผ๋ฉด โ€˜unreachableโ€™๋กœ ๊ตฌ๋ณ„ํ•˜๊ณ , unreachable ๊ฐ์ฒด๋ฅผ ๊ฐ€๋น„์ง€๋กœ ๊ฐ„์ฃผํ•ด GC๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

GC์˜ ๊ตฌ์กฐ

GC๋Š” ๋‘๊ฐ€์ง€ ๊ฐ€์„ค ํ•˜์— ๋งŒ๋“ค์–ด์กŒ๋‹ค.

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

์ด๋Ÿฌํ•œ ๊ฐ€์„ค์„ weak generational hypothesis๋ผ ํ•œ๋‹ค. ์ด ๊ฐ€์„ค์˜ ์žฅ์ ์„ ์ตœ๋Œ€ํ•œ ์‚ด๋ฆฌ๊ธฐ ์œ„ํ•ด์„œ HotSpot JVM์—์„œ๋Š”
ํฌ๊ฒŒ Young Generation, Old Generation 2๊ฐœ๋กœ ๋ฌผ๋ฆฌ์  ๊ณต๊ฐ„์„ ๋‚˜๋ˆ„์—ˆ๋‹ค.

Hotspot JVM

Hotspot JVM์€ ๋ฏธ๊ตญ์˜ Longview Technologies LLC๋ผ๋Š” ํšŒ์‚ฌ์—์„œ 1999๋…„์— ์ฒ˜์Œ ๋ฐœํ‘œ๋œ JVM์ด๋‹ค. ์ดํ›„ ์ด ํšŒ์‚ฌ๋Š” ๊ฐ™์€ ํ•ด SUN์— ์˜ํ•ด ์ธ์ˆ˜๋˜์–ด 1.3๋ฒ„์ „๋ถ€ํ„ฐ SUN์˜ ๊ธฐ๋ณธ์ ์ธ JVM์ด ๋˜์—ˆ๋‹ค. Hotspot JVM์€ ํ˜„์žฌ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ JVM ์ค‘์˜ ํ•˜๋‚˜๋กœ Windows, Linux, Solaris๋Š” ๋ฌผ๋ก  Mac OS์™€ ๊ธฐํƒ€ UJnix OS์—๋„ ํƒ‘์žฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. HP Unix์—์„œ๋„ Hotspot JVM์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ๊ณ , ์‹ฌ์ง€์–ด Oracle์„ ์„ค์น˜ํ•  ๋•Œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ค์น˜๋˜์–ด ๊ตฌ๋™๋˜๋Š” JVM ์กฐ์ฐจ Hotspot JVM์ด๋‹ค. ๋”ฐ๋ผ์„œย Sun, Oracle, HP, Windows, Linux, MacOS์—์„œ ์ œ๊ณตํ•˜๋Š” JVM์€ Hotspot JVM์œผ๋กœ ๋ช…๋ช…ํ•˜๊ณ  IBM์—์„œ ์ œ๊ณตํ•˜๋Š” JVM์€ IBM JVM์ด๋ผ ๋ถ€๋ฅด๊ธฐ๋„ย ํ•œ๋‹ค.

Young Generation๊ณผ Old Generation

  • Young Generation : ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑํ•œ ๋Œ€๋ถ€๋ถ„์˜ ๊ฐ์ฒด๊ฐ€ ์—ฌ๊ธฐ์— ์œ„์น˜ํ•œ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฐ์ฒด๊ฐ€ ๊ธˆ๋ฐฉ ์ ‘๊ทผ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์€ ์ˆ˜์˜ ๊ฐ์ฒด๋“ค์ด ์ด ์˜์—ญ์—์„œ ์ƒ์„ฑ๋˜์—ˆ๋‹ค๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค.
    Young Generation์—์„œ GC๊ฐ€ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ Minor GC๋ผ๊ณ  ํ•œ๋‹ค.
  • Old Generation : ์ ‘๊ทผ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๊ฐ€๋˜์ง€ ์•Š์•„ Young Generation์—์„œ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๊ฐ€ ์œ„์น˜ํ•œ๋‹ค. Young Generation๋ณด๋‹ค GC๊ฐ€ ์ ๊ฒŒ ๋ฐœ์ƒํ•œ๋‹ค.
    Old Generation์—์„œ GC๊ฐ€ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ Major GC๋ผ๊ณ  ํ•œ๋‹ค.

Young Generation

Young Generation์€ ๋‹ค์‹œ Survivor ์˜์—ญ๊ณผ Eden ์˜์—ญ์œผ๋กœ ๋‚˜๋‰œ๋‹ค.

  • Eden์˜์—ญ์€ ๊ฐ์ฒด๊ฐ€ Heap์— ์ตœ์ดˆ๋กœ ํ• ๋‹น๋˜๋Š” ์žฅ์†Œ์ด๋‹ค.
  • Survivor ์˜์—ญ์€ Eden ์˜์—ญ์—์„œ ๋„˜์–ด์˜จ ๊ฐ์ฒด๋“ค์ด ๋จธ๋ฌด๋ฅด๋Š” ์žฅ์†Œ์ด๋‹ค.
  • Survivor ์˜์—ญ์€ ๋‘ ๊ฐœ์˜ ์˜์—ญ(Survivor1, Survivor2)์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

  • Young Generation์˜ ์ฒ˜๋ฆฌ ์ ˆ์ฐจ
    1. Eden ์˜์—ญ์ด ๊ฝ‰ ์ฐจ๊ฒŒ ๋˜๋ฉด ๊ฐ์ฒด์˜ ์ฐธ์กฐ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•œ๋‹ค.
    2. ์ฐธ์กฐ๊ฐ€ ๋˜์–ด์žˆ๋Š” ๊ฐ์ฒด๋ผ๋ฉด Survivor ์˜์—ญ์œผ๋กœ ๋„˜๊ธฐ๊ณ  ์ฐธ์กฐ๊ฐ€ ๋˜์–ด์žˆ์ง€ ์•Š์€ Garbage๋ผ๋ฉด ๊ทธ๋ƒฅ ๋‚จ๊ฒจ ๋†“๋Š”๋‹ค.
    3. ์ฐธ์กฐ๋˜์–ด ์žˆ๋Š” ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ Survivor ์˜์—ญ์œผ๋กœ ๋„˜์–ด๊ฐ€๋ฉด Eden ์˜์—ญ์„ ๋ชจ๋‘ ์ฒญ์†Œํ•œ๋‹ค.
    4. Survivor ์˜์—ญ๋„ ๊ฝ‰ ์ฐจ๊ฒŒ ๋˜๋ฉดMinor GC๊ฐ€ ์ž‘๋™ํ•œ๋‹ค.
    5. ํ•œ ์ชฝ์˜ Survivor๊ฐ€ ๊ฐ€๋“ ์ฐจ๋ฉด ์ฐธ์กฐ๋œ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฅธ Survivor์— ์˜ฎ๊ธฐ๊ณ  GC๊ฐ€ ์ž‘๋™ํ•œ๋‹ค.
    6. ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋“ค์ด ๋‹ค๋ฅธ Survivor ์˜์—ญ์œผ๋กœ ๊ฐˆ ๋•Œ ๊ฐ์ฒด๋“ค์˜ ๋‚˜์ด๊ฐ€ ์˜ฌ๋ผ๊ฐ„๋‹ค.
      (๋”ฐ๋ผ์„œ Survovir์˜ ์˜์—ญ ์ค‘ ํ•œ ๊ณณ์€ ๋ฐ˜๋“œ์‹œ ๋น„์–ด์žˆ๋Š” ์ƒํƒœ์ด๋‹ค.)
    7. ์ด๋Ÿฌํ•œ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•ด Survivor ์˜์—ญ์—์„œ ์˜ค๋ž˜ ์‚ด์•„๋‚จ์•„ ์ผ์ • ๋‚˜์ด ์ด์ƒ์ด ๋œ ๊ฐ์ฒด๋“ค์€ Old Generation์œผ๋กœ ์ด๋™๋œ๋‹ค.

์•„๋ž˜์˜ ๊ทธ๋ฆผ์œผ๋กœ ์„ค๋ช…์„ ํ™•์ธํ•ด ๋ณด์ž.

Hbump-the-pointer, TLABs(Thread-Local Allocation Buffers) ์„ค๋ช…

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

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

๊ทธ๋Ÿฌ๋‚˜ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์„ ๊ณ ๋ คํ•˜๋ฉด ์ด์•ผ๊ธฐ๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค. Thread-Safeํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋งŒ์•ฝ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด๋ฅผ Eden ์˜์—ญ์— ์ €์žฅํ•˜๋ ค๋ฉด ๋ฝ(lock)์ด ๋ฐœ์ƒํ•  ์ˆ˜ ๋ฐ–์— ์—†๊ณ , lock-contention ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์€ ๋งค์šฐ ๋–จ์–ด์ง€๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. HotSpot VM์—์„œ ์ด๋ฅผ ํ•ด๊ฒฐํ•œ ๊ฒƒ์ด TLABs์ด๋‹ค.

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

Old Generation

Young Generation์—์„œ ์˜ค๋ž˜ ์‚ด์•„๋‚จ์•„ ์ผ์ • Age์ด์ƒ์ด ๋œ ๊ฐ์ฒด๋Š” Promotion์ด ๋ฐœ์ƒํ•ด Old Generation ์˜์—ญ์œผ๋กœ ์ด๋™ํ•œ๋‹ค.
Old Generation ์˜์—ญ์ด ์ฑ„์›Œ์ง€๋‹ค๊ฐ€ ๊ฐ€๋“์ฐจ๊ฒŒ ๋˜๋ฉด Young Generation ์—์„œ ์ฒ˜๋Ÿผ GC๊ฐ€ ๋™์ž‘ํ•œ๋‹ค.

3. GC ๋ฐฉ์‹

Old Generation์—์„œ GC์˜ ๋ฐฉ์‹์— ๋”ฐ๋ผ ์ฒ˜๋ฆฌ ์ ˆ์ฐจ๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค.
JVM์˜ ๋ฒ„์ „์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ๊ฐ€์ง€ GC ๋ฐฉ์‹์ด ์ถ”๊ฐ€๋˜๊ณ  ๋ฐœ์ „๋˜์—ˆ๋‹ค. ๋ฒ„์ „๋ณ„๋กœ ์ง€์›ํ•˜๋Š” GC๋Š” ์ฐจ์ด๊ฐ€ ์กด์žฌํ•œ๋‹ค.

Serial GC

Young ์˜์—ญ์—์„œ์˜ GC๋Š” ์•ž์—์„œ ์„ค๋ช…ํ•œ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ณ  Old ์˜์—ญ์—์„œ์˜ GC๋Š” Mark-sweep-compact๋ผ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•œ๋‹ค.
์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋‹จ๊ณ„๋ณ„๋กœ ์„ค๋ช…ํ•˜๋ฉด

  • Old ์˜์—ญ์— ์‚ด์•„์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์‹๋ณ„(Mark)
  • Heap์˜ ์•ž๋ถ€๋ถ„๋ถ€ํ„ฐ ํ™•์ธํ•˜์—ฌ ์‚ด์•„ ์žˆ๋Š” ๊ฐ์ฒด๋งŒ ๋‚จ๊ธด๋‹ค(Sweep)
  • ๊ฐ ๊ฐ์ฒด๋“ค์ด ์—ฐ์†๋˜๊ฒŒ ์Œ“์ด๋„๋ก Heap์˜ ๊ฐ€์žฅ ์•ž๋ถ€๋ถ„๋ถ€ํ„ฐ ์ฑ„์›Œ์„œ ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•˜๋Š” ๋ถ€๋ถ„๊ณผ ๊ฐ์ฒด๊ฐ€ ์—†๋Š” ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค.(Compact)

Serial GC๋Š” ์ ์€ ๋ฉ”๋ชจ๋ฆฌ์™€ CPU ์ฝ”์–ด ๊ฐœ์ˆ˜๊ฐ€ ์ ์„ ๋•Œ ์ ํ•ฉํ•œ ๋ฐฉ์‹์ด๋‹ค.
๋”ฐ๋ผ์„œ ์šด์˜ ์„œ๋ฒ„์—์„œ ์ ˆ๋Œ€ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ ๋˜๋Š” ๋ฐฉ์‹์ด Serial GC์ด๋‹ค. Serial GC๋Š” ๋ฐ์Šคํฌํ†ฑ์˜ CPU ์ฝ”์–ด๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ์„ ๋•Œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“  ๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ์— Serial GC๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์ด ๋งŽ์ด ๋–จ์–ด์ง„๋‹ค.

Parallel GC

Parallel GC๋Š” Serial GC์™€ ๊ธฐ๋ณธ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ฐ™๋‹ค.
Serial GC๋Š” ์ฒ˜๋ฆฌํ•˜๋Š” ์“ฐ๋ ˆ๋“œ๊ฐ€ ํ•˜๋‚˜์ธ ๊ฒƒ์— ๋น„ํ•ด Parallel GC๋Š” Miner GC, Major GC ๋ชจ๋‘ ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์ฒ˜๋ฆฌํ•œ๋‹ค.

CMS GC

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

CMS GC๋Š” stop-the-world ์‹œ๊ฐ„์ด ๋งค์šฐ ์งง๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์–ด ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‘๋‹ต ์†๋„๊ฐ€ ๋งค์šฐ ์ค‘์š”ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
๋ฐ˜๋ฉด์— ๋‹จ์ ์œผ๋กœ๋Š”

  • ๋‹ค๋ฅธ GC ๋ฐฉ์‹๋ณด๋‹ค ๋ฉ”๋ชจ๋ฆฌ์™€ CPU๋ฅผ ๋” ๋งŽ์ด ์‚ฌ์šฉ
  • ๋ฉ”๋ชจ๋ฆฌ ํŒŒํŽธํ™” ๊ฐ€ ์žˆ๋‹ค.

G1 GC

์‚ฌ์ง„์—์„œ ๋ณด์ด๋“ฏ์ด G1 GC๋Š” ๋ฐ”๋‘‘ํŒ์˜ ๊ฐ ์˜์—ญ์— ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•˜๊ณ  GC๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
๊ธฐ์กด์˜ Young, Old ์˜์—ญ์˜ ๊ฐœ๋…๊ณผ ๋‹ค๋ฅธ Resion์ด๋ผ๋Š” ๊ฐœ๋…์„ ๋„์ž…ํ–ˆ๋‹ค.
์˜์—ญ์ด ๊ฝ‰ ์ฐจ๊ฒŒ ๋˜๋ฉด ๋‹ค๋ฅธ ์˜์—ญ์—์„œ ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•˜๊ณ  GC๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ์„ค๋ช…ํ–ˆ๋˜ Young ์˜์—ญ์—์„œ Old ์˜์—ญ์œผ๋กœ ์ด๋™ํ•˜๋Š” ๋‹จ๊ณ„๊ฐ€ ์‚ฌ๋ผ์ง„ GC ๋ฐฉ์‹์ด๋ผ๊ณ  ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค.

  • CMS์™€ ๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ ์‹œ์ž‘
  • Heap์— ์ „์—ญ์ ์œผ๋กœ Marking
  • ๊ฐ€์žฅ ๋งŽ์€ ๊ณต๊ฐ„์ด ์žˆ๋Š” ๊ณณ๋ถ€ํ„ฐ ๋ฉ”๋ชจ๋ฆฌ ํšŒ์ˆ˜๋ฅผ ์ง„ํ–‰

CMS GC์˜ CPU ๋ฆฌ์†Œ์Šค ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ํŒŒํŽธํ™”์˜ ๋‹จ์ ์„ ํ•ด๊ฒฐํ•˜์˜€๋‹ค.

์ฐธ๊ณ ํ•œ ๋‚ด์šฉ์˜ ์ถœ์ฒ˜

https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html https://d2.naver.com/helloworld/1329 https://www.eginnovations.com/blog/what-is-garbage-collection-java/