JiwonDev

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ์™€ TLAB

by JiwonDev

์ž๋ฐ”๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ์ •๋ฆฌํ•ด์ฃผ๋Š” managed ์–ธ์–ด์ž…๋‹ˆ๋‹ค.

ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ €์ˆ˜์ค€์˜ ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ์ œ์–ด๊ถŒ์„ ๊ฐ€์งˆ ์ˆ˜ ์—†์œผ๋ฉฐ, ํž™ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๊ณผ ํ•ด์ œ๋Š” ์ด๋Š” GC๊ฐ€ ์•Œ์•„์„œ ์ฒ˜๋ฆฌํ•ด์ฃผ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

 

# ๋ฌด์—‡์ด ํšŒ์ˆ˜๋˜๋Š”๊ฐ€

์•„๋ž˜์˜ JVM ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ์ค‘ GC๊ฐ€ ๊ด€์—ฌํ•˜๋Š” ๊ณต๊ฐ„์€ Heap ๋ฉ”๋ชจ๋ฆฌ์ž…๋‹ˆ๋‹ค.

์Šค๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋ฉฐ ์ง€์—ญ๋ณ€์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” Stack๊ณผ ์ •์ ์ธ Static ์˜์—ญ์€ GC์˜ ๋Œ€์ƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

 

 

# ์–ด๋–ป๊ฒŒ ํšŒ์ˆ˜ํ•˜๋Š”๊ฐ€. ์•ฝํ•œ ์„ธ๋Œ€ ๊ฐ€์„ค

JVM์˜ GC๋Š” ์•ฝํ•œ ์„ธ๋Œ€ ๊ฐ€์„ค(weak generational hypothesis)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค๊ณ„๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค.

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

์ด ๊ฐ€์„ค์„ ์ ์šฉ์‹œ์ผœ, GC๋Š” ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ๊ฒ€์‚ฌํ•ด๊ฐ€๋ฉฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด GC์˜ Young์˜์—ญ์— ํ• ๋‹น์‹œํ‚ค๊ณ , ํ•ด๋‹น ์˜์—ญ์ด ๊ฐ€๋“์ฐจ๋ฉด ๋‹ค์Œ ์˜์—ญ์œผ๋กœ ์ด๋™์‹œ์ผœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Young ์˜์—ญ์—๋Š” Survivor ์˜์—ญ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

 

@ Young generation ์˜์—ญ

  • ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑ๋œ ๊ฐ์ฒด ๋Œ€๋ถ€๋ถ„์ด ์ด ์˜์—ญ์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.
  • Eden ์˜์—ญ์—์„œ ์‹œ์ž‘ํ•˜์ง€๋งŒ, ๋งŒ์•ฝ ๊ฐ์ฒด๊ฐ€ ๋„ˆ๋ฌด ์ปค์„œ Young์˜์—ญ์— ๋ชป๋“ค์–ด๊ฐ„๋‹ค๋ฉด ๋ฐ”๋กœ Old๋กœ ๊ฐ‘๋‹ˆ๋‹ค.
  • ๊ฐ€๋“์ฐจ๋ฉด minor gc๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ฐธ์กฐ๊ฐ€ ์‚ด์•„์žˆ๋Š” ๊ฐ์ฒด๋งŒ ๋‚จ๊ฒจ๋‘๊ณ , ๋‚˜๋จธ์ง€๋Š” ๋‹ค ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ด์•„์žˆ๋Š” ๊ฐ์ฒด๋“ค ์ค‘ ์˜ค๋ž˜ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๊ณ  ํŒ๋‹จ๋œ ๊ฐ์ฒด๋“ค์€ Tenured (๋˜๋Š” Old)์˜์—ญ์œผ๋กœ ์˜ฎ๊น๋‹ˆ๋‹ค.

  • Young -> [ Servivor1 <-> Servivor2 ] -> Tenured ์ด๋ ‡๊ฒŒ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ ์˜ค๋ž˜๋œ ๊ฐ์ฒด๋“ค์ด ๋ณต์‚ฌ, ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.
    Servivor๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋‹จํŽธํ™” ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ฐ์ฒด๋ฅผ ํ• ๋‹น ํ•  ์ˆ˜ ์—†์„ ๋•Œ ๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉฐ Servivor๋ฅผ ์˜ฎ๊น๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ 2๊ฐœ์˜ Servivor ๊ณต๊ฐ„์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. ์ ์ ˆํ•˜๊ฒŒ ๊ฐ์ฒด๋ฅผ ์˜ฎ๊ฒจ์„œ ๋‹จํŽธํ™”๋ฅผ ํ•ด์†Œํ•ฉ๋‹ˆ๋‹ค.

 

 

@ Tenured generation (Old) ์˜์—ญ

  • Young ์˜์—ญ์—์„œ ์ฐธ์กฐ๊ฐ€ ์‚ด์•„์žˆ์–ด ๋‚จ์•„์žˆ๋Š” ๊ฐ์ฒด๋“ค์€ ์—ฌ๊ธฐ๋กœ ๋ณต์‚ฌ๋ฉ๋‹ˆ๋‹ค.
  • ๋ณดํ†ต ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ์‚ญ์ œ๊ฐ€ ๋น ๋ฅธ Young์˜์—ญ๋ณด๋‹ค ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํฌ๊ฒŒ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋ ‡๊ฒŒ ์„ธ๋Œ€๋ฅผ ๋‚˜๋ˆ ์„œ ํ•˜๋Š” GC๋ฐฉ์‹์˜ ๊ฐ€์žฅ ํฐ ๋‹จ์ ์€, ๋งˆ์ง€๋ง‰ ๊ณต๊ฐ„์€ ์–ธ์  ๊ฐ€ ๊ฐ€๋“์ฐฌ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ๋งˆ์ง€๋ง‰ ๊ณต๊ฐ„์ธ Tenured ์˜์—ญ์ด ๊ฐ€๋“์ฐจ๋ฉด major gc (๋˜๋Š” full gc)๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

 

์ฐธ์กฐ๊ฐ€ ์‚ด์•„์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์ž„์˜๋กœ ์ง€์›Œ๋ฒ„๋ ธ๋‹ค๊ฐ€๋Š” ์•ฑ์— ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ง€ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋งˆ์ง€๋ง‰ Old ์˜์—ญ๊นŒ์ง€ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๊ฐ€๋“์ฐจ๋ฒ„๋ฆฌ๋ฉด, GC๋Š” Stop-the-world๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์‰ฝ๊ฒŒ๋งํ•ด JVM์— ์žˆ๋Š” ๋ชจ๋“  ์Šค๋ ˆ๋“œ๋ฅผ ๋ฉˆ์ถ”๊ณ  ๋น ๋ฅด๊ฒŒ Old ์˜์—ญ์˜ ๊ฐ์ฒด๋ฅผ ์Šค์บ”ํ•˜์—ฌ ํ•„์š”์—†๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค.

 

์•„๋ฌด๋ฆฌ ์ข‹์€ GC ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•œ๋“ค, ๊ฒฐ๊ตญ Stop-the-world๋Š” ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

ํŠนํžˆ ์„œ๋ฒ„ ์ปดํ“จํ„ฐ์˜ ๊ฒฝ์šฐ GC์— ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ปค์„œ GC๊ฐ€ ์Œ“์ด๊ณ  ์Œ“์ด๋‹ค๊ฐ€ ํ•œ๋ฒˆ์— ์ •๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ, ๊ธธ๊ฒŒ๋Š” 2~3๋ถ„๊ฐ„ ์„œ๋ฒ„๊ฐ€ ๋ฉˆ์ถฐ๋ฒ„๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋ž˜์„œ GC ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ง์ ‘ ํŠœ๋‹ํ•˜๊ฑฐ๋‚˜, ๊ฐœ์„ ๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ฐ€์ง„ GC ๊ตฌํ˜„์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
์‹ค์ œ๋กœ GC ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ผ ํ•จ์€ Old ์˜์—ญ์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ธ๊ฐ€์— ๋”ฐ๋ผ ๊ตฌ๋ถ„์ง“๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
Serial, Parallel, CMS[Concureent Mark & Sweep], G1[GarbageFirst]

https://d2.naver.com/helloworld/1329

 

 

# Old ์˜์—ญ์— ์žˆ๋Š” ๊ฐ์ฒด๊ฐ€ Young ์˜์—ญ์„ ์ฐธ์กฐํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋˜๋‚˜์š”?

์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด Old ์˜์—ญ์—๋Š” 512๋ฐ”์ดํŠธ ๋‹จ์œ„(chunk)๋กœ ๋˜์–ด์žˆ๋Š” card table์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

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

 

minor gc, ์ฆ‰ Young ์˜์—ญ์„ GCํ•  ๋•Œ์—๋Š” ์ด ์นด๋“œ ํ…Œ์ด๋ธ”๋งŒ ์ถ”๊ฐ€๋กœ ํ™•์ธํ•ด์„œ GC ์—ฌ๋ถ€๋ฅผ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ ์นด๋“œ ํ…Œ์ด๋ธ”์€ write barrier๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” Minor GC๋ฅผ ์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š”๋ฐ ๊ถ๊ธˆํ•˜๋ฉด ํ•ด๋‹น ๋งํฌ๋ฅผ ์ฐธ์กฐํ•ด์ฃผ์„ธ์š”.

 

 

 

# TLAB (Thread-Local Allocation Buffer)

GC๋„ ๊ฒฐ๊ตญ JVM์—๊ฒŒ ์Šค๋ ˆ๋“œ๋ฅผ ํ• ๋‹น๋ฐ›์•„ ๋™์ž‘ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ž…๋‹ˆ๋‹ค.

์„ฑ๋Šฅ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด์„œ GC์— ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๋ฅผ ํ• ๋‹นํ•˜๊ฒŒ ๋˜๋ฉด, ๊ฒฐ๊ตญ ์Šค๋ ˆ๋“œ๊ฐ„ ๋™๊ธฐํ™” ๋ฌธ์ œ, ๋ธ”๋กœํ‚น์ด ์ƒ๊ธฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋ž˜์„œ JVM์€ Young์—์„œ ์ฒ˜์Œ ์‚ฌ์šฉ๋˜๋Š” Eden์˜์—ญ์„ ์—ฌ๋Ÿฌ ๋ฒ„ํผ๋กœ ๋‚˜๋ˆ„์–ด, ์Šค๋ ˆ๋“œ ๋ณ„๋กœ ๋ณ„๋„์˜ ๊ณต๊ฐ„์„ ๊ฐ€์ง€๋„๋ก ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด๋ฅผ Thread-Local ๋ฉ”๋ชจ๋ฆฌ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

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

 

 

 

# ์€ํƒ„ํ™˜์€ ์—†๋‹ค. GC ํŠœ๋‹

๋ชจ๋“  ์ƒํ™ฉ์— ์ตœ์ ์ธ GC๋Š” ์—†์Šต๋‹ˆ๋‹ค. 

์–ด๋Š ํšŒ์‚ฌ์— ๋ฌผ์–ด๋ด๋„, ์•„๋‹ˆ๋ฉด ์•„์˜ˆ Oracle JVM์„ ๋งŒ๋“œ๋Š” ์—”์ง€๋‹ˆ์–ด๋“ค์—๊ฒŒ ๋ฌผ์–ด๋ด๋„ ๊ฐ™์€ ๋ง์„ ํ•ฉ๋‹ˆ๋‹ค.

WAS์˜ ์Šค๋ ˆ๋“œ ๊ฐœ์ˆ˜, ์žฅ๋น„๋‹น ์ธ์Šคํ„ด์Šค ๊ฐœ์ˆ˜, GC ์˜ต์…˜, ์„œ๋น„์Šค์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ์ตœ์ ์˜ GC ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋ฉ”๋ชจ๋ฆฌ ํŠœ๋‹์€ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ์•„๋ฌด์ƒ๊ฐ์—†์ด ๋ง‰ ํŠœ๋‹์„ ํ•˜๋ฉด ์˜คํžˆ๋ ค ์„ฑ๋Šฅ์ด ๋–จ์–ด์งˆ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด๋Š” ๊ณต์‹์ด ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— JMX ๊ฐ™์€ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ๋กœ ํ™•์ธํ•˜๋ฉด์„œ ์ง์ ‘ ๋‚ด ์„œ๋น„์Šค์— ๋งž๋Š” GC ํŠœ๋‹์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

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

JiwonDev

JiwonDev

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