diff --git a/Java/Garbage Collection.md b/Java/Garbage Collection.md new file mode 100644 index 0000000..7c234a4 --- /dev/null +++ b/Java/Garbage Collection.md @@ -0,0 +1,105 @@ +# ๐Ÿงน ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ (Garbage Collection) +> ### Garbage Collection์ด๋ž€? +**Heap ๋ฉ”๋ชจ๋ฆฌ์— ๋™์  ํ• ๋‹น๋˜์—ˆ์œผ๋‚˜ ์ฐธ์กฐ๋˜์ง€ ์•Š๋Š” ๋Œ€์ƒ์„ ํƒ์ง€ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œํ•˜๋Š” JVM์˜ ๊ธฐ๋Šฅ. +ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ๋ฐœ ํ•˜๋‹ค ๋ณด๋ฉด ์œ ํšจํ•˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ์ธ ๊ฐ€๋น„์ง€(Garbage)๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค. C์–ธ์–ด๋ฅผ ์ด์šฉํ•˜๋ฉด free()๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ง์ ‘ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•ด์ฃผ์–ด์•ผ ํ•˜์ง€๋งŒ Java๋‚˜ Kotlin์„ ์ด์šฉํ•ด ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค ๋ณด๋ฉด ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ง์ ‘ ํ•ด์ œํ•ด์ฃผ๋Š” ์ผ์ด ์—†๋‹ค. ๊ทธ ์ด์œ ๋Š” JVM์˜ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ๋ถˆํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์•Œ์•„์„œ ์ •๋ฆฌํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.** + +### ๐Ÿ‘ Garbage Collection์˜ ๋ชฉ์ ์€ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ๊ฐ„ํŽธํ™”ํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์˜ ์•ˆ์ •์„ฑ๊ณผ ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ. + + +``` +๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Memory Leaks)๋ž€? +๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ๋™์ ์œผ๋กœ ํ• ๋‹นํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•˜์ง€ ์•Š๊ณ  ๊ณ„์† ์‚ฌ์šฉํ•˜๋Š” ์ƒํ™ฉ์„ ๋งํ•œ๋‹ค. +์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๊ณ„์† ๋Š˜์–ด๋‚˜๋ฉฐ, ๊ฒฐ๊ตญ ์‹œ์Šคํ…œ์˜ ์„ฑ๋Šฅ ์ €ํ•˜๋‚˜ ์ถฉ๋Œ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค. +``` +### Garbage Collection์˜ ๋‹จ์  + +- ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์–ธ์ œ ํ•ด์ œ๋˜๋Š”์ง€ ์ •ํ™•ํ•˜๊ฒŒ ์•Œ ์ˆ˜ ์—†๋‹ค. +- ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด ๋™์ž‘ํ•˜๋Š” ๋™์•ˆ์—๋Š” ๋‹ค๋ฅธ ๋™์ž‘์„ ๋ฉˆ์ถ”๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. + +### Garbage Collection์˜ ๋Œ€์ƒ + + +- ๊ฐ์ฒด๊ฐ€ NULL์ธ ๊ฒฝ์šฐ (ex. String str = null) +- ๋ธ”๋Ÿญ ์‹คํ–‰ ์ข…๋ฃŒ ํ›„, ๋ธ”๋Ÿญ ์•ˆ์—์„œ ์ƒ์„ฑ๋œ ๊ฐ์ฒด +- ๋ถ€๋ชจ ๊ฐ์ฒด๊ฐ€ NULL์ธ ๊ฒฝ์šฐ, ํฌํ•จํ•˜๋Š” ์ž์‹ ๊ฐ์ฒด + +## Garbage Collection ๋™์ž‘ ๊ณผ์ • + +> **JVM์˜ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋Š” 'Weak Generational Hypothesis'๋ฅผ ์ „์ œ๋กœ ์„ค๊ณ„๋˜์—ˆ๋‹ค.** +``` +Weak Generational Hypothesis ๋ž€? +์‹ ๊ทœ๋กœ ์ƒ์„ฑํ•œ ๊ฐ์ฒด์˜ ๋Œ€๋ถ€๋ถ„์€ ๊ธˆ๋ฐฉ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ƒํƒœ๊ฐ€ ๋˜๊ณ , ์˜ค๋ž˜๋œ ๊ฐ์ฒด์—์„œ ์‹ ๊ทœ ๊ฐ์ฒด๋กœ์˜ ์ฐธ์กฐ๋Š” ๋งค์šฐ ์ ๊ฒŒ ์กด์žฌํ•œ๋‹ค๋Š” ๊ฐ€์„ค. +์ด ๊ฐ€์„ค์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ์ž๋ฐ”๋Š” Young ์˜์—ญ๊ณผ Old ์˜์—ญ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ถ„ํ• ํ•˜๊ณ , ์‹ ๊ทœ๋กœ ์ƒ์„ฑ๋˜๋Š” ๊ฐ์ฒด๋Š” Young ์˜์—ญ์— ๋ณด๊ด€ํ•˜๊ณ , ์˜ค๋žซ๋™์•ˆ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋Š” Old ์˜์—ญ์— ๋ณด๊ด€ํ•œ๋‹ค. +``` + +``` +Person person = new Person(); +person.setName("nyoung"); +person = null; + +// ๊ฐ€๋น„์ง€ ๋ฐœ์ƒ +person = new Person(); +person.setName("real nyoung"); +``` +**์ด ์ฝ”๋“œ์—์„œ ์ฒ˜์Œ์— ์„ ์–ธ๋œ โ€œnyoungโ€ person ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ, โ€œreal nyoungโ€ person ๊ฐ์ฒด๋กœ ๋ณ€๊ฒฝ๋˜๋ฉด์„œ heap space์— ๋‚จ์•„์žˆ์ง€๋งŒ ์•„๋ฌด๋„ ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋Š” ๊ฐ์ฒด๋กœ ๋ณ€ํ•ด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ๋Œ€์ƒ์ด ๋˜์—ˆ๋‹ค.** + + +๊ฐ€๋น„์ง€ ์ฝœ๋ ‰ํ„ฐ๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšŒ์ˆ˜ํ•˜๊ธฐ ์œ„ํ•ด ์ข…์ข… ์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ โ€œ๋ฉˆ์ถ”๊ณ โ€ ๋ฉ”๋ชจ๋ฆฌ ํšŒ์ˆ˜๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค. + +- ํšŒ์ˆ˜๋ฅผ ์œ„ํ•ด ์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฉˆ์ถ”๋Š” ๊ฑธ โ€œStop The Worldโ€ +- ํšŒ์ˆ˜ ๋Œ€์ƒ์ด ์•„๋‹Œ ๊ฑธ ํ‘œ์‹œํ•ด๋†“๋Š” ๊ฑธ โ€œMarkโ€ (์ฆ‰, ํ˜„์žฌ ์‚ฌ์šฉ ์ค‘์ธ๊ฑธ ํ‘œ์‹œ) +- ํ‘œ์‹œ ์•ˆ๋œ ๋Œ€์ƒ์„ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์—์„œ ํ•ด์ œํ•˜๋Š” ๊ฑธ โ€œSweepโ€์ด๋ผ๊ณ  ํ•œ๋‹ค. + +๊ฐ€๋น„์ง€ ์ฝœ๋ ‰ํ„ฐ์˜ Stop-The-World๋Š” ์งง์„ ์ˆ˜๋„ ๊ธธ ์ˆ˜๋„, (์‚ด์•„์žˆ๋Š” ๊ฐ์ฒด์˜ ๊ฐœ์ˆ˜์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค.) + +### ๐Ÿง ์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฉˆ์ถœ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•œ ํ•œ ๋นจ๋ฆฌ, heap space์˜ ์ ์€ ๋ฒ”์œ„๋งŒ์„ ํƒ์ƒ‰ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. +> Yong Generation ์˜์—ญ๊ณผ Old Generation ์˜์—ญ์„ ๋‚˜๋ˆ„๊ฒŒ ๋œ ์ด์œ . +Weak Generational Hypothesis๋ฅผ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด Young ์˜์—ญ๊ณผ Old ์˜์—ญ์„ ๋‚˜๋ˆ„์–ด๋†“๊ณ  ํž™ ์ „์ฒด์—์„œ Garbage Collection๋ฅผ ์ง„ํ–‰ํ•˜์ง€ ์•Š๊ณ  Young ์˜์—ญ์—์„œ๋งŒ Garbage Collection๋ฅผ ์ˆ˜ํ–‰(minor GC)ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ๋Œ€๋ถ€๋ถ„์˜ garbage๊ฐ€ ์ˆ˜๊ฑฐ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค. + +- ์„ฑ๋Šฅ ์ตœ์ ํ™”: ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด์™€ ์˜ค๋ž˜๋œ ๊ฐ์ฒด๋ฅผ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™” +- ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ์ตœ์ ํ™”: Young ์˜์—ญ์€ ์žฌ๋ฐฐ์—ด๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , Old ์˜์—ญ์€ ์˜ค๋žœ ์‹œ๊ฐ„ ๋™์•ˆ ์กด์žฌํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋ณด๊ด€ํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋กœ ๊ตฌ์„ฑ๋˜์–ด ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์ตœ์ ํ™” +- ๊ฐ์ฒด ์ˆ˜๋ช…์— ๋”ฐ๋ฅธ ์ฒ˜๋ฆฌ: ๋Œ€๋ถ€๋ถ„์˜ ๊ฐ์ฒด๋Š” ์งง์€ ์‹œ๊ฐ„ ๋™์•ˆ๋งŒ ์‚ด์•„๋‚จ๊ธฐ ๋•Œ๋ฌธ์—, Young ์˜์—ญ์€ ๋น ๋ฅด๊ฒŒ ์ •๋ฆฌํ•˜๊ณ , Old ์˜์—ญ์€ ์˜ค๋ž˜๋œ ๊ฐ์ฒด๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค. +- GC ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ํƒ: Young ์˜์—ญ๊ณผ Old ์˜์—ญ์€ ์„œ๋กœ ๋‹ค๋ฅธ GC ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์„œ, ๊ฐ์ฒด์˜ ์ˆ˜๋ช…๊ณผ ๋ฉ”๋ชจ๋ฆฌ ์ƒํƒœ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค. + + +## Generational Garbage Collection + + + +### Young ์˜์—ญ(Yong Generation ์˜์—ญ) +> ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๊ฐ€ ํ• ๋‹น๋˜๋Š” ์˜์—ญ. ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋Š” Eden ์˜์—ญ์— ํ• ๋‹น๋˜๋ฉฐ, ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋Š” S0 ๋˜๋Š” S1๋กœ ์ด๋™ํ•œ๋‹ค. +``` +eden - ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๊ฐ€ ํ• ๋‹น(Allocation)๋˜๋Š” ์˜์—ญ +survivor - ์ตœ์†Œ 1๋ฒˆ์˜ GC ์ด์ƒ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•˜๋Š” ์˜์—ญ +``` + +- ๋Œ€๋ถ€๋ถ„์˜ ๊ฐ์ฒด๊ฐ€ ๊ธˆ๋ฐฉ Unreachable ์ƒํƒœ๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ๋งŽ์€ ๊ฐ์ฒด๊ฐ€ Young ์˜์—ญ์— ์ƒ์„ฑ๋˜์—ˆ๋‹ค๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค. +- Young ์˜์—ญ์— ๋Œ€ํ•œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(Garbage Collection)์„ Minor GC๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. + + +**Young ์˜์—ญ์˜ ๋™์ž‘ ์ˆœ์„œ** + +1. ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๊ฐ€ Eden ์˜์—ญ์— ํ• ๋‹น๋œ๋‹ค. +2. ๊ฐ์ฒด๊ฐ€ ๊ณ„์† ์ƒ์„ฑ๋˜์–ด Eden ์˜์—ญ์ด ๊ฝ‰์ฐจ๊ฒŒ ๋˜๊ณ  Minor GC๊ฐ€ ์‹คํ–‰๋œ๋‹ค. + 2-1. Eden ์˜์—ญ์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•ด์ œ๋œ๋‹ค. + 2-2. Eden ์˜์—ญ์—์„œ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋Š” 1๊ฐœ์˜ Survivor ์˜์—ญ์œผ๋กœ ์ด๋™๋œ๋‹ค. +3. 1~2๋ฒˆ์˜ ๊ณผ์ •์ด ๋ฐ˜๋ณต๋˜๋‹ค๊ฐ€ Survivor ์˜์—ญ์ด ๊ฐ€๋“ ์ฐจ๊ฒŒ ๋˜๋ฉด Survivor ์˜์—ญ์˜ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฅธ Survivor ์˜์—ญ์œผ๋กœ ์ด๋™์‹œํ‚จ๋‹ค.(1๊ฐœ์˜ Survivor ์˜์—ญ์€ ๋ฐ˜๋“œ์‹œ ๋นˆ ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.) +4. ์ด๋Ÿฌํ•œ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜์—ฌ ๊ณ„์†ํ•ด์„œ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋Š” Old ์˜์—ญ์œผ๋กœ ์ด๋™(Promotion)๋œ๋‹ค. + +### Old ์˜์—ญ(Old Generation ์˜์—ญ) +> Young ์˜์—ญ์—์„œ ์ผ์ • ์‹œ๊ฐ„ ๋™์•ˆ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋“ค์ด ์ด๋™ํ•˜๋Š” ์˜์—ญ. + +- Young ์˜์—ญ์˜ ์ˆ˜๋ช…์ด ์งง์€ ๊ฐ์ฒด๋“ค์€ ํฐ ๊ณต๊ฐ„์„ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š์œผ๋ฉฐ ํฐ ๊ฐ์ฒด๋“ค์€ Young ์˜์—ญ์ด ์•„๋‹ˆ๋ผ ๋ฐ”๋กœ Old ์˜์—ญ์— ํ• ๋‹น๋˜๊ธฐ ๋•Œ๋ฌธ์— Young ์˜์—ญ๋ณด๋‹ค ํฌ๊ฒŒ ํ• ๋‹น๋˜๋ฉฐ, ์˜์—ญ์˜ ํฌ๊ธฐ๊ฐ€ ํฐ ๋งŒํผ ๊ฐ€๋น„์ง€๋Š” ์ ๊ฒŒ ๋ฐœ์ƒํ•œ๋‹ค. +- Old ์˜์—ญ์— ๋Œ€ํ•œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(Garbage Collection)์„ Major GC๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. +### Metaspace ์˜์—ญ +> Metaspace๋Š” Java 8 ์ด์ƒ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์œผ๋กœ, ํด๋ž˜์Šค ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ๋ฆฌํ”Œ๋ ‰์…˜์„ ์ง€์›ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ + +- ๊ธฐ์กด PermGen์ด๋ผ๋Š” ์˜์—ญ์œผ๋กœ, ํด๋ž˜์Šค ๋กœ๋”ฉ, ๋ฉ”์†Œ๋“œ, ์ƒ์ˆ˜ ํ’€, ์ •์  ๋ณ€์ˆ˜ ๋“ฑ์„ ์ €์žฅํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ PermGen์€ ๊ณ ์ • ํฌ๊ธฐ๋กœ ์„ค์ •๋˜์–ด ์žˆ์–ด ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋กœ ์ธํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ , Java 8 ์ด์ƒ์—์„œ๋Š” Metaspace๋กœ ๋Œ€์ฒด๋˜์—ˆ๋‹ค. +- ๋™์ ์œผ๋กœ ํฌ๊ธฐ๊ฐ€ ์กฐ์ ˆ๋˜๋ฉฐ, ํด๋ž˜์Šค ๋กœ๋”ฉ ๋ฐ ์–ธ๋กœ๋”ฉ์— ๋”ฐ๋ผ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ• ๋‹น๋˜๊ณ  ํ•ด์ œ๋œ๋‹ค. + + + +___ +๋ž˜ํผ๋Ÿฐ์Šค +https://mangkyu.tistory.com/118 +https://hoonzi-text.tistory.com/103 \ No newline at end of file