Garbage Collection(GC)์ ์ฝ๊ฒ ๋งํ์๋ฉด ๋ฉ๋ชจ๋ฆฌ์ ์ธ๋ฐ์์ด ๊ณต๊ฐ์ ์ฐจ์งํ๊ณ ์๋ ๊ฒ๋ค์ ์ ๋ฆฌํ๋ ์์ ์ด๋ค. C์์ ๊ทธ๋ฐ ์์ ์ ๊ฐ๋ฐ์๊ฐ ์ง์ ํ๋ค.
๋ง์ฝ free()
๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ์ง ์๊ณ ๊ณ์ ๋์ ํ ๋น์ ์ํ์ํจ๋ค๋ฉด ๋ฉ๋ชจ๋ฆฌ๊ฐ ๊ฝ ์ฐจ๋ฒ๋ฆฌ๊ณ ๋ง๋ค. ๊ทธ๋ฐ๋ฐ Java ํ๋ก๊ทธ๋๋ฐ์ ํ ๋๋ ๋ฉ๋ชจ๋ฆฌ ํด์ ์์
์ ํ์ง ์๋๋ค. ์๋ฌด๋ฆฌ ๋ง์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ์ง์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ๋ ์ฝ๋๋ ์ด๋์๋ ๋ค์ด๊ฐ์ง ์๋๋ค. ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ์ ๊ฒฝ์ฐ์ง ์๊ณ ๊ฐ๋ฐ์ ํด๋ ๊ด์ฐฎ์๊ฑธ๊น? JVM์ด GC๋ฅผ ์ง์ํ๊ธฐ ๋๋ฌธ์ ๊ด์ฐฎ๋ค.
JVM Memory Structure
GC๋ฅผ ๋ค๋ฃจ๊ธฐ ์ ์ ๋จผ์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ดํด๋ด์ผ ํ๋ค. ๋ฉ๋ชจ๋ฆฌ๋ ์ ์ฅํ๋ ๋ฐ์ดํฐ์ ์ข ๋ฅ์ ๋ฐ๋ผ ํฌ๊ฒ ๋ค๊ฐ์ง ์์ญ์ผ๋ก ๋๋๋ค.
- Stack: ์ง์ญ๋ณ์, ๋ฉ์๋, ํ๋ผ๋ฏธํฐ ๋ฑ
- Heap: ๋์ ํ ๋น๋ ๋ฐ์ดํฐ
- Data: static variables
- Code: ํ๋ก๊ทธ๋จ์ ๋ฐ์ดํธ ์ฝ๋
data์ code์ ๋ค์ด๊ฐ ๋ฐ์ดํฐ๋ ๋ฐํ์ ์ค์ ์์ ๋ ์ผ์ด ์๊ธฐ ๋๋ฌธ์ ํ ์์ญ์ผ๋ก ์ทจ๊ธํ๋ ๊ฒฝ์ฐ๋ ์๋ค. ์ฌ๊ธฐ์ ์ค์ํ๊ฒ ๋ด์ผํ ๊ฒ์ stack๊ณผ heap์ด๋ค.
stack์๋ ๋ฉ์๋๋ค์ด ์์ธ๋ค. ์ ๊ทธ๋ฆผ์์๋ do()
๊ฐ ํ์ฌ ์คํ์ค์ธ ๋ฉ์๋๋ค. heap์๋ ์ค๋ธ์ ํธ๋ค์ด ์์ธ๋ค. ์ค๋ธ์ ํธ๋ ์ธ์คํด์ค ๋ณ์๋ ํด๋์ค ์ ๋ณด๋ฅผ ํฌํจํ๊ณ ์์ผ๋ฉฐ, ๋ฉ์๋์ ์ง์ญ ๋ณ์๊ฐ ์ค๋ธ์ ํธ๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋๋ค. ๊ทธ๋ฐ๋ฐ do()
์ ์ํ์ด ๋๋๋ค๋ฉด?
stack์์ do()
๊ฐ pop๋๋ฉฐ Dog1 ์ค๋ธ์ ํธ๋ฅผ ๊ฐ๋ฆฌํค๋ ์ง์ญ ๋ณ์๊ฐ ์ฌ๋ผ์ ธ๋ฒ๋ ธ๋ค. ๋ ์ด์ Dog1 ์ค๋ธ์ ํธ์ ์ ๊ทผํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋ค. ์ด๋ ๊ฒ stack์ ์ง์ญ ๋ณ์๋ก ๋ ํผ๋ฐ์ค๊ฐ ์ด์ด์ง์ง ์๋ ์ค๋ธ์ ํธ๋ garbage๊ฐ ๋๋ค. ์ด๋ ๊ฒ ๋ ํผ๋ฐ์ค๊ฐ ์๋ฉธํด์ ์ฌ์ฉํ ์ ์์ด์ง ์ค๋ธ์ ํธ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ์ ๊ฑฐํ๋ ๊ฒ์ด ๋ฐ๋ก garbage collector๊ฐ ํ๋ ์ผ์ด๋ค.
Garbage Collection Algorithms
๊ทธ๋ผ ๋ณธ๊ฒฉ์ ์ผ๋ก GC๊ฐ ์๋ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด์. ๊ฐ์ฅ ๋จผ์ ๋๋ ์๊ฐ์ ๊ทธ๋ฅ ๋ฉ์๋๊ฐ ๋๋ฌ์ ๋๋ง๋ค GC๋ฅผ ์ํํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค. ํ์ง๋ง ๊ทธ๋ ๊ฒ ํ๋ ค๋ฉด collector๊ฐ ๊ณ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ชจ๋ํฐ๋งํด์ผ ํ๊ณ , ์์๋ก GC๊ฐ ์ผ์ด๋ ์ ์๊ธฐ ๋๋ฌธ์ ํ๋ก๊ทธ๋จ์ ์๋๋ฅผ ๋จ์ด๋จ๋ฆฌ๊ณ ๋ง๋ค. ๊ทธ๋์ ๋ช๊ฐ์ง ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ด ๊ณ ์๋์๋ค.
Reference Counting
์ด ๋ฐฉ์์ ์ฃผ๊ธฐ์ ์ผ๋ก GC๋ฅผ ์ํํ ๋ ์ค๋ธ์ ํธ์ ๋ช ๊ฐ์ ๋ ํผ๋ฐ์ค๊ฐ ์ฐ๊ฒฐ๋์ด ์๋์ง ์ฒดํฌํ๋ ๋ฐฉ๋ฒ์ด๋ค.
anim
ํ๋๊ฐ Dog1 ์ค๋ธ์ ํธ๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์์ผ๋ฏ๋ก Dog1์ ์นด์ดํฐ๋ 1์ด๋ค. ์ด์ฒ๋ผ ๋ ํผ๋ฐ์ค๊ฐ ์ด์ด์ง๋ฉด ์นด์ดํฐ๋ฅผ ํ๋ ๋๋ฆฌ๊ณ , ๋ ํผ๋ฐ์ค๊ฐ ๋๊ธฐ๋ฉด ์นด์ดํฐ๋ฅผ ํ๋ ์ค์ฌ์ GC๋ฅผ ์ํํ ๋ ์นด์ดํฐ๊ฐ 0์ธ ๊ฒ๋ค๋ง ์ง์์ฃผ๋ฉด ๋๋ค. ๋งค์ฐ ์ง๊ด์ ์ด๊ณ ๊ตฌํ์ด ์ฌ์ด ๋ฐฉ๋ฒ์ด๋ค. ํ์ง๋ง ๋ฌธ์ ๊ฐ ์๋ค. ์ค๋ธ์ ํธ๊ฐ ์๋ก๋ฅผ ๊ฐ๋ฆฌํค๋ ์ํฉ์ด ์ฌ ์ ์๋ค.
์ด๋ ๊ฒ ๋ ํผ๋ฐ์ค๊ฐ ์ฌ์ดํด๋ง๋๋ฉด do()
์ ์ํ์ด ๋๋๋ Cat1์ด ์ฌ์ ํ Dog1์ ๊ฐ๋ฆฌํค๊ณ ์๊ธฐ ๋๋ฌธ์ ์นด์ดํฐ๋ 0์ด ๋์ง ์๋๋ค. ๋ฌผ๋ก ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ด ์๋ค.
Tracing
์ด๋ฆ ๊ทธ๋๋ก ์ค๋ธ์ ํธ์ ๋ ํผ๋ฐ์ค๋ฅผ ์ถ์ ํ๋ ๋ฐฉ๋ฒ์ด๋ค. ์ฒ์์๋ stack์ ์ง์ญ ๋ณ์์์ ์์ํด ํด๋น ๋ณ์๊ฐ ๊ฐ๋ฆฌํค๊ณ ์๋ ์ค๋ธ์ ํธ๋ฅผ ์ถ์ ํ๋ค. ๋ง์ฝ ์ค๋ธ์ ํธ์ ๋ ํผ๋ฐ์ค๊ฐ ์ฐ๊ฒฐ๋์ด ์๋ค๋ฉด ์ค๋ธ์ ํธ์ marked
๊ฐ์ true
๋ก ์ค์ ํ๋ค.
๋ง์ฝ ์ง์ญ ๋ณ์๋ก๋ถํฐ์ ๋ ํผ๋ฐ์ค๊ฐ ๋๊ธฐ๋ฉด ์ฐ๊ฒฐ๋ ์ค๋ธ์ ํธ๋ค์ marked
๊ฐ์ false
๋ก ์ค์ ํ๋ค. GC๋ฅผ ์ํํ ๋๋ marked
๊ฐ์ด false
์ธ ์ค๋ธ์ ํธ๋ค๋ง ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ํ๋ฉด ๋๋ค.
๊ด์ฐฎ์ ๋ณด์ธ๋ค. ๊ทธ๋ฐ๋ฐ ์ฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ ๋ ํ๊ฐ์ง ์ ๊ฒฝ์จ์ผ ํ ์ด์๊ฐ ์๋ค.
๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ๊ณ ๋๋ฉด ์ด๋ ๊ฒ ๋น ๊ณต๊ฐ์ด ์๊ธฐ๊ฒ ๋๋ค. ์ด๋ฐ ์์ผ๋ก ๋น ๊ณต๊ฐ์ด ๋์ด๋๋ฉด ์๋ก ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น ๋ ๋ ์ ํ์ ๋น์ง๊ณ ๋ค์ด๊ฐ์ผ ํ๋ ์ํฉ์ด ๋ฐ์ํ๋ฉฐ, ์ด๋ ๊ฒ ๋๋ฉด ์ ์ฒด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ถฉ๋ถํ๋ฐ ๋ค์ด๊ฐ ํ์ด ์์ด์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ์ง ๋ชปํ๋ ๋ฌธ์ ๊ฐ ์๊ธด๋ค. ๋ณ๋ก ํจ์จ์ ์ด์ง ์๋ค.
๋ฐ๋ผ์ ์ด๋ฏธ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ์ชฝ์ผ๋ก ๋ชจ์์ฃผ๋ compacting ์์ ์ ํด์ค์ผ ํ๋ค. ์ด๊ฒ๋ GC๊ณผ์ ์์ ์ํ๋๋ค. tracing๊ณผ compacting์ ์ค์ ๋ก JVM์ garbage collector๊ฐ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ฉฐ, tracing์ 'mark-and-sweepโ์ด๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค. ์, ๊ทธ๋ฐ๋ฐ GC๋ฅผ ๋ ํจ์จ์ ์ผ๋ก ์ํํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
Generational GC
์ด ๋ถ๋ถ์ด GC์ ํต์ฌ์ด๋ค. GC๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ค๋ฒํค๋๊ฐ ๋งค์ฐ ํฐ ์์ ์ด๋ค. GC๊ฐ ์ํ๋ ๋๋ JVM์ด stop-the-world๋ฅผ ๋ฐ์์ํจ๋ค. stop-the-wold๊ฐ ๋ฐ์ํ๋ฉด ํ๋ก๊ทธ๋จ์ด ๋ชจ๋ ๋ฉ์ถ๊ณ GC๋ฅผ ์ํํ๋ค. generaltional GC๋ ์์ ์ฒ๋ฆฌํด์ผ ํ๋ ์์ ๋์ ์กฐ์ ํด ์ค๋ฒํค๋๋ฅผ ์ค์ธ๋ค. ์ด ๋ฐฉ์์ ํต๊ณ์ ๊ด์ฐฐ์์ ์ถ๋ฐํ๋ค.
๋๋ถ๋ถ์ ์ค๋ธ์ ํธ๋ ์์ฑ ์ดํ ๊ธ๋ฐฉ garbage๊ฐ ๋๋ค!
๊ทธ๋ ๋ค! ์ค๋ธ์ ํธ๋ ๋ง๋ค์ด์ง์ง ์ผ๋ง๋์ง ์์ ๊ธ๋ฐฉ ๋ ํผ๋ฐ์ค๊ฐ ์ฌ๋ผ์ง๋ค. ์ด ๊ด์ฐฐ์ ํ์ฉํด GC์ ํจ์จ์ ๋์ด๊ธฐ ์ํด JVM์ heap์ ์์ญ์ ์ธ๋๋ณ๋ก ์ชผ๊ฐ ๊ด๋ฆฌํ๋ค.
eden, S0, S1์ ์์ฑ๋์ง ์ผ๋ง๋์ง ์์ ์ค๋ธ์ ํธ๋ค์ด ์์ด๋ ๊ณต๊ฐ์ด๊ธฐ ๋๋ฌธ์ young generation์ด๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ, ๋ฐ๋๋ก tenured์ permanent๋ old generation์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์์๋๋ก ์ดํด๋ณด์.
- Eden: ์๋ด๋์ฐํ ๋ ๊ทธ ์๋ด์ด๋ค. ์ค๋ธ์ ํธ๊ฐ ์ฒ์ ์์ฑ๋์ ๋ eden์ ๋ค์ด๊ฐ๋ค.
- S0, S1: ์์ฑ๋ ์ดํ ์๊ฐ์ด ์กฐ๊ธ ํ๋ ์ ๋ garbage๊ฐ ๋์ง ์์ ์ค๋ธ์ ํธ๋ค์ด eden์์ ์ด๊ณณ์ผ๋ก ์ฎ๊ฒจ์ง๋ค. ์ด์๋จ์ ์ค๋ธ์ ํธ๋ค์ด ๋ค์ด๊ฐ๋ค๊ณ ํด์ survivor space๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- Tennured: ์ค๋ ์ด์์์ ํ๋ฅ ์ด ๋์ ์ค๋ธ์ ํธ๋ค์ด ๋ค์ด๊ฐ๋ค. ์ฌ๊ธฐ์๋ ๊ฑฐ์ GC๊ฐ ์ํ๋์ง ์๊ธฐ ๋๋ฌธ์ ์ ๋ ๋ณด์ฅ์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
- Permanent: ํ๋ก๊ทธ๋จ์ด ๋๋ ๋๊น์ง ์ด์์์ ์ค๋ธ์ ํธ๋ค์ด ๋ค์ด๊ฐ๋ค.
์ด๋ ๊ฒ heap์ ๋๋ ๊ฐ ์์ญ์ ๋ํด์๋ง GC๋ฅผ ์ํํ๋ฉด ์ฑ๋ฅ์ ๋ ๋์ผ ์ ์๋ค. ๊ตฌ์ฒด์ ์ธ ์ํ ์ ์ฐจ๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ์ค๋ธ์ ํธ๊ฐ ๊ณ์ ์์ฑ๋์ด eden์ด ์ด๋์ ๋ ์ฐจ๋ฉด eden์์ GC๋ฅผ ์ํํ๋ค. ์ฌ๊ธฐ์ garbage๊ฐ ์๋ ์ค๋ธ์ ํธ๋ค์ S0๋ก ๋ณต์ฌํ๊ณ , eden์ ๋น์ด๋ค.
- eden์์ ๋ช ๋ฒ GC๊ฐ ์ด๋ค์ง๋ฉด S0์ ์ด์๋จ์ ์ค๋ธ์ ํธ๊ฐ ์์ธ๋ค. ์ด๋ ๊ฒ S0๊ฐ ๊ฐ๋์ฐจ๋ฉด eden๊ณผ S0์์ GC๋ฅผ ์ํํด garbage๊ฐ ์๋ ์ค๋ธ์ ํธ๋ค์ S1์ผ๋ก ๋ณต์ฌํ๊ณ eden๊ณผ S0๋ฅผ ๋น์ด๋ค.
- ๊ฐ์ ๋ฐฉ์์ผ๋ก S1์ด ๊ฐ๋์ฐจ๋ฉด eden๊ณผ S1์์ GC๋ฅผ ์ํํด garbage๊ฐ ์๋ ์ค๋ธ์ ํธ๋ค์ S0๋ก ๋ณต์ฌํ๊ณ eden๊ณผ S1์ ๋น์ด๋ค. ์ด๋ ๊ฒ S0์ S1์ ์๋ค๊ฐ๋ค ํ๋ฉด์ ์ฃผ๊ธฐ์ ์ผ๋ก GC๊ฐ ์ํ๋๋ค.
- ์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค๋ณด๋ฉด ์ ๋ํ ์ค๋ ์ด์๋จ๋ ์ค๋ธ์ ํธ๋ค์ด ๋์ฌ ์ ์๋ค. ๋ง์ฝ ์ค๋ธ์ ํธ์ age counter๊ฐ ์ผ์ ์ด์์ด๋ผ๋ฉด tenured๋ก ๋ณด๋ด S0์ S1์ด ๊ฐ๋์ฐจ์ง ์๋๋ก ๋ง๋ค์ด์ค๋ค.
์ค๋ธ์ ํธ๊ฐ ์ด์๋จ์ ๋ค์ ์ธ๋๋ก ๋์ด๊ฐ๋ ๊ฒ์ promote๋ผ๊ณ ํํํ๋ค. ๋ํ young generation์์ ์ผ์ด๋๋ GC๋ฅผ minor GC๋ผ๊ณ ๋ถ๋ฅด๊ณ , old generation์์ ์ผ์ด๋๋ GC๋ฅผ major GC๋ผ๊ณ ๋ถ๋ฅธ๋ค. minor GC๋ ์์ฃผ, ๋น ๋ฅด๊ฒ ์ํ๋๋ค. ๋ฐ๋๋ก major GC๋ ๊ฐ๋, ๋๋ฆฌ๊ฒ ์ํ๋๋ค.
์ด๋ ๊ฒ Java์ GC์ ๋ํด์ ๊ฐ๋จํ ์์๋ดค๋ค. ์๋์ผ๋ก ์ํ๋๋ GC๋ฅผ ๋ฏฟ์ง ์๊ณ System.gc()
๋ฉ์๋๋ฅผ ํธ์ถํด ๊ฐ๋ฐ์๊ฐ ๊ฐ์ ๋ก GC๋ฅผ ์ํํ ์๋ ์๋๋ฐ, ์ ๋ ์ฌ์ฉํ์ง ๋ง ๊ฒ์ ์ถ์ฒํ๋ค. ์ฑ๋ฅ์ ํฌ๊ฒ ๋จ์ดํธ๋ฆด ์ ์์ผ๋ฉฐ ๋งค์ฐ ๋นํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ด๋ค. ์ฌ์ง์ด ์ํํ ์๋ ์๋ค. ๊ผญ ๋ช
์์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ๊ณ ์ถ๋ค๋ฉด ์ฐจ๋ผ๋ฆฌ ์ค๋ธ์ ํธ์ null
์ ํ ๋นํด ๋ ํผ๋ฐ์ค๋ฅผ ๋๋ ๊ฒ์ด ๋์ฑ ์์ ํ๋ค.