Skip to content

Latest commit

ย 

History

History
213 lines (135 loc) ยท 21 KB

Garbage-Collection.md

File metadata and controls

213 lines (135 loc) ยท 21 KB

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜

  1. ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(Garbage Collection, GC)์ด๋ž€?
  2. ๋‹จ์ 
  3. ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ๋Œ€์ƒ์ด ๋˜๋Š” ๊ฐ์ฒด๋“ค
  4. Minor GC์™€ Major CG
  5. ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ๋™์ž‘ ๋ฐฉ์‹
    1. Minor GC์˜ ๋™์ž‘ ๋ฐฉ์‹
    2. Major GC์˜ ๋™์ž‘ ๋ฐฉ์‹
    3. ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ์š”์•ฝ
  6. ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜
    1. Serial GC
    2. Parallel GC
    3. Parallel Old GC
    4. CMS(Concurrent Mark Sweep) GC
    5. G1(Garbage First) GC
      1. Minor GC
      2. Major GC
  7. ์ฐธ๊ณ  ์ž๋ฃŒ

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(Garbage Collection, GC)์ด๋ž€?

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์€ ์ž๋ฐ”์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๊ธฐ๋ฒ• ์ค‘ ํ•˜๋‚˜๋กœ,JVM์˜ ํž™(Heap) ์˜์—ญ์—์„œ ๋™์ ์œผ๋กœ ํ• ๋‹นํ–ˆ๋˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ ์ค‘ ํ•„์š” ์—†๊ฒŒ ๋œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ์ฃผ๊ธฐ์ ์œผ๋กœ ์‚ญ์ œํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งํ•œ๋‹ค.

C๋‚˜ C++์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด ์—†์–ด malloc(), free() ํ•จ์ˆ˜ ๋“ฑ์„ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น, ํ•ด์ œ๋ฅผ ์ง„ํ–‰ํ•ด์•ผ ํ•˜๋Š” ๋ฐ˜๋ฉด Java๋Š” JVM์— ํƒ‘์žฌ๋œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ๋Œ€ํ–‰ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Memory Leak) ๋ฌธ์ œ์— ๋Œ€ํ•ด ์™„๋ฒฝํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๊ณ  ๊ฐœ๋ฐœ์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. ๋ฌผ๋ก  Java์—์„œ๋„ System.gc()๋ฅผ ์ด์šฉํ•ด ์ˆ˜๋™ ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์†Œํ”„ํŠธ์›จ์–ด ์„ฑ๋Šฅ์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฏ€๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š๋‹ค.

๋‹จ์ 

๊ทธ๋Ÿฌ๋‚˜ Java์˜ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์€ ์žฅ์  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹จ์  ์—ญ์‹œ ์กด์žฌํ•˜๋Š”๋ฐ, ๋Œ€ํ‘œ์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•ด์ œ๋˜๋Š” ์ •ํ™•ํ•œ ์‹œ์ ์„ ์•Œ ์ˆ˜ ์—†๋‹ค.
  2. ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(GC)์ด ๋™์ž‘ํ•˜๋Š” ๋™์•ˆ์—๋Š” ๋‹ค๋ฅธ ๋™์ž‘์„ ๋ฉˆ์ถ”๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
    • ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๋‹จ์ ์œผ๋กœ, GC๊ฐ€ ๋„ˆ๋ฌด ์ž์ฃผ ์‹คํ–‰๋˜๋ฉด ์†Œํ”„ํŠธ์›จ์–ด ์„ฑ๋Šฅ ํ•˜๋ฝ์˜ ์›์ธ์ด ๋  ์ˆ˜ ์žˆ๋‹ค.
    • ์ผ์‹œ์ ์ธ ์ง€์—ฐ์—๋„ ๋ฏผ๊ฐํ•œ ์‹ค์‹œ๊ฐ„ ์‹œ์Šคํ…œ์—์„œ๋Š” GC์˜ ์‚ฌ์šฉ์ด ์ ํ•ฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ๋Œ€์ƒ์ด ๋˜๋Š” ๊ฐ์ฒด๋“ค

coding-factory.tistory.com/829-GC_๋Œ€์ƒ

๊ฐ์ฒด๋“ค์€ ์‹ค์‹ค์ ์œผ๋กœ ํž™ ์˜์—ญ(Heap Area)์—์„œ ์ƒ์„ฑ๋˜๊ณ  ๋ฉ”์†Œ๋“œ ์˜์—ญ(Method Area)์ด๋‚˜ ์Šคํƒ ์˜์—ญ(Stack Area) ๋“ฑ ๋ฃจํŠธ ์˜์—ญ์—์„œ๋Š” ํž™ ์˜์—ญ์— ์ƒ์„ฑ๋œ ๊ฐ์ฒด์˜ ์ฃผ์†Œ๋งŒ ์ฐธ์กฐํ•˜๋Š” ํ˜•์‹์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ์ƒ์„ฑ๋œ ํž™ ์˜์—ญ์˜ ๊ฐ์ฒด๋“ค์ด ๋ฉ”์„œ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋Š” ๋“ฑ์˜ ์ด๋ฒคํŠธ๋“ค๋กœ ์ธํ•˜์—ฌ ํž™ ์˜์—ญ ๊ฐ์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ฐธ์กฐ ๋ณ€์ˆ˜๊ฐ€ ์‚ญ์ œ๋˜๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜๋ฉด ์œ„์˜ ๊ทธ๋ฆผ์—์„œ์˜ ๋นจ๊ฐ„์ƒ‰ ๊ฐ์ฒด์™€ ๊ฐ™์ด ํž™ ์˜์—ญ์—์„œ ์–ด๋””์—์„œ๋„ ์ฐธ์กฐ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋“ค์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐ์ฒด๋“ค์„ Unreachableํ•˜๋‹ค๊ณ  ํ•˜๋ฉฐ, ์ฃผ๊ธฐ์ ์œผ๋กœ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ์ œ๊ฑฐํ•ด์ค€๋‹ค.

Reachable : ๊ฐ์ฒด๊ฐ€ ์ฐธ์กฐ๋˜๊ณ  ์žˆ๋Š” ์ƒํƒœ
Unreachable : ๊ฐ์ฒด๊ฐ€ ์ฐธ์กฐ๋˜๊ณ  ์žˆ์ง€ ์•Š์€ ์ƒํƒœ (GC์˜ ๋Œ€์ƒ์ด ๋จ)

Minor GC์™€ Major CG

JVM์˜ ํž™ ์˜์—ญ(Heap Area)์€ ์ฒ˜์Œ ์„ค๊ณ„๋  ๋•Œ ๋‹ค์Œ์˜ ๋‘ ๊ฐ€์ง€๋ฅผ ์ „์ œ(Weak Generational Hypothesis)๋กœ ์„ค๊ณ„๋˜์—ˆ๋‹ค.

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

์ฆ‰, ๊ฐ์ฒด๋Š” ๋Œ€๋ถ€๋ถ„ ์ผํšŒ์„ฑ์ด๋ฉฐ, ๋ฉ”๋ชจ๋ฆฌ์— ์˜ค๋žซ๋™์•ˆ ๋‚จ์•„์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ๋“œ๋ฌผ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด์˜ ์ƒ์กด ๊ธฐ๊ฐ„์— ๋”ฐ๋ผ ๋ฌผ๋ฆฌ์ ์ธ ํž™ ์˜์—ญ์„ ๋‚˜๋ˆ„๊ฒŒ ๋˜์—ˆ๊ณ  Young Generation, Old Generation์˜ ๋‘ ๊ฐ€์ง€ ์˜์—ญ์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ๋‹ค. ์ดˆ๊ธฐ์—๋Š” Perm ์˜์—ญ์ด ์กด์žฌํ•˜์˜€์œผ๋‚˜ Java8๋ถ€ํ„ฐ ์ œ๊ฑฐ๋˜์—ˆ๋‹ค.

mangkyu.tistory.com/118-GC_์˜์—ญ_๋ฐ_ํ๋ฆ„

  • Young ์˜์—ญ(Young Generation)
    • ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๊ฐ€ ํ• ๋‹น(Allocation)๋˜๋Š” ์˜์—ญ.
    • ๋Œ€๋ถ€๋ถ„์˜ ๊ฐ์ฒด๊ฐ€ ๊ธˆ๋ฐฉ Unreachable ์ƒํƒœ๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ๋งŽ์€ ๊ฐ์ฒด๊ฐ€ Young ์˜์—ญ์—์„œ ์ƒ์„ฑ๋˜์—ˆ๋‹ค๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค.
    • Young ์˜์—ญ์— ๋Œ€ํ•œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(Garbage Colection)์„ Minor GC๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
  • Old ์˜์—ญ(Old Generation)
    • Young ์˜์—ญ์—์„œ Reachable ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜์—ฌ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๊ฐ€ ๋ณต์‚ฌ๋˜๋Š” ์˜์—ญ.
    • Young ์˜์—ญ๋ณด๋‹ค ํฌ๊ฒŒ ํ• ๋‹น๋˜๋ฉฐ, ์˜์—ญ์˜ ํฌ๊ธฐ๊ฐ€ ํฐ ๋งŒํผ ๊ฐ€๋น„์ง€๋Š” ์ ๊ฒŒ ๋ฐœ์ƒํ•œ๋‹ค.
    • Old ์˜์—ญ์— ๋Œ€ํ•œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(Garbage Collection)์„ Major GC ๋˜๋Š” Full GC๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

Old ์˜์—ญ์ด Young ์˜์—ญ๋ณด๋‹ค ํฌ๊ฒŒ ํ• ๋‹น๋˜๋Š” ์ด์œ ๋Š” Young ์˜์—ญ์˜ ์ˆ˜๋ช…์ด ์งง์€ ๊ฐ์ฒด๋“ค์€ ํฐ ๊ณต๊ฐ„์„ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š์œผ๋ฉฐ ํฐ ๊ฐ์ฒด๋“ค์€ Young ์˜์—ญ์ด ์•„๋‹ˆ๋ผ ๋ฐ”๋กœ Old ์˜์—ญ์— ํ• ๋‹น๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์˜ˆ์™ธ์ ์ธ ์ƒํ™ฉ์œผ๋กœ Old ์˜์—ญ์— ์žˆ๋Š” ๊ฐ์ฒด๊ฐ€ Young ์˜์—ญ์˜ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ Old ์˜์—ญ์—๋Š” 512 bytes์˜ ๋ฉ์–ด๋ฆฌ(Chunk)๋กœ ๋˜์–ด ์žˆ๋Š” ์นด๋“œ ํ…Œ์ด๋ธ”(Card Table)์ด ์กด์žฌํ•œ๋‹ค.

mangkyu.tistory.com/118-ํž™_์˜์—ญ

์นด๋“œ ํ…Œ์ด๋ธ”์—๋Š” Old ์˜์—ญ์— ์žˆ๋Š” ๊ฐ์ฒด๊ฐ€ Young ์—ฌ์—ญ์˜ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•  ๋•Œ๋งˆ๋‹ค ๊ทธ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ํ‘œ์‹œ๋œ๋‹ค. ์นด๋“œ ํ…Œ์ด๋ธ”์ด ๋„์ž…๋œ ์ด์œ ๋Š” ๊ฐ„๋‹จํ•˜๋‹ค. Young ์˜์—ญ์—์„œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(Minor GC)์ด ์‹คํ–‰๋  ๋•Œ Old ์˜์—ญ์— ์กด์žฌํ•˜๋Š” ๋ชจ๋“  ๊ฐ์ฒด๋“ค์„ ๊ฒ€์‚ฌํ•˜์—ฌ ์ฐธ์กฐ๋˜์ง€ ์•Š๋Š” Young ์˜์—ญ์˜ ๊ฐ์ฒด๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ฒƒ์ด ๋น„ํšจ์œจ์ ์ด๊ธฐ ๋–„๋ฌธ์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— Young ์˜์—ญ์—์„œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด ์ง„ํ–‰๋  ๋•Œ ์นด๋“œ ํ…Œ์ด๋ธ”๋งŒ ์กฐํšŒํ•˜์—ฌ GC์˜ ๋Œ€์ƒ์ธ์ง€๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ณ  ์žˆ๋‹ค.

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ๋™์ž‘ ๋ฐฉ์‹

Young ์˜์—ญ๊ณผ Old ์˜์—ญ์€ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ๋กœ ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์„ธ๋ถ€์ ์ธ ๋™์ž‘ ๋ฐฉ์‹์€ ์„œ๋กœ ๋‹ค๋ฅด๋‹ค. ํ•˜์ง€๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด ์‹คํ–‰๋œ๋‹ค๊ณ  ํ•˜๋ฉด ๋‹ค์Œ์˜ ๋‘ ๊ฐ€์ง€ ๊ณตํ†ต์ ์ธ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฅด๊ฒŒ ๋œ๋‹ค.

  1. Stop The World
    • Stop The World๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด JVM์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹คํ–‰์„ ๋ฉˆ์ถ”๋Š” ์ž‘์—…์ด๋‹ค. GC๊ฐ€ ์‹คํ–‰๋  ๋•Œ๋Š” GC๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์“ฐ๋ ˆ๋“œ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ๋“ค์˜ ์ž‘์—…์ด ์ค‘๋‹จ๋˜๊ณ , GC๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์ž‘์—…์ด ์žฌ๊ฐœ๋œ๋‹ค. ๋‹น์—ฐํžˆ ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ๋“ค์˜ ์ž‘์—…์ด ์ค‘๋‹จ๋˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฉˆ์ถ”๊ธฐ ๋•Œ๋ฌธ์—, GC์˜ ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ์œ„ํ•ด ํŠœ๋‹์„ ํ•œ๋‹ค๊ณ  ํ•˜๋ฉด ๋ณดํ†ต stop-the-world์˜ ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•˜๋Š” ์ž‘์—…์„ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋˜ํ•œ JVM์—์„œ๋„ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ์‹คํ–‰ ์˜ต์…˜์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค.
  2. Mark and Sweep
    • Mark : ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ์™€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ์ž‘์—….
    • Sweep : Mark ๋‹จ๊ณ„์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ์œผ๋กœ ์‹๋ณ„๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•˜๋Š” ์ž‘์—….
    • Stop Thw World๋ฅผ ํ†ตํ•ด ๋ชจ๋“  ์ž‘์—…์„ ์ค‘๋‹จ์‹œํ‚ค๋ฉด, GC๋Š” ์Šคํƒ์˜ ๋ชจ๋“  ๋ณ€์ˆ˜ ๋˜๋Š” Reachable ๊ฐ์ฒด๋ฅผ ์Šค์บ”ํ•˜๋ฉด์„œ ๊ฐ๊ฐ์ด ์–ด๋–ค ๊ฐ์ฒด๋ฅผ ์ฐธ๊ณ ํ•˜๊ณ  ์žˆ๋Š”์ง€๋ฅผ ํƒ์ƒ‰ํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‹๋ณ„ํ•˜๋Š”๋ฐ, ์ด๋Ÿฌํ•œ ๊ณผ์ •์„ Mark๋ผ๊ณ  ํ•œ๋‹ค. ์ดํ›„์— Mark๊ฐ€ ๋˜์ง€ ์•Š์€ ๊ฐ์ฒด๋“ค์„ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ œ๊ฑฐํ•˜๋Š”๋ฐ, ์ด๋Ÿฌํ•œ ๊ณผ์ •์„ Sweep๋ผ๊ณ  ํ•œ๋‹ค.

Minor GC์˜ ๋™์ž‘ ๋ฐฉ์‹

Minor GC๋ฅผ ์ •ํ™•ํžˆ ์ดํ•ดํ•˜๋ ค๋ฉด Young ์˜์—ญ์˜ ๊ตฌ์กฐ์— ๋Œ€ํ•ด ์ดํ•ดํ•ด์•ผ ํ•œ๋‹ค. Young ์˜์—ญ์€ 1๊ฐœ์˜ Eden ์˜์—ญ๊ณผ 2๊ฐœ์˜ Survivor ์˜์—ญ, ์ด 3๊ฐœ๋กœ ๋‚˜๋‰˜์–ด์ง„๋‹ค.

  • Eden ์˜์—ญ : ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๊ฐ€ ํ• ๋‹น(Allocation)๋˜๋Š” ์˜์—ญ.
  • Survivor ์˜์—ญ : ์ตœ์†Œ 1๋ฒˆ ์ด์ƒ์˜ GC์—์„œ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•˜๋Š” ์˜์—ญ.

๊ฐ์ฒด๊ฐ€ ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑ๋˜๋ฉด Young ์˜์—ญ ์ค‘์—์„œ๋„ Eden ์˜์—ญ์— ํ• ๋‹น(Alloaction)๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Eden ์˜์—ญ์ด ๊ฝ‰ ์ฐจ๋ฉด Minor GC๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๋ฐ, ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ๋Š” ํ•ด์ œ๋˜๊ณ  ์—ฌ์ „ํžˆ Eden ์˜์—ญ์— ์กด์žฌํ•˜๋Š”(์‚ฌ์šฉ๋˜๋Š”) ๊ฐ์ฒด๋Š” Survivor ์˜์—ญ์œผ๋กœ ์˜ฎ๊ฒจ์ง„๋‹ค. Survivor ์˜์—ญ์€ ์ด 2๊ฐœ์ด์ง€๋งŒ ๋ฐ˜๋“œ์‹œ 1๊ฐœ์˜ ์˜์—ญ์—๋งŒ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•ด์•ผ ํ•˜๋Š”๋ฐ, Young ์˜์—ญ์˜ ๋™์ž‘ ์ˆœ์„œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๊ฐ€ Eden ์˜์—ญ์— ํ• ๋‹น๋œ๋‹ค.
  2. ๊ฐ์ฒด๊ฐ€ ๊ณ„์† ์ƒ์„ฑ๋˜์–ด Eden ์˜์—ญ์ด ๊ฝ‰ ์ฐจ๊ฒŒ ๋˜๊ณ  Minor GC๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
    1. Eden ์˜์—ญ์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•ด์ œ๋œ๋‹ค.
    2. Eden ์˜์—ญ์—์„œ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋Š” 1๊ฐœ์˜ Survivor ์˜์—ญ์œผ๋กœ ์ด๋™๋œ๋‹ค.
  3. 1~2๋ฒˆ ๊ณผ์ •์ด ๋ฐ˜๋ณต๋˜๋‹ค๊ฐ€ Survivor ์˜์—ญ์ด ๊ฐ€๋“ ์ฐจ๊ฒŒ ๋˜๋ฉด Survivor ์˜์—ญ์˜ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋“ค์„ ๋‹ค๋ฅธ Survivor ์˜์—ญ์œผ๋กœ ์ด๋™์‹œํ‚จ๋‹ค. (1๊ฐœ์˜ Survivor ์˜์—ญ์€ ๋ฐ˜๋“œ์‹œ ๋นˆ ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.)
  4. ์ด๋Ÿฌํ•œ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜์—ฌ ๊ณ„์†ํ•ด์„œ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋Š” Old ์˜์—ญ์œผ๋กœ ์ด๋™(Promotion)๋œ๋‹ค.

๊ฐ์ฒด์˜ ์ƒ์กด ์ตฏ์ˆ˜๋ฅผ ์„ธ๊ธฐ ์œ„ํ•ด Minor GC์—์„œ ๊ฐ์ฒด๊ฐ€ ์‚ด์•„๋‚จ์€ ํšŸ์ˆ˜๋ฅผ ์˜๋ฏธํ•˜๋Š” age๋ฅผ Object Header์— ๊ธฐ๋กํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Minor GC ๋•Œ OBejct Header์— ๊ธฐ๋ก๋œ age๋ฅผ ๋ณด๊ณ  Promotion ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.

๋˜ํ•œ Survivor ์˜์—ญ ์ค‘ 1๊ฐœ๋Š” ๋ฐ˜๋“œ์‹œ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•œ๋‹ค. ๋งŒ์•ฝ ๋‘ Survivor ์˜์—ญ์— ๋ชจ๋‘ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜๊ฑฐ๋‚˜, ๋ชจ๋‘ ์‚ฌ์šฉ๋Ÿ‰์ด 0์ด๋ผ๋ฉด ํ˜„์žฌ ์‹œ์Šคํ…œ์ด ์ •์ƒ์ ์ธ ์ƒํ™ฉ์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

์ด๋Ÿฌํ•œ ์ง„ํ–‰ ๊ณผ์ •์„ ๊ทธ๋ฆผ์œผ๋กœ ์‚ดํŽด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

mangkyu.tistory.com/118-Minor_GC_๋™์ž‘_๋ฐฉ์‹

HotSpot JVM์—์„œ๋Š” Eden ์˜์—ญ์„ ๊ฐ์ฒด์— ๋น ๋ฅด๊ฒŒ ํ• ๋‹น(Allocation)ํ•˜๊ธฐ ์œ„ํ•ด bump the pointer์™€ TLABs(Thread-Local Allcation Buffers)๋ผ๋Š” ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•œ๋‹ค. bump the pointer๋ž€ Eden ์˜์—ญ์— ๋งˆ์ง€๋ง‰์œผ๋กœ ํ• ๋‹น๋œ ๊ฐ์ฒด์˜ ์ฃผ์†Œ๋ฅผ ์บ์‹ฑํ•ด๋‘๋Š” ๊ฒƒ์ด๋‹ค. bump the pointer๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์œ„ํ•ด ์œ ํšจํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํƒ์ƒ‰ํ•  ํ•„์š” ์—†์ด ๋งˆ์ง€๋ง‰ ์ฃผ์†Œ์˜ ๋‹ค์Œ ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•จ์œผ๋กœ์จ ์†๋„๋ฅผ ๋†’์ด๊ณ  ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•  ๋•Œ ๊ฐ์ฒด์˜ ํฌ๊ธฐ๊ฐ€ Eden ์˜์—ญ์— ์ ํ•ฉํ•œ์ง€๋งŒ ํŒ๋ณ„ํ•˜๋ฉด ๋˜๋ฏ€๋กœ ๋น ๋ฅด๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค.

์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์ด๋ผ๋ฉด ๋ฌธ์ œ๊ฐ€ ์—†์ง€๋งŒ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์ด๋ผ๋ฉด ๊ฐ์ฒด๋ฅผ Eden ์˜์—ญ์— ํ• ๋‹นํ•  ๋•Œ ๋ฝ(Lock)์„ ๊ฑธ์–ด ๋™๊ธฐํ™”๋ฅผ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ์˜ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด HotSpot JVM์€ ์ถ”๊ฐ€๋กœ TLABs(Thread-Lock Allocation Buffers)๋ผ๋Š” ๊ธฐ์ˆ ์„ ๋„์ž…ํ–ˆ๋‹ค. TLABs๋ž€ ๊ฐ๊ฐ์˜ ์Šค๋ ˆ๋“œ๋งˆ๋‹ค Eden ์˜์—ญ์— ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•˜๊ธฐ ์œ„ํ•œ ์ฃผ์†Œ๋ฅผ ๋ถ€์—ฌํ•จ์œผ๋กœ์จ ๋™๊ธฐํ™” ์ž‘์—… ์—†์ด ๋น ๋ฅด๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๋„๋ก ํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค. ๊ฐ๊ฐ์˜ ์Šค๋ ˆ๋“œ๋Š” ์ž์‹ ์ด ๊ฐ–๋Š” ์ฃผ์†Œ์—๋งŒ ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•จ์œผ๋กœ์จ ๋™๊ธฐํ™” ์—†์ด bump the pointer๋ฅผ ํ†ตํ•ด ๋น ๋ฅด๊ฒŒ ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•œ๋‹ค.

Major GC์˜ ๋™์ž‘ ๋ฐฉ์‹

Young ์˜์—ญ์—์„œ ์˜ค๋ž˜ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋Š” Old ์˜์—ญ์œผ๋กœ Promotion๋จ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Major GC๋Š” ๊ฐ์ฒด๋“ค์ด ๊ณ„์† Promotion๋˜์–ด Old ์˜์—ญ์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•ด์ง€๋ฉด ๋ฐœ์ƒํ•œ๋‹ค. Young ์˜์—ญ์€ ์ผ๋ฐ˜์ ์œผ๋กœ Old ์˜์—ญ๋ณด๋‹ค ํฌ๊ธฐ๊ฐ€ ์ž‘๊ธฐ ๋•Œ๋ฌธ์— GC๊ฐ€ ๋ณดํ†ต 0.5~1์ดˆ ์‚ฌ์ด์— ๋๋‚œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— Minor GC๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํฐ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค. ํ•˜์ง€๋งŒ Old ์˜์—ญ์€ Young ์˜์—ญ๋ณด๋‹ค ํฌ๋ฉฐ Young ์˜์—ญ์„ ์ฐธ์กฐํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋–„๋ฌธ์— Major GC๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ Minor GC๋ณด๋‹ค ์‹œ๊ฐ„์ด ๋งŽ์ด ์†Œ์š”๋˜๋ฉฐ, 10๋ฐฐ ์ด์ƒ์˜ ์‹œ๊ฐ„์„ ์‚ฌ์šฉํ•œ๋‹ค.

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ์š”์•ฝ

์—ฌํƒœ๊นŒ์ง€์˜ ๋‚ด์šฉ์„ ์š”์•ฝํ•˜๋ฉด ๋‹ค์Œ ํ‘œ์™€ ๊ฐ™๋‹ค.

GC ์ข…๋ฅ˜ Minor GC Major GC
๋Œ€์ƒ Young Generation Old Generation
์‹คํ–‰ ์‹œ์  Eden ์˜์—ญ์ด ๊ฝ‰ ์ฐฌ ๊ฒฝ์šฐ Old ์˜์—ญ์ด ๊ฝ‰ ์ฐฌ ๊ฒฝ์šฐ
์‹คํ–‰ ์†๋„ ๋น ๋ฅด๋‹ค ๋Š๋ฆฌ๋‹ค

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜

JVM์ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ๊ฒƒ์€ ๊ฐœ๋ฐœ์ž์˜ ์ž…์žฅ์—์„œ ์ƒ๋‹นํ•œ ๋งค๋ฆฌํŠธ์ด๋‹ค. ํ•˜์ง€๋งŒ ๋ฌธ์ œ๋Š” GC๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด Stop The World๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ค‘์ง€๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ํž™(Heap)์˜ ์‚ฌ์ด์ฆˆ๊ฐ€ ์ปค์ง€๋ฉด์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ง€์—ฐ(Suspend) ํ˜„์ƒ์ด ๋‘๋“œ๋Ÿฌ์ง€๊ฒŒ ๋˜์—ˆ๊ณ , ์ด๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ง€์›ํ•˜๊ณ  ์žˆ๋‹ค.

Serial GC

Serial GC์˜ Young ์˜์—ญ์€ ์•ž์„œ ์„ค๋ช…ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜(Mark Sweep)๋Œ€๋กœ ์ˆ˜ํ–‰๋œ๋‹ค. ํ•˜์ง€๋งŒ Old ์˜์—ญ์—์„œ๋Š” Mark Sweep Compact ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์‚ฌ์šฉ๋˜๋Š”๋ฐ, ๊ธฐ์กด์˜ Mark Sweep์— Compact๋ผ๋Š” ์ž‘์—…์ด ์ถ”๊ฐ€๋œ ๊ฒƒ์ด๋‹ค. Compact๋Š” ํž™ ์˜์—ญ์„ ์ •๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋‹จ๊ณ„๋กœ ์œ ํšจํ•œ ๊ฐ์ฒด๋“ค์ด ์—ฐ์†๋˜๊ฒŒ ์Œ“์ด๋„๋ก ํž™์˜ ๊ฐ€์žฅ ์•ž ๋ถ€๋ถ„๋ถ€ํ„ฐ ์ฑ„์›Œ์„œ ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•˜๋Š” ๋ถ€๋ถ„๊ณผ ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด๋‹ค.

java -XX:+UserSerialGC -jar Application.java

Serial GC๋Š” ์„œ๋ฒ„์˜ CPU ์ฝ”์–ด๊ฐ€ 1๊ฐœ์ผ ๋•Œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ๋˜์—ˆ์œผ๋ฉฐ, ๋ชจ๋“  ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด 1๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋งŒ์„ ์ด์šฉํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— CPU์˜ ์ฝ”์–ด๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์ธ ์šด์˜ ์„œ๋ฒ„์—์„œ Serial GC๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ฐ˜๋“œ์‹œ ํ”ผํ•ด์•ผ ํ•œ๋‹ค.

Parallel GC

Parallel GC๋Š” Throughput GC๋กœ๋„ ์•Œ๋ ค์ ธ ์žˆ์œผ๋ฉฐ, ๊ธฐ๋ณธ์ ์ธ ์ฒ˜๋ฆฌ ๊ณผ์ •์€ Serial GC์™€ ๋™์ผํ•˜๋‹ค. ํ•˜์ง€๋งŒ Parallel GC๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ํ†ตํ•ด ๋ณ‘๋ ฌ(Parallel)์ ์œผ๋กœ GC๋ฅผ ์ˆ˜ํ–‰ํ•จ์œผ๋กœ์จ GC์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ƒ๋‹นํžˆ ์ค„์—ฌ์ค€๋‹ค. Parallel GC๋Š” ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์„œ ๋˜๋Š” ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ์žฅ์น˜์—์„œ ์ค‘๊ทœ๋ชจ ๋ฐ ๋Œ€๊ทœ๋ชจ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•ด ๊ณ ์•ˆ๋˜์—ˆ์œผ๋ฉฐ, ์˜ต์…˜์„ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ตœ๋Œ€ ์ง€์—ฐ ์‹œ๊ฐ„ ๋˜๋Š” GC๋ฅผ ์ˆ˜ํ–‰ํ•  ์Šค๋ ˆ๋“œ์˜ ๊ฐฏ์ˆ˜ ๋“ฑ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

java -XX:+UserParallelGC - jar Application.java

//์‚ฌ์šฉํ•  ์Šค๋ ˆ๋“œ์˜ ๊ฐฏ์ˆ˜
-XX:ParallelGCThreads=THREAD_NUM

//์ตœ๋Œ€ ์ง€์—ฐ ์‹œ๊ฐ„
-XX:MaxGCPauseMillis=DELAY_TIME

Parallel GC๊ฐ€ GC์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ƒ๋‹นํžˆ ์ค„์—ฌ์ฃผ์—ˆ๊ณ , Java8๊นŒ์ง€ ๊ธฐ๋ณธ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ(Default Garbage Collector)๋กœ ์‚ฌ์šฉ๋˜์—ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฉˆ์ถ”๋Š” ๊ฒƒ์„ ํ”ผํ•  ์ˆ˜ ์—†์—ˆ๊ณ , ์ด๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋‹ค๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ถ”๊ฐ€๋กœ ๋“ฑ์žฅํ•˜๊ฒŒ ๋œ๋‹ค.

Parallel Old GC

Parallel Old GC๋Š” JDK5 update6๋ถ€ํ„ฐ ์ œ๊ณตํ•œ GC์ด๋ฉฐ, ์•ž์„œ ์„ค๋ช…ํ•œ Parallel GC์™€ ๋น„๊ตํ•˜๋ฉด Old ์˜์—ญ์˜ GC ์•Œ๊ณ ๋ฆฌ์ฆ˜๋งŒ ๋‹ค๋ฅด๋‹ค. Parallel Old GC์—์„œ๋Š” Mark Sweep Compact๊ฐ€ ์•„๋‹Œ Mark Summary Compaction์ด ์‚ฌ์šฉ๋˜๋Š”๋ฐ, Summary ๋‹จ๊ณ„์—์„œ๋Š” ์•ž์„œ GC๋ฅผ ์ˆ˜ํ–‰ํ•œ ์˜์—ญ์— ๋Œ€ํ•ด์„œ ๋ณ„๋„๋กœ ์‚ด์•„์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์‹๋ณ„ํ•œ๋‹ค๋Š” ์ ์—์„œ ๋‹ค๋ฅด๋ฉฐ ์กฐ๊ธˆ ๋” ๋ณต์žกํ•˜๋‹ค.

CMS(Concurrent Mark Sweep) GC

CMS(Concurrent Mark Sweep) GC๋Š” Parallel GC์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ์ด์šฉํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๊ธฐ์กด์˜ Serial GC๋‚˜ Parallel GC์™€๋Š” ๋‹ฌ๋ฆฌ Mark Sweep ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋™์‹œ์ (Concurrent)์œผ๋กœ ์ˆ˜ํ–‰ํ•œ๋‹ค.

mangkyu.tistory.com/119-CMS_GC

์ด๋Ÿฌํ•œ CMS GC๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ง€์—ฐ ์‹œ๊ฐ„์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ์•ˆ๋˜์—ˆ์œผ๋ฉฐ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ตฌ๋™์ค‘์ผ ๋•Œ ํ”„๋กœ์„ธ์„œ์˜ ์ž์›์„ ๊ณต์œ ํ•˜์—ฌ ์ด์šฉ ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค. CMS GC๊ฐ€ ์ˆ˜ํ–‰๋  ๋•Œ๋Š” ์ž์›์ด GC๋ฅผ ์œ„ํ•ด์„œ๋„ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ ์‘๋‹ต์ด ๋Š๋ ค์งˆ ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ์‘๋‹ต์ด ๋ฉˆ์ถ”์ง€๋Š” ์•Š๊ฒŒ ๋œ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ CMS GC๋Š” ๋‹ค๋ฅธ GC ๋ฐฉ์‹๋ณด๋‹ค ๋” ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ์™€ CPU๋ฅผ ํ•„์š”๋กœ ํ•˜๋ฉฐ, Compaction ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. ์ด ๋•Œ๋ฌธ์— ์‹œ์Šคํ…œ์ด ์žฅ๊ธฐ์ ์œผ๋กœ ์šด์˜๋˜๋‹ค๊ฐ€ ์กฐ๊ฐ๋‚œ ๋ฉ”๋ชจ๋ฆฌ๋“ค์ด ๋งŽ์•„ Compaction ๋‹จ๊ณ„๊ฐ€ ์ˆ˜ํ–‰๋˜๋ฉด ์˜คํžˆ๋ ค Stop The World ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

//deprecated in java9 and finally dropped in java14
java -XX:+UseConcMArkSweepGC - jar Application.java

๋งŒ์•ฝ GC๊ฐ€ ์ˆ˜ํ–‰๋˜๋ฉด์„œ 98% ์ด์ƒ์˜ ์‹œ๊ฐ„์ด CMS GC์— ์†Œ์š”๋˜๊ณ , 2% ์ดํ•˜์˜ ์‹œ๊ฐ„์ด Heap์˜ ์ •๋ฆฌ์— ์‚ฌ์šฉ๋œ๋‹ค๋ฉด CMS GC์— ์˜ํ•ด OutOfMemoryError๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋‹ค. ๋ฌผ๋ก  ์ด๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ์˜ต์…˜์ด ์žˆ์œผ๋‚˜, CMS GC๋Š” Java9 ๋ฒ„์ „๋ถ€ํ„ฐ deprecated ๋˜์—ˆ๊ณ  ๊ฒฐ๊ตญ Java14์—์„œ๋Š” ์‚ฌ์šฉ์ด ์ค‘์ง€๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ตณ์ด ์•Œ์•„๋ณผ ํ•„์š”๋Š” ์—†์„ ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค.

G1(Garbage First) GC

G1(Garbage First) GC๋Š” ์žฅ๊ธฐ์ ์œผ๋กœ ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋Š” CMS GC๋ฅผ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ๋˜์—ˆ๊ณ , Java7๋ถ€ํ„ฐ ์ง€์›๋˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.

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

mangkyu.tistory.com/119-G1_GC

G1 GC์—์„œ๋Š” Eden, Survivor, Old ์—ญํ• ์— ๋”ํ•ด Humonogous์™€ Available/Unused๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ์—ญํ• ์ด ์ถ”๊ฐ€๋œ๋‹ค. Humonogous๋Š” ์ง€์—ญ์˜ ํฌ๊ธฐ๊ฐ€ 50%๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๋Š” ์ง€์—ญ์„ ์˜๋ฏธํ•˜๋ฉฐ, Available/Unused๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ์ง€์—ญ์„ ์˜๋ฏธํ•œ๋‹ค.

G1 GC์˜ ํ•ต์‹ฌ์€ ํž™(Heap)์„ ๋™์ผํ•œ ํฌ๊ธฐ์˜ ์ง€์—ญ(Region)์œผ๋กœ ๋‚˜๋ˆ„๊ณ , ๊ฐ€๋น„์ง€๊ฐ€ ๋งŽ์€ ์ง€์—ญ์— ๋Œ€ํ•ด ์šฐ์„ ์ ์œผ๋กœ GC๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  G1 GC๋„ ๋‹ค๋ฅธ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‘ ๊ฐ€์ง€ GC(Minor GC, Major GC)๋กœ ๋‚˜๋‰˜์–ด ์ˆ˜ํ–‰๋œ๋‹ค.

Minor GC

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

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

Major GC

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

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

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

java -XX:+UseG1GC -jar Application.java

์ด๋Ÿฌํ•œ ๊ตฌ์กฐ์˜ G1 GC๋Š” ๋‹น์—ฐํžˆ ์•ž์„œ ์„ค๋ช…ํ–ˆ๋˜ GC ๋ฐฉ์‹๋“ค๋ณด๋‹ค ์ฒ˜๋ฆฌ ์†๋„๊ฐ€ ๋น ๋ฅด๋ฉฐ, ํฐ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์—์„œ ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์Šค ๊ธฐ๋ฐ˜์œผ๋กœ ์šด์˜๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•ด ๊ณ ์•ˆ๋˜์—ˆ๋‹ค. ๋˜ํ•œ G1 GC๋Š” ํƒ€ GC ๋ฐฉ์‹์˜ ์ฒ˜๋ฆฌ ์†๋„๋ฅผ ๋Šฅ๊ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Java9๋ถ€ํ„ฐ ๊ธฐ๋ณธ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ(Default Garbage Collector)๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

์ฐธ๊ณ  ์ž๋ฃŒ