[Go] GC์˜ ๊ตฌ์กฐ

Go๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋‚ด๋ฑ‰๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ์–ธ์–ด์ž„์—๋„ GC๊ฐ€ ๋‹ฌ๋ฆฐ ๊ฝค ํŠน์ดํ•œ ์ž…์ง€์˜ ์–ธ์–ด๋‹ค.

๊ทผ๋ฐ ์•„์ง Java ๊ฐ™์€ ๊ณ ์ฐธ๋“ค์— ๋น„ํ•˜๋ฉด GC ์ž์ฒด์˜ ์„ฑ์ˆ™๋„๊ฐ€ ๋‚ฎ์€ ์ƒํƒœ์ด๊ธด ํ•˜๋‹ค.
์• ์ดˆ์— ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๊ทน๋‹จ์ ์œผ๋กœ ๋†’์€ ๋ฉ”์ธํ”„๋ ˆ์ž„์— ์“ฐ์ด๊ธฐ๋ณด๋‹จ ์ž์ž˜ํ•œ ๋ณด์กฐ๋„๊ตฌ์— ๋” ๋งŽ์ด ์“ฐ์ด๋Š”๊ฒŒ ํ˜„์‹ค์ด๋‹ค๋ณด๋‹ˆ, ๋ฌธ์ œ๊ฐ€ ๋œ ํŠ€๊ธฐ๋„ ํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

๊ทธ๋ž˜๋„ ๊ฐ€๋ณ๊ฒŒ ์“ฐ๋Š” ์ˆ˜์ค€์—์„œ๋Š” ํฐ ๋ฌธ์ œ๊ฐ€ ์—†๊ณ , ๊ณ„์†ํ•ด์„œ ๋ฐœ์ „ํ•˜๊ณ ๋Š” ์žˆ๋‹ค.

์ „๋ฐ˜์ ์ธ Go GC์˜ ๊ตฌ์กฐ๋Š” 1.5 ๋ฒ„์ „๋ถ€ํ„ฐ ์–ด๋А ์ •๋„ ์™„์„ฑ๋˜์—ˆ๊ณ , ๊ทธ ์ดํ›„๋กœ๋Š” ์ผ๋ฐ˜์ ์ธ ๊ฐœ์„ ๋งŒ ์ด๋ฃจ์–ด์ง€๊ณ  ์žˆ๋‹ค.

Go๊ฐ€ ์–ด๋–ค ๋งค์ปค๋‹ˆ์ฆ˜์œผ๋กœ GC๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , ์–ด๋–ค ์žฅ์ ๊ณผ ํ•œ๊ณ„๊ฐ€ ์žˆ๋Š”์ง€ ์ •๋ฆฌํ•ด๋ณด๊ฒ ๋‹ค.

์ด์ชฝ ์—…๊ณ„ ์„ ๋ฐฐ์ธ Java์™€๋„ ๋น„๊ตํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ์ด๋‹ค.
https://m.blog.naver.com/sssang97/223575258532
๋ณธ ํฌ์ŠคํŠธ์—์„œ๋„ Java์˜ GC์™€ ๋น„๊ตํ•˜๋ฉด์„œ Go๋งŒ์ด ๊ฐ–๊ณ  ์žˆ๋Š” ํŠน์ง•๊ณผ ์žฅ๋‹จ์ ์„ ์ •๋ฆฌํ•ด๋ณธ๋‹ค.




Basic: Mark and Sweep ์•Œ๊ณ ๋ฆฌ์ฆ˜

ํ˜„๋Œ€ GC์˜ ๊ทผ๊ฐ„์ด ๋œ ๊ธฐ๋ฒ• ์ค‘ ํ•˜๋‚˜๋‹ค.
1960๋…„์— ๋ฆฌ์Šต์˜ ์ฐฝ์‹œ์ž ๋งค์นด์‹œ๊ฐ€ ๋งŒ๋“ค์—ˆ๋‹ค.

https://m.blog.naver.com/sssang97/221567636644

Java์—์„œ๋„ ๋ช‡๋ช‡ GC ๊ธฐ๋ฒ•์€ ๋งˆํฌ์•ค ์Šค์œ• ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ์œผ๋‚˜ ํ‡ด์ถœ๋œ ๋ชจ์–‘์ƒˆ๊ณ , Go๋Š” ์ง€๊ธˆ๋„ ์ด๊ฑธ ์“ด๋‹ค.

๋ฃจํŠธ๊ฐ์ฒด๋“ค๋ถ€ํ„ฐ ํ•œ๋ฐ”ํ€ด ๋บ‘ ๋Œ๋ฉด์„œ ์ฐธ์กฐ๋˜๊ณ  ์žˆ๋Š”์ง€๋ฅผ ์ฒดํฌํ•˜๊ณ , ์ฐธ์กฐ๋˜์ง€ ์•Š์€๊ฑธ ์‹น ์ง€์›Œ๋ฒ„๋ฆฐ๋‹ค๋Š” ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค.

๊ตฌํ˜„ํ•˜๊ธฐ์—๋Š” ํŽธ๋ฆฌํ•˜์ง€๋งŒ ๋‹จ์ ์ด ๋งŽ์•„์„œ ์ž๋ฐ”๋Š” ์ด ๊ตฌ์กฐ๋ฅผ ๊ฑฐ์˜ ๋ฒ„๋ ธ๋‹ค.

๋งค GC ํƒ€์ž„๋งˆ๋‹ค ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ํ’€์Šค์บ”ํ•˜๋ฉด์„œ ์ฐ๊ณ , ๋˜ ํ’€์Šค์บ”ํ•˜๋ฉด์„œ ์ง€์›Œ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ปค์ง€๋ฉด ๊ฐ๋‹น์ด ์ž˜ ์•ˆ๋œ๋‹ค๋Š”๊ฒŒ ๋‹จ์ ์ด๋‹ค.

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

๋ฉ”๋ชจ๋ฆฌ ํŒŒํŽธํ™”๊ฐ€ ๋ˆ„์ ๋ ์ˆ˜๋ก ์—ฐ์†๋œ ํฐ ๊ณต๊ฐ„์ด ์—†์–ด์ ธ์„œ ๋นˆ ๊ณต๊ฐ„์„ ์ฐพ๊ธฐ๋„ ํž˜๋“ค๊ณ , ์ถ”๊ฐ€์ ์ธ ์ •๋ฆฌ์ž‘์—…์ด ํ•„์š”ํ•ด์งˆ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.




Now: Concurrent Mark and Sweep

Go๋Š” Mark and Sweep์˜ ๋ณ€ํ˜•์ธ Concurrent Mark and Sweep(CMS)์„ ๊ธฐ๋ณธ GC ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

์ด๊ฑด ์‚ฌ์‹ค ์ž๋ฐ”๊ฐ€ ์ง„์ž‘์— ํ๊ธฐํ•œ CMS์™€ ์ ‘๊ทผ๋ฒ•์ด ๋น„์Šค๋ฌด๋ฆฌํ•˜๋‹ค. ์„ธ๋ถ€ ๊ตฌํ˜„์—์„œ ์ฐจ์ด๊ฐ€ ์žˆ๊ธฐ๋Š” ํ•˜์ง€๋งŒ ๋ง์ด๋‹ค.

GC๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์Šค๋ ˆ๋“œ์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์œ ์ €์Šค๋ ˆ๋“œ๊ฐ€ ๊ฑฐ์˜ ๋™์‹œ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค๊ณ  ํ•ด์„œ Concurrent๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.




Now: tri-color Mark and Sweep

Go๋Š” ๋งˆํฌ์•ค์Šค์œ•์„ ์ฆ๋ถ„์ ์œผ๋กœ(incremental) ์ฒ˜๋ฆฌํ•œ๋‹ค. ๊ทธ๋Ÿฐ ๋ชฉ์ ์œผ๋กœ ์œ„ํ•ด ์‘์šฉ๋˜๋Š” ์›๋ฆฌ๊ฐ€ 3์ƒ‰ ๋งˆํฌ์•ค์Šค์œ•์ด๋‹ค.

๋งŒ๋ฌผ์ƒ ๋‹ค์ต์ŠคํŠธ๋ผ๊ฐ€ 1978๋…„์— ๊ณ ์•ˆํ–ˆ๊ณ  Go 1.5๋ถ€ํ„ฐ ๋„์ž…๋๋‹ค.

์ผ๋ฐ˜์ ์ธ ๋งˆํฌ์•ค์Šค์œ•์€ mark ๊ณผ์ •๊ณผ sweep ๊ณผ์ •์„ ์ฒ˜๋ฆฌํ• ๋•Œ Stop The World๋ฅผ ๋•Œ๋ ค์•ผ ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ Go CMS์—์„œ๋Š” ์ •์ง€์‹œ๊ฐ„์„ ์ตœ์†Œํ™”ํ•œ ์ฑ„๋กœ GC์™€ ์œ ์ €์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์‹คํ–‰๋œ๋‹ค.

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

์ด๊ฑธ ์™„ํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•๋ก ์ด 3์ƒ‰(tri-color) ๋งˆํฌ์•ค์Šค์œ•์ด๋‹ค.

๋‹จ์ˆœํ•œ ๋งˆํฌ์•ค์Šค์œ•์€ "marked=false"์™€ "marked=true" 2๊ฐœ์˜ ์ƒ‰์ƒ๋งŒ ์กด์žฌํ•˜์ง€๋งŒ, GoGC๋Š” ํ•œ๊ฐ€์ง€์˜ ์ƒ‰์ƒ์„ ๋” ์ถ”๊ฐ€ํ•œ๋‹ค.

ํฐ์ƒ‰(์ œ๊ฑฐ๋Œ€์ƒ), ๊ฒ€์€์ƒ‰(์ƒ์กด), ํšŒ์ƒ‰(?)์ด๋‹ค.
ํšŒ์ƒ‰์€ "์Šค์บ”๋˜์ง€๋Š” ์•Š์•˜์ง€๋งŒ ์‚ญ์ œํ•  ์ˆ˜๋„ ์—†์Œ"์„ ๋œปํ•œ๋‹ค.

https://blog.stackademic.com/basics-of-golang-gc-explained-tri-color-mark-and-sweep-and-stop-the-world-cc832f99164c

3์ƒ‰ CMS์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์Šคํ…์œผ๋กœ GC๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.

  1. ๋ฃจํŠธ ๊ฐ์ฒด๋ฅผ ๋ชจ๋‘ ํšŒ์ƒ‰์œผ๋กœ ์น ํ•œ๋‹ค.
  2. ํšŒ์ƒ‰์„ ๊ฒ€์€์ƒ‰์œผ๋กœ ์น ํ•˜๊ณ , ํฐ์ƒ‰์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š”๊ฒŒ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
  3. ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๋Œ€์ƒ์ค‘ ํฐ์ƒ‰์ด ๋ฐœ๊ฒฌ๋˜๋ฉด ํšŒ์ƒ‰์œผ๋กœ ์น ํ•œ๋‹ค.
  4. ํšŒ์ƒ‰์ด ์ „๋ถ€ ์‚ฌ๋ผ์งˆ๋•Œ๊นŒ์ง€ 2-3์„ ๋ฐ˜๋ณต
  5. ํฐ์ƒ‰์„ ์ „๋ถ€ ์‚ญ์ œํ•œ๋‹ค.

GC๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋„์ค‘์— ๋ผ์–ด๋“  ๊ฐ์ฒด๋“ค๋„ ์ผ๋‹จ ํšŒ์ƒ‰ ๊ฐ์ฒด๋กœ ํ• ๋‹นํ•˜๊ณ , ํšŒ์ƒ‰์ด ์žˆ์œผ๋ฉด ๋‹ค์‹œ GC ์‹ธ์ดํด์„ ๋„๋Š” ๊ฒƒ์ด๋‹ค.

๋„์ค‘์— ํšŒ์ƒ‰ ๊ฐ์ฒด๊ฐ€ ์ƒ๊ธฐ๋ฉด ์ƒ๊ธฐ๋Š”๋Œ€๋กœ ๋บ‘๋บ‘์ด ๋Œ๋ ค์„œ ์ฒ˜๋ฆฌํ•˜๋‹ˆ, ๊ฐ๊ฐ์˜ Stop the World ์‹œ๊ฐ„์€ ์งง์ง€๋งŒ GC์˜ ์‚ฌ์ดํด ์ž์ฒด๋Š” ๋” ๊ธธ์–ด์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ๊ฐ€ ์ข€ ์ง€์—ฐ๋  ์ˆ˜๋„ ์žˆ๋‹ค.

footprint๋ฅผ ํฌ์ƒํ•˜๋Š” ๋Œ€์‹  ํ‰๊ท ์ ์ธ ์ •์ง€์‹œ๊ฐ„(latency)์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ตฌ์กฐ๋‹ค.

GC๋กœ ์ธํ•œ ์ง€์—ฐ์‹œ๊ฐ„์ด ์ตœ๋Œ€ 10ms๋ผ๊ณ  ์ž๋ž‘ํ•˜๋Š” ๊ฒƒ๋„, GC๊ฐ€ ์งง์•„์„œ๊ฐ€ ์•„๋‹ˆ๋ผ ์ฐ”๋”์ฐ”๋” ๋Š์–ด์„œ ์ฒ˜๋ฆฌํ•ด์„œ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด๋‹ค. GC ์™„๋ฃŒ์— ์†Œ์š”๋˜๋Š” ์‹œ๊ฐ„ ์ž์ฒด๋Š” ๊ธธ๋‹ค.




Diff: ์„ธ๋Œ€๋ณ„ GC ์—†์Œ

์—ฌํƒ€ GC ์‹œ์Šคํ…œ๋“ค์€ ์„ธ๋Œ€ ์ด๋ก ์— ์ž…๊ฐํ•ด์„œ "ํ™•๋ฅ ์ ์œผ๋กœ ๊ธˆ๋ฐฉ ์‚ญ์ œ๋  ๊ฐ์ฒด๋“ค์ด ๋ชจ์—ฌ์žˆ๋Š”" ์‹ ์„ธ๋Œ€ ์˜์—ญ๊ณผ "์˜ค๋ž˜ ์ƒ์กดํ•  ๊ฐ์ฒด๋“ค์ด ๋ชจ์—ฌ์žˆ๋Š”" ๊ตฌ์„ธ๋Œ€ ์˜์—ญ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ ๊ด€๋ฆฌํ•œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ๋„ ๋‹ค๋…„๊ฐ„ ์ฆ๋ช…๋œ ๋ฐฉ๋ฒ•์ด๋‹ค.

์ด๋ฅผ ํ†ตํ•ด์„œ ๋ฉ”๋ชจ๋ฆฌ ํŒŒํŽธํ™” ๋ฌธ์ œ์™€ GC ์„ฑ๋Šฅ์„ ํšจ๊ณผ์ ์œผ๋กœ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ Go๋Š” ์„ธ๋Œ€๋ณ„ ์ด๋ก ์„ ๋„์ž…ํ•˜์ง€ ์•Š๊ณ  ์ž์‹ ๋งŒ์˜ ๊ธธ์„ ๊ฑท๊ณ  ์žˆ๋‹ค.
ํ–ฅํ›„์—๋Š” ์–ด๋–จ์ง€ ๋ชจ๋ฅด์ง€๋งŒ, ์ง€๊ธˆ์€ ์—†๋‹ค.
Go ๊ฐœ๋ฐœ์ง„๋“ค๋„ ๋„ฃ์ง€ ์•Š์„๊ฑฐ๋ผ๋Š” ๋‹จ์–ธ์„ ํ•˜์ง€๋Š” ์•Š๊ณ  "์‹คํ—˜์ด ํ•„์š”ํ•œ" ๋ถ€๋ถ„์ด๋ผ๊ณ  ์œ ์˜ˆํ•˜๊ณ  ์žˆ๋‹ค.

์•„๋งˆ ์ผ๋‹จ์€ GC ๊ตฌ์กฐ๋ฅผ ๊ฐ„๋‹จํ•˜๊ณ  ๊ฐ€๋ณ๊ฒŒ ์œ ์ง€ํ•˜๋ ค๋Š” ๋ชฉ์ ์ด ํฐ๊ฑฐ๊ฐ™๋‹ค.

Go๋Š” ๋Œ€์‹  ์„ธ๋Œ€๋ณ„ ์ด๋ก ์—์„œ ๋‚˜์˜ค๋Š” "์ˆ˜๋ช…์ด ์งง์€ ๊ฐ์ฒด"๋ฅผ ํž™ ๋Œ€์‹  ์Šคํƒ์— ํ• ๋‹นํ•˜๋Š” ๊ผผ์ˆ˜๋กœ ์žฆ์€ ํ• ๋‹น&ํ•ด์ œ๋กœ ์ธํ•œ ๋ถ€ํ•˜๋ฅผ ๊ฐ์†Œ์‹œํ‚จ๋‹ค. ์ด๊ฑธ escape analysis๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
๊ทธ๋ž˜์„œ Go์—์„œ๋Š” ๋™์ ํ• ๋‹น์„ ํ•˜๋”๋ผ๋„ ์Šคํƒ์— ํ• ๋‹น๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค.

๊ทผ๋ฐ ์ด๊ฒŒ ๋ชจ๋“ ๊ฑธ ์ปค๋ฒ„ํ•˜๋Š”๊ฑด ์•„๋‹ˆ๋ผ์„œ Java๋ณด๋‹ค ๋’ค๋–จ์–ด์ง€๋Š”๊ฑด ๋งž๋‹ค. ํ• ๋‹น ๊ด€๋ จํ•ด์„œ๋Š” ๊ทธ๋ƒฅ ํšจ์œจ์ ์ธ ํ˜•ํƒœ๋กœ ์งœ๋ผ๊ณ  ๊ถŒ์œ ํ•˜๋ฉด์„œ ์‚ฌ์šฉ์ž ์ฑ…์ž„์œผ๋กœ ๋– ๋„˜๊ธฐ๋Š” ๊ฒฝํ–ฅ์ด ์žˆ๋‹ค.




Basic: Escape Analysis

๋™์  ๊ฐ์ฒด ํ• ๋‹น์€ ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ์ง€์—ญ๋ณ€์ˆ˜๋ณด๋‹ค ์ƒ์กด์ฃผ๊ธฐ๊ฐ€ ์ž์œ ๋กญ๋‹ค๋Š” ์ ์—์„œ ์ˆ˜์ง‘ ์‹œ์ ์„ ์žก์•„๋‚ด๊ธฐ๊ฐ€ ๊นŒ๋‹ค๋กญ๋‹ค.

ํ•˜์ง€๋งŒ ๋™์ ํ• ๋‹น๋„ ์ฝ”๋“œ ํŒจํ„ด์— ๋”ฐ๋ผ์„œ๋Š” ํ•ด์ œ ์‹œ์ ์ด ๋ช…ํ™•ํ•˜๊ฒŒ ๋“œ๋Ÿฌ๋‚  ๋•Œ๊ฐ€ ์žˆ๋‹ค.
๊ทธ๋Ÿฐ ๊ฒฝ์šฐ๋ฅผ ์ •์ ๋ถ„์„์œผ๋กœ ์ตœ์ ํ™”ํ•˜๋Š”๊ฑธ Escape ๋ถ„์„์ด๋ผ๊ณ  ๋งํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ์ฝ”๋“œ๋Š” ๋™์  ํ• ๋‹น์ด ํฌํ•จ๋˜์ง€๋งŒ

void Function() {
** var obj = new Something();**
** **** // ...******
** return**
}

obj๊ฐ€ ์‚ฌ์‹ค์ƒ ์ € ํ•จ์ˆ˜ ์ข…๋ฃŒ ์‹œ์ ์— ๋‚ ๋ผ๊ฐ„๋‹ค๋Š”๊ฒŒ ๋ช…ํ™•ํ•˜๋‹ค. ๋”ฐ๋ผ์„œ Escape ๋Œ€์ƒ์— ๋“ค์–ด๊ฐ€๊ณ , ๋™์ ํ• ๋‹น์ด ์•„๋‹Œ ์Šคํƒ ํ• ๋‹น์œผ๋กœ ์ตœ์ ํ™”๋œ๋‹ค.

๋ฐ˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋Š”

Something Function() {
** var obj = new Something();**
** **** // ...******
** return obj**
}

๊ฐ์ฒด๊ฐ€ ํ•จ์ˆ˜ ํ๋ฆ„ ๋ฐ–์œผ๋กœ ์ „์ด๋˜๊ธฐ์— ๊ฐ์ฒด์˜ ์ƒ์กด์ฃผ๊ธฐ๋ฅผ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๋‹ค. ์ด๊ฑด ์ตœ์ ํ™”ํ•  ์ˆ˜ ์—†๋‹ค.
๊ทธ๋ƒฅ ํž™์— ๋“ค์–ด๊ฐ„๋‹ค.

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




Diff: ๋ฉ”๋ชจ๋ฆฌ ์ปดํŒฉ์…˜ ์—†์Œ

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

GoGC ์ž์ฒด๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ปดํŒฉ์…˜์„ ๋ฐฐ์ œํ•œ ์ฑ„๋กœ ๊ตฌํ˜„๋˜์–ด์žˆ๋‹ค.
๋Œ€์‹  allocator๋ฅผ ๊ฑด๋“œ๋ฆฌ๋Š” ๊ฒƒ์œผ๋กœ ์—๋‘˜๋Ÿฌ์„œ ๋ฌธ์ œ๋ฅผ ํšŒํ”ผํ•œ๋‹ค.




New: TCMalloc

Go๋Š” TCMalloc์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๋ฉ”๋ชจ๋ฆฌ Pool ๊ธฐ๋ฐ˜ allocator๋ฅผ ํ†ตํ•ด์„œ ๋ฉ”๋ชจ๋ฆฌ ํŒŒํŽธํ™”๋กœ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ์™„ํ™”ํ•œ๋‹ค.
์ด๊ฑด ์‚ฌ์‹ค Go ์ „์šฉ allocator๋Š” ์•„๋‹ˆ๊ณ , C/C++์šฉ์œผ๋กœ ๋งŒ๋“ค์—ˆ๋˜ ๋ฒ”์šฉ์ด๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ํŒŒํŽธํ™” ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๋Š” ์ฃผ์žฅ๋„ ์žˆ๋Š”๋ฐ, ๊ทธ๊ฑด ๊ณผ์žฅ์ด๊ณ  ์žˆ๊ธฐ๋Š” ์žˆ๋‹ค. ์ด์Šˆ ๋“ค์–ด๊ฐ€๋ณด๋ฉด ์ด๋Ÿฐ์ €๋Ÿฐ ๋ณผ๋ฉ˜์†Œ๋ฆฌ๊ฐ€ ๋งŽ๋‹ค.

TCMalloc์€ ๋‚ด๋ถ€์ ์œผ๋กœ ๊ฝค ๋ณต์žกํ•œ ๋ ˆ์ด์–ด๋ฅผ ๊ฐ€์ง„๋‹ค.

https://google.github.io/tcmalloc/design.html
๋ฐฑ์—”๋“œ, ๋ฏธ๋“ค์—”๋“œ, ํ”„๋ก ํŠธ์—”๋“œ๋‹ค.
๋ฐฑ์—”๋“œ๋Š” OS์—์„œ ์ง์ ‘ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•ด์˜ค๊ณ , ๋ฏธ๋“ค์—”๋“œ๋Š” ํ• ๋‹นํ•ด์˜จ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ์ ˆํžˆ ๊ด€๋ฆฌํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ”„๋ก ํŠธ์—”๋“œ๋Š” ๋ชจ์•„๋†“์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋น ๋ฅด๊ฒŒ ํ”„๋กœ๊ทธ๋žจ์— ๋‚˜๋ˆ ์ค€๋‹ค.
ํšจ์œจ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ์น˜๋ฅผ ์œ„ํ•ด ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ๋ฅผ 60๊ฐ€์ง€์˜ ํด๋ž˜์Šค๋กœ ๋งค์šฐ ์„ธ๋ถ„ํ™”ํ•ด์„œ ๊ด€๋ฆฌํ•œ๋‹ค. ์ด๊ฒƒ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ํŒŒํŽธํ™” ๋ฌธ์ œ๋ฅผ ์ค„์ธ๋‹ค.




๋ฌธ์ œ

๊ทผ๋ฐ ๋ฌธ์ œ๋Š”, tcmalloc์ด ํ•ด๊ฒฐํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•˜๋Š” ์žฅ์ ๋“ค์€ ๊ฒฐ๊ตญ ๋‹ค ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํฌ์ƒํ•ด์„œ ์–ป๋Š” ๊ฑฐ๋ž€ ๊ฒƒ์ด๋‹ค.
tcmalloc์ด ๊ทธ๋ ‡๊ฒŒ ์—„์ฒญ๋‚˜๊ณ  ์™„๋ฒฝํ•˜๋ฉด ๋‹ค๋ฅธ ์–ธ์–ด๋“ค๋„ ๋‹ค allocator๋ฅผ tcmalloc์œผ๋กœ ์ผ์„ ๊ฒƒ์ด๋‹ค. ๋‹ค๋ฅธ ์–ธ์–ด ๊ฐœ๋ฐœ์ž๋“ค์ด ๋ฐ”๋ณด๋ผ์„œ ์•ˆ์ผ๊ฒ ๋Š”๊ฐ€?

tcmalloc์€ ํ• ๋‹น ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด์„œ GC ๋Ÿฐํƒ€์ž„์ฒ˜๋Ÿผ ์ง์ ‘ ๋ฉ”๋ชจ๋ฆฌ ํ’€์„ ๊ฐ–๊ณ ์„œ ๋™์ž‘ํ•œ๋‹ค. ๊ทธ ๋ง์ธ์ฆ‰, ํ• ๋‹น์„ ํ•ด๋„ ๋ฐ”๋กœ OS์— ๋ฐ˜ํ™˜๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

GoGC ์ž์ฒด์—์„œ๋„ ๋ฉ”๋ชจ๋ฆฌํ’€์„ ๋“ค๊ณ ์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ, ๋ฉ”๋ชจ๋ฆฌํ’€์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•  ๋•Œ๋„ tcmalloc ๋‚ด์—์„œ ๋ฉ”๋ชจ๋ฆฌํ’€์„ ๋˜ ๋“ค๊ณ ์žˆ์œผ๋‹ˆ ์‚ฌ์‹ค์ƒ Go๋Š” ๋ฉ”๋ชจ๋ฆฌํ’€์ด 2๋‹จ๊ณ„๋กœ ์กด์žฌํ•˜๋Š” ์…ˆ์ด๋‹ค.
๋‚ด๊ฐ€ ์•Œ๊ธฐ๋กœ ๋‹ค๋ฅธ GC ์–ธ์–ด๋“ค์ค‘์— ์ด๋Ÿฐ๊ฑด ๋”ฑํžˆ ์—†๋‹ค.

๋‹น์—ฐํžˆ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋” ๊ฒŒ์œผ๋ฅด๊ฒŒ ํ•ด์ œ๋˜๋‹ˆ ๋” ์ค„์ค„ ์ƒˆ๊ณ , GoGC์—์„œ ์•„๋ฌด๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋”๋ผ๋„ tcmalloc์—์„œ OS์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ถ€์œ ๋ฌผ์ฒ˜๋Ÿผ ๋œจ๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

๊ฒŒ๋‹ค๊ฐ€ ํ†ต์ƒ์ ์œผ๋กœ tcmalloc์€ ๊ธฐ๋ณธ allocator์— ๋น„ํ•ด ์ตœ๋Œ€ 2~3๋ฐฐ๊นŒ์ง€๋„ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํญ์‹ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ ์‹ค์ œ๋กœ๋„ Go๋กœ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น/ํ•ด์ œ๊ฐ€ ๋นˆ๋ฒˆํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ๋Œ๋ฆฌ๋ฉด ์‹ค์ œ ์‚ฌ์šฉ ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ช‡๋ฐฐ๋ฅผ ๋„˜๊ฒŒ๋„ ์“ฐ๋ ˆ๊ธฐ๊ฐ€ ๋‚จ์•„์„œ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜๋Š” ํ˜„์ƒ์ด ๊ต‰์žฅํžˆ ํ”ํ•˜๊ฒŒ ๋ฐœ์ƒํ•œ๋‹ค.
low-latency๋ผ๋Š” ๋ช…๋ชฉ ํ•˜์— gc ์ž์ฒด๋ฅผ ๋งค์šฐ ๊ฒŒ์œผ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ, ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๊ฐ€ 2๋‹จ๊ณ„๋ผ ํ• ๋‹นํ•ด์ œ๊ฐ€ ๋”๋”˜๊ฑฐ๊นŒ์ง€ ํ•ฉ์ณ์ ธ์„œ ์ƒ๊ธฐ๋Š” ๋ถˆํ˜‘ํ™”์Œ์ด๋‹ค.

์‚ฌ์‹ค ์ด๊ฑด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค๊ธฐ๋ณด๋‹จ ์ฑ…์ž„์„ ํšŒํ”ผํ•œ ๊ฒƒ์— ๊ฐ€๊นŒ์›Œ๋ณด์ด๋Š” ๊ธฐ์ˆ  ๊ฒฐ์ •์ธ ๊ฒƒ ๊ฐ™๋‹ค.

๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์••๋ ฅ์ด ์‹ฌํ•œ ์‚ฌ๋ก€์—์„œ๋Š” ์•„์ง Go๊ฐ€ ๋ถ€์ ์ ˆํ•˜๋‹ค๊ณ  ๋ณธ๋‹ค.
CPU ์ง‘์•ฝ์ ์ธ ๊ฒฝ์šฐ๋ผ๋ฉด ์ถ”์ฒœํ• ๋งŒํ•˜์ง€๋งŒ, ๋ฉ”๋ชจ๋ฆฌ ์ง‘์•ฝ์ ์ธ ๊ฒฝ์šฐ๋ผ๋ฉด ์ถ”์ฒœํ•˜์ง€ ์•Š๋Š”๋‹ค.



์ฐธ์กฐ
https://engineering.linecorp.com/ko/blog/go-gc
https://stackoverflow.com/questions/43995901/why-golang-garbage-collector-not-implement-generational-and-compact-gc
https://velog.io/@hyeok3011/Golang-GC
https://go.dev/blog/ismmkeynote
https://google.github.io/tcmalloc/design.html
https://groups.google.com/g/golang-nuts/c/KJiyv2mV2pU
https://blog.stackademic.com/basics-of-golang-gc-explained-tri-color-mark-and-sweep-and-stop-the-world-cc832f99164c
https://www.google.com/search?q=escape+analysis&client=ms-android-samsung-ss&sourceid=chrome-mobile&ie=UTF-8
https://google.github.io/tcmalloc/overview.html
https://github.com/gperftools/gperftools/issues/756