CS

[Java] ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(Garbage Collection, GC)์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

์žฅ์šฉ์„ 2024. 4. 3. 21:39

 

 

๐Ÿค” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜, GC?

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

 

C, C++ ๊ฐ™์€ ์–ธ์–ด๋Š” GC๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๊ณผ ํ•ด์ œ๋ฅผ ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ž๋ฐ”๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ํ•ด์ œํ•˜์ง€ ์•Š๊ณ  GC์— ์˜ํ•ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

GC๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•ด์ฃผ์ง€๋งŒ, ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์–ธ์ œ ํ•ด์ œ๋˜๋Š”์ง€ ์ •ํ™•ํ•˜๊ฒŒ ์•Œ ์ˆ˜ ์—†์–ด ์ œ์–ดํ•˜๊ธฐ๊ฐ€ ํž˜๋“ญ๋‹ˆ๋‹ค.

๋˜ํ•œ GC๊ฐ€ ๋™์ž‘ํ•˜๋Š” ๋™์•ˆ์—๋Š” ๋‹ค๋ฅธ ๋™์ž‘์„ ๋ฉˆ์ถ”๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ ๋“ค๋กœ ์ƒํ™ฉ์— ๋”ฐ๋ผ ํ”„๋กœ๊ทธ๋žจ์˜ ์„ฑ๋Šฅ์ด ํ•˜๋ฝ์‹œํ‚ฌ ์ˆ˜ ์žˆ์–ด ํ”„๋กœ๊ทธ๋žจ ๋™์ž‘์ด ๋ฉˆ์ถ”๋Š”(Stop The world)์‹œ๊ฐ„์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋„๋ก GC์ตœ์ ํ™” ์ž‘์—…์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ“ŒStop The World

GC๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋™์•ˆ JVM์ด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹คํ–‰์„ ์ผ์‹œ์ ์œผ๋กœ ๋ฉˆ์ถ”๋Š” ํ˜„์ƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

 

 

 

โœ” GC๋Š” ์–ด๋–ค ๊ฐ์ฒด๋ฅผ Garbage๋กœ ํŒ๋‹จํ• ๊นŒ์š”?

๐Ÿ’ก Reachability(๋„๋‹ฌ ๊ฐ€๋Šฅ์„ฑ)

GC๋Š” Reachability๋ผ๋Š” ๊ฐœ๋…์„ ํ†ตํ•ด ๊ฐ์ฒด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ œ๊ฑฐ๋˜๊ธฐ ์ „์— ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”์ง€๋ฅผ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค.

 

๊ฐ์ฒด๊ฐ€ ์ง์ ‘์ ์ธ ์ฐธ์กฐ(Reference)๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด ์ฆ‰ Reachableํ•˜๋‹ค๋ฉด ํ•ด๋‹น ๊ฐ์ฒด๋Š” ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ œ๊ฑฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋Œ€๋กœ ๊ฐ์ฒด๊ฐ€ ์ฐธ์กฐ๋˜๊ณ  ์žˆ์ง€ ์•Š์€ ์ƒํƒœ๋ผ๋ฉด ์ฆ‰ Unreachable ํ•˜๋‹ค๋ฉด GC์˜ ๋Œ€์ƒ์ด ๋˜์–ด ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

 

 

์œ„ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ JVM์˜ Heap Area์—๋Š” ์‹ค์งˆ์ ์ธ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  Method Area, Stack Area์—์„œ๋Š” ๊ทธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Heap Area์˜ A๊ฐ์ฒด์™€ B๊ฐ์ฒด๋Š” ์ฐธ์กฐ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค, ์ฆ‰ Reachable ํ•˜๊ธฐ ๋•Œ๋ฌธ์— GC์˜ ๋Œ€์ƒ์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ํŠน์ • ๋™์ž‘์œผ๋กœ ์ฐธ์กฐ ๋ณ€์ˆ˜๊ฐ€ ์‚ญ์ œ๋˜๋Š”(C๊ฐ€ ์‚ญ์ œ) ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด Heap Area์˜ C ๊ฐ์ฒด๋Š” ์ฐธ์กฐ๋˜๊ณ  ์žˆ์ง€ ์•Š๊ฒŒ ๋ฉ๋‹ˆ๋‹ค, ์ฆ‰ Unreachable ํ•˜๊ฒŒ ๋˜์–ด GC์—์˜ ๋Œ€์ƒ์œผ๋กœ ํŒ๋‹จํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

 

 

 

โœ”GC๋Š” ๊ฐ์ฒด๋ฅผ ์–ด๋–ป๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ œ๊ฑฐํ• ๊นŒ์š”?

๐Ÿ’ก Mark and Sweep

GC๋Š” Mark and Sweep๋ผ๋Š” ๊ณผ์ •์„ ํ†ตํ•ด GC์˜ ๋Œ€์ƒ์ด ๋˜๋Š” ๊ฐ์ฒด๋ฅผ ์‹๋ณ„(Mark) ํ•˜๊ณ  ์ œ๊ฑฐ(Sweep)ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ํ›„ ์ฑ„์›€(Compaction)์„ ํ†ตํ•ด ํŒŒํŽธํ™”๋œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ์•ž์—์„œ๋ถ€ํ„ฐ ์ฑ„์›Œ ๋‚˜๊ฐ‘๋‹ˆ๋‹ค.

 

Mark : Root Space๋กœ๋ถ€ํ„ฐ ๊ทธ๋ž˜ํ”„ ์ˆœํšŒ๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐ๋œ ๊ฐ์ฒด๋“ค์„ ์ฐพ์•„๋‚ด์–ด ๊ฐ๊ฐ ์–ด๋–ค ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š”์ง€ ๋งˆํ‚นํ•ฉ๋‹ˆ๋‹ค.

Sweep : ์ฐธ์กฐํ•˜๊ณ  ์žˆ์ง€ ์•Š์€ ๊ฐ์ฒด ์ฆ‰ Unreachable ๊ฐ์ฒด๋“ค์„ Heap Area์—์„œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

Compaction : Sweep์ดํ›„ ๋ถ„์‚ฐ๋œ ๊ฐ์ฒด๋“ค์„ Heap์˜ ์‹œ์ž‘ ์ฃผ์†Œ๋กœ ๋ชจ์•„ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ• ๋‹น๋œ ๋ถ€๋ถ„๊ณผ ๊ทธ๋ ‡์ง€ ์•Š์€ ๋ถ€๋ถ„์œผ๋กœ ์••์ถ•ํ•ฉ๋‹ˆ๋‹ค.

 

 

 

โœ” GC์˜ ๋™์ž‘ ๊ณผ์ •๊ณผ ์ข…๋ฅ˜

๐Ÿ’ก Heap ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ

Heap์˜์—ญ์€ ์ฒ˜์Œ ์„ค๊ณ„๋  ๋•Œ 2๊ฐ€์ง€๋ฅผ ์ „์ œ๋กœ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

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

2.  ์˜ค๋ž˜๋œ ๊ฐ์ฒด์—์„œ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋กœ์˜ ์ฐธ์กฐ๋Š” ์•„์ฃผ ์ ๊ฒŒ ์กด์žฌํ•œ๋‹ค.

 

์ด๋Ÿฌํ•œ ์ „์ œ๋กœ JVM๊ฐœ๋ฐœ์ž๋“ค์€ ๋ณด๋‹ค ํšจ์œจ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด, ๊ฐ์ฒด์˜ ์ƒ์กด๊ธฐ๊ฐ„์— ๋”ฐ๋ผ ๋ฌผ๋ฆฌ์ ์ธ Heap์˜์—ญ์„ ๋‚˜๋ˆ„๊ฒŒ ๋˜์—ˆ๊ณ  Young ๊ณผ Old ์ด 2๊ฐ€์ง€ ์˜์—ญ์œผ๋กœ ์„ค๊ณ„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

๐Ÿ”Ž Young Generation

Eden : new๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๊ฐ€ ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.

Survivor

Eden์˜์—ญ์— ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ€๋“ ์ฐจ๋ฉด Garbage Collection์ด ๋ฐœ์ƒํ•˜๊ณ , Eden์˜์—ญ์— ์žˆ๋˜ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๊ฐ€ Survivor1 ๋˜๋Š” 2๋กœ ์˜ฎ๊ฒจ์ง€๊ณ , ๋‘ ๊ฐœ์˜ Survivor์˜์—ญ ์ค‘ ํ•˜๋‚˜์˜ ์˜์—ญ์ด ๊ฐ€๋“ ์ฐจ๊ฒŒ ๋˜๋ฉด ๊ณต๊ฐ„์ด ๋‚จ์•„ ์žˆ๋Š” Survivor์˜์—ญ์œผ๋กœ ์ด๋™ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

( ์ด๋Ÿฌํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ Survivor1 ๋˜๋Š” Survivor2 ๋‘˜ ์ค‘ ํ•˜๋‚˜๋Š” ํ•ญ์ƒ ๋น„์–ด์žˆ๋Š” ๊ณต๊ฐ„์œผ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. )

 

์ด๋Ÿฌํ•œ ๊ณผ์ •์—์„œ 1์ฐจ GC๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” Minor GC๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก Minor C

Young Generation์˜์—ญ์—์„œ ๋ฐœ์ƒํ•˜๋Š” GC๋กœ Eden์˜์—ญ ๋˜๋Š” Survivor์˜์—ญ์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋“ค์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

Young Generation์˜ ๊ณต๊ฐ„์€ Old Generation์— ๋น„ํ•ด ์ƒ๋Œ€์ ์œผ๋กœ ์ž‘๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ์ƒ์˜ ๊ฐ์ฒด๋ฅผ ์ฐพ์•„ ์ œ๊ฑฐํ•˜๋Š”๋ฐ ์ ์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋ฉฐ, ์ด ๋•Œ๋ฌธ์— Young Generation์˜์—ญ์—์„œ ๋ฐœ์ƒ๋˜๋Š” GC๋ฅผ Minor GC๋ผ๊ณ  ๋ถˆ๋ฆฝ๋‹ˆ๋‹ค.

 

 

 

๐Ÿ”Ž Old Generation

Survivor1๊ณผ Survivor2์˜์—ญ์„ ์˜ค๊ฐ€๋Š” ๊ณผ์ •์—์„œ ์˜ค๋žซ๋™์•ˆ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋“ค์€ Old Generation ์˜์—ญ์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿค” ์–ผ๋งˆ๋‚˜ ์˜ค๋žซ๋™์•ˆ ์‚ด์•„๋‚จ์•„์•ผ ํ• ๊นŒ?

Young Generation ์˜์—ญ์—์„œ Minor GC๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋™์•ˆ ์–ผ๋งˆ๋‚˜ ์˜ค๋ž˜ ์‚ด์•„๋‚จ์•˜๋Š”์ง€๋กœ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค.

๊ฐ ๊ฐ์ฒด๋Š” Minor GC์—์„œ ์‚ด์•„๋‚จ์€ ํšŸ์ˆ˜๋ฅผ ๊ธฐ๋กํ•˜๋Š” age bit๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, Minor GC๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค age bit๊ฐ’์€ 1์”ฉ ์ฆ๊ฐ€ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

age bit๊ฐ€ ์„ค์ •๋œ ์ž„๊ณ„๊ฐ’์„ ์ดˆ๊ณผ ํ•˜๊ฒŒ๋˜๋ฉด Old Generation ์˜์—ญ์œผ๋กœ ๊ฐ์ฒด๋ฅผ ์ด๋™ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ฐ’์„ ์ดˆ๊ณผํ•˜์ง€ ์•Š๋”๋ผ๋„ Survivor์˜์—ญ์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•  ๊ฒฝ์šฐ์—๋Š” ๋ฏธ๋ฆฌ Old Generation์œผ๋กœ ๊ฐ์ฒด๊ฐ€ ์˜ฎ๊ฒจ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ’ก Major GC(Full GC)

Old Generation์˜์—ญ์— ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ€๋“ ์ฐจ๋ฉด GC๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ์ด๊ฒƒ์„ Major GC๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

Old Generation ์˜์—ญ์€ Young Generation์˜์—ญ์— ๋น„ํ•ด ์ƒ๋Œ€์ ์œผ๋กœ ํฐ ๊ณต๊ฐ„์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด, ์ด ๊ณต๊ฐ„์—์„œ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์˜ ๊ฐ์ฒด ์ œ๊ฑฐ์— ๋งŽ์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

Young Generation์˜์—ญ์€ ํฌ๊ธฐ๊ฐ€ ์ž‘๊ธฐ๋•Œ๋ฌธ์— Minor GC๊ณผ์ •์ด ๋น ๋ฅธ์‹œ๊ฐ„์•ˆ์— ๋๋‚ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ Old Generation์˜ ๊ฒฝ์šฐ ํฐ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ์–ด Major GC๊ณผ์ •๋„ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ฆ‰ GC๊ณผ์ •์ด ์˜ค๋ž˜๊ฑธ๋ฆฌ๋ฉด์„œ ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ Stop The World ๋ฌธ์ œ๊ฐ€ ๊ธธ์–ด์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ž๋ฐ” ๊ฐœ๋ฐœ์ง„๋“ค์€ ๋‹ค์–‘ํ•œ GC์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ฐœ๋ฐœํ•˜์˜€์Šต๋‹ˆ๋‹ค. ( ZGC, G1, Parallel, ... )

์ƒํ™ฉ์— ๋งž๊ฒŒ GC์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์„ค์ •ํ•˜์—ฌ Stop The World๋ฅผ ์ตœ์†Œํ•œ์œผ๋กœ ์ค„์—ฌ ํ”„๋กœ๊ทธ๋žจ์˜ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 


 

๐Ÿ“š Reference

https://1-7171771.tistory.com/140,

https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EA%B0%80%EB%B9%84%EC%A7%80-%EC%BB%AC%EB%A0%89%EC%85%98GC-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%F0%9F%92%AF-%EC%B4%9D%EC%A0%95%EB%A6%AC#thankYou