# [Java] JVM - Garbage Collector
Study Repository

[Java] JVM - Garbage Collector

by rlaehddnd0422

์ปดํ“จํ„ฐ์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋Š” ํ•œ์ •๋œ ์ž์›์ด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ํ•„์š”์—†๋Š” ๋ถ€๋ถ„์€ ํ•ด์ œํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

C์™€ C++์™€ ๊ฐ™์€ ์–ธ๋งค๋‹ˆ์ง€๋“œ ์–ธ์–ด์—์„œ๋Š” free()์™€ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•ด์ฃผ๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ๊ณผ ๋ฐ˜๋Œ€๋กœ ์ž๋ฐ”์—์„œ๋Š” JVM ๋‚ด๋ถ€์˜ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ์—์„œ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ฐธ์กฐ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋“ค์„ ๊ฒ€์‚ฌํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

์šฉ์–ด ์ •๋ฆฌ

  • ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ : JVM ๋‚ด๋ถ€์— ์œ„์น˜ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋ฅผ ์ฐพ์•„ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšŒ์ˆ˜ํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋Š” ๊ตฌ์„ฑ์š”์†Œ
  • ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ : ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ์— ์˜ํ•ด ์ˆ˜ํ–‰๋˜๋Š” ํ”„๋กœ์„ธ์Šค

 

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์€ new ํ‚ค์›Œ๋“œ๋กœ ์ƒ์„ฑํ•œ ๊ฐ์ฒด๊ฐ€ ์ €์žฅ๋˜๋Š” "ํž™ ์˜์—ญ"์— ๋Œ€ํ•ด์„œ๋งŒ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ๊ทธ๋ฆผ์„ ํ†ตํ•ด ๋” ์ž์„ธํžˆ ์•Œ์•„๋ด…์‹œ๋‹ค.

 

  • new ํ‚ค์›Œ๋“œ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด, ๋ฐฐ์—ด์ด ์ €์žฅ๋˜๋Š” ๊ณณ์ธ ํž™ ์˜์—ญ์ž…๋‹ˆ๋‹ค.
  • ํšจ์œจ์ ์ธ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ ๋™์ž‘์„ ์œ„ํ•ด ํž™ ์˜์—ญ์€ ๋‹ค์‹œ ํž™ ์˜์—ญ์€ ํฌ๊ฒŒ Young, Tenured, Permanent ์˜์—ญ์œผ๋กœ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค.
    • Young Generation
      • ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜์ž๋งˆ์ž ์ €์žฅ๋˜๊ณ  ์ƒ๊ธด์ง€ ์–ผ๋งˆ ๋˜์ง€ ์•Š์€ ๊ฐ์ฒด๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค.
      • Eden ์˜์—ญ์ด ๊ฝ‰ ์ฐจ๋Š” ๊ฒฝ์šฐ GC๊ฐ€ ์ด๋ฃจ์–ด์ง€๋Š”๋ฐ์š”. GC์— ์˜ํ•ด ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋“ค์€ Survivor ์˜์—ญ์œผ๋กœ ์ด๋™๋˜๊ณ , Survivor ์˜์—ญ์ด ๊ฝ‰ ์ฐจ๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” Tenured์˜ Old ์˜์—ญ์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
    • Tenured Generation
      • Young Generation ๊ณต๊ฐ„์ด ๊ฝ‰ ์ฐผ์„ ๋•Œ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์ด ์ƒ์„ฑ๋˜๋ฉด ๊ธฐ์กด์— Young Generation์— ์žˆ๋˜ ๊ฐ์ฒด ๋ฐ ๋ฐฐ์—ด์˜ ์ฐธ์กฐ๊ฐ€ ์ด๊ณณ์˜ Old์˜์—ญ์œผ๋กœ ์ด๋™๋˜๊ฑฐ๋‚˜ ํšŒ์ˆ˜๋ฉ๋‹ˆ๋‹ค.
      • Young Generation๊ณผ Tenured Generation์—์„œ์˜ ์ด๋ฃจ์–ด์ง€๋Š” GC๋ฅผ "Minor GC"๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.
      • ์ดํ›„ Old ์˜์—ญ์— ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ—ˆ์šฉ์น˜๋ฅผ ๋„˜๊ฒŒ ๋˜๊ฑฐ๋‚˜ Minor GC๋ฅผ ์ˆ˜ํ–‰ํ•œ ๋’ค์—๋„ ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ธฐ์— ๊ณต๊ฐ„ํžˆ ์—ฌ์ „ํžˆ ๋ถ€์กฑํ•œ ๊ฒฝ์šฐ์™€ ๊ฐ™์ด Minor GC๊ฐ€ ์‹คํŒจํ•œ ๊ฒฝ์šฐ Old ์˜์—ญ์— ์žˆ๋Š” ๋ชจ๋“  ๊ฐ์ฒด๋“ค์„ ๊ฒ€์‚ฌํ•˜์—ฌ ์ฐธ์กฐ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋“ค์„ ํ•œ๊บผ๋ฒˆ์— ์‚ญ์ œํ•˜๋Š” GC๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
      • ์ด๋ ‡๊ฒŒ Old ์˜์—ญ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšŒ์ˆ˜ํ•˜๋Š” GC๋ฅผ "Major GC"๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค.
    • Permenant Generation
      • JDK8 ๋ถ€ํ„ฐ ์‚ฌ๋ผ์ง€๊ณ  Metaspace๋กœ ๋Œ€์ฒด๋จ.

 

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋Š” ์–ด๋–ค ์›๋ฆฌ๋กœ ์†Œ๋ฉธ ๋Œ€์ƒ์„ ์„ ์ •ํ• ๊นŒ?

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋Š” ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๊ฐ์ฒด๊ฐ€ ํ˜„์žฌ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š”์ง€ ํŒ๋ณ„ํ• ๊นŒ์š”. ๋งŽ์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์‚ฌ์šฉ๋˜์ง€๋งŒ ๊ณตํ†ต์ ์ธ ์›๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋จผ์ € ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋ฅผ ํŒ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด Reachablity ๊ฐœ๋…์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

Reachablity / Reachable, Unreachable

  • ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋ฅผ ํŒ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์ค€
  • Reachable : ํž™ ์˜์—ญ์— ํ• ๋‹น๋œ ์–ด๋– ํ•œ ๊ฐ์ฒด๊ฐ€ ์œ ํšจํ•œ ์ฐธ์กฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ Reachable ํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•˜๊ณ  ์‚ด๋ ค๋‘ .
  • Unreachable : ํž™ ์˜์—ญ์— ํ• ๋‹น๋œ ์–ด๋– ํ•œ ๊ฐ์ฒด๊ฐ€ ์œ ํšจํ•œ ์ฐธ์กฐ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ, ์ฆ‰ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํŒ๋‹จํ•œ ๊ฒฝ์šฐ Unreachable ๊ฐ์ฒด๋กœ ํŒ๋‹จํ•˜์—ฌ ๊ฐ€๋ฐ”์ง€๋กœ ๊ฐ„์ฃผํ•˜๊ณ  GC๋ฅผ ์ˆ˜ํ–‰

 

ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋Š” ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ๋‹ค๋ฅธ ๊ฐ์ฒด๋Š” ๋˜ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ˜•์„ฑ๋œ ์ฐธ์กฐ ์‚ฌ์Šฌ์˜ ๊ฒฝ์šฐ์— ์œ ํšจํ•œ ์ฐธ์กฐ ์—ฌ๋ถ€๋ฅผ ํŒŒ์•…ํ•˜๋ ค๋ฉด  ์œ ํšจํ•œ "์ตœ์ดˆ์˜" ์ฐธ์กฐ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.  ์ด ์ฐธ์กฐ ์‚ฌ์Šฌ ์ค‘ "์ตœ์ดˆ"์— ์ฐธ์กฐํ•œ ๊ฒƒ์„ Root Set์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

 

Root Set์ด ๋˜๊ธฐ ์œ„ํ•œ ์กฐ๊ฑด

  • ๊ฐ๊ฐ์˜ ์“ฐ๋ ˆ๋“œ์˜ Stack ์˜์—ญ์— ์กด์žฌํ•˜๋Š” Local Variable, Operand Stack์— ์กด์žฌํ•˜๋Š” ์ฐธ์กฐ ๊ฐ’ ๋“ฑ
  • Heap ์˜์—ญ์— ์กด์žฌํ•˜๋Š” Constant Pool ์ฐธ์กฐ ๊ด€๊ณ„
  • JNI (Java Native Interface)๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋“ค
  • Meta ์˜์—ญ์— ์กด์žฌํ•˜๋Š” Load ๋œ Class ์˜ Data๋“ค
  • Heap ์˜์—ญ ๋‚ด๋ถ€์—์„œ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ ์ค‘์ธ ๊ฐ์ฒด

์–ด๋– ํ•œ ๊ฐ์ฒด๊ฐ€ ์ฐธ์กฐ ์‚ฌ์Šฌ์—์„œ ์œ„ ์กฐ๊ฑด์— ๋งŒ์กฑํ•˜๋Š” Root Set์— ์˜ํ•ด ์ฐธ์กฐ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด Unreachable Objects๋กœ ํŒ๋‹จํ•˜๋ฉฐ, GC์˜ ๋Œ€์ƒ์œผ๋กœ ์„ ์ •๋ฉ๋‹ˆ๋‹ค.

 

์ด๋ ‡๊ฒŒ ์„ ์ •๋œ ๊ฐ์ฒด๋“ค์€ ๋ฐ”๋กœ ์„ ์ •๋˜์—ˆ๋‹ค๊ณ  ํ•ด์„œ ๋ฐ”๋กœ GC์— ์˜ํ•ด ์†Œ๊ฑฐ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ณ , ์‹œ์Šคํ…œ์˜ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์ด ๊ฐ€์ง€ ์•Š๋„๋ก ์‹คํ–‰ํƒ€์ž„์„ ๊ฒฐ์ •ํ•˜๋Š” ๋ณ„๋„์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ† ๋Œ€๋กœ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

 

 

<์ฐธ๊ณ  ์ž๋ฃŒ>

 

Presentation - JVM GC ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ ๊ธฐ๋ณธ GC ์•Œ๊ณ ๋ฆฌ์ฆ˜.

ํšŒ์‚ฌ์—์„œ ๋ฐœํ‘œํ•œ ๊ฐœ์ธ ๋ฐœํ‘œ ์ž๋ฃŒ๋ฅผ ์˜ฎ๊ธด ๊ธ€์ž…๋‹ˆ๋‹ค. GC ๊ธฐ๋ณธ ๊ฐœ๋… GC๋Š” ๋ฌด์—‡์ผ๊นŒ? GC๋ž€ Garbage๋ฅผ ๋ชจ์œผ๋Š” ์ž‘์—… ๋ฐฉ์‹ ํ˜น์€ ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๋Š” ๋ชจ๋“ˆ๋“ค์„ ์˜๋ฏธํ•˜๋Š” ์šฉ์–ด๋กœ ์ด๋•Œ Garbage๋ž€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ

lob-dev.tistory.com

 

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

Study Repository

rlaehddnd0422

ํ™œ๋™ํ•˜๊ธฐ