- ๊ฐ๋น์ง ์ปฌ๋ ์ (Garbage Collection, GC)์ด๋?
- ๋จ์
- ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๋์์ด ๋๋ ๊ฐ์ฒด๋ค
- Minor GC์ Major CG
- ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๋์ ๋ฐฉ์
- ๊ฐ๋น์ง ์ปฌ๋ ์ ์๊ณ ๋ฆฌ์ฆ
- ์ฐธ๊ณ ์๋ฃ
๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์๋ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๊ธฐ๋ฒ ์ค ํ๋๋ก,JVM์ ํ(Heap) ์์ญ์์ ๋์ ์ผ๋ก ํ ๋นํ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ ์ค ํ์ ์๊ฒ ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ฃผ๊ธฐ์ ์ผ๋ก ์ญ์ ํ๋ ํ๋ก์ธ์ค๋ฅผ ๋งํ๋ค.
C๋ C++์์๋ ์ด๋ฌํ ๊ฐ๋น์ง ์ปฌ๋ ์
์ด ์์ด malloc()
, free()
ํจ์ ๋ฑ์ ํตํด ๊ฐ๋ฐ์๊ฐ ์๋์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น, ํด์ ๋ฅผ ์งํํด์ผ ํ๋ ๋ฐ๋ฉด Java๋ JVM์ ํ์ฌ๋ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ๋ํํด์ฃผ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์ ์
์ฅ์์ ๋ฉ๋ชจ๋ฆฌ ๋์(Memory Leak) ๋ฌธ์ ์ ๋ํด ์๋ฒฝํ๊ฒ ๊ด๋ฆฌํ์ง ์๊ณ ๊ฐ๋ฐ์ ์ง์คํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค. ๋ฌผ๋ก Java์์๋ System.gc()
๋ฅผ ์ด์ฉํด ์๋ ํธ์ถ์ด ๊ฐ๋ฅํ์ง๋ง, ์ํํธ์จ์ด ์ฑ๋ฅ์ ํฐ ์ํฅ์ ๋ฏธ์น๋ฏ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ๋ฐ๋์งํ์ง ์๋ค.
๊ทธ๋ฌ๋ Java์ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ฅ์ ๋ฟ๋ง ์๋๋ผ ๋จ์ ์ญ์ ์กด์ฌํ๋๋ฐ, ๋ํ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ๋ค.
- ๊ฐ๋ฐ์๊ฐ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํด์ ๋๋ ์ ํํ ์์ ์ ์ ์ ์๋ค.
- ๊ฐ๋น์ง ์ปฌ๋ ์
(GC)์ด ๋์ํ๋ ๋์์๋ ๋ค๋ฅธ ๋์์ ๋ฉ์ถ๊ธฐ ๋๋ฌธ์ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ๋ค.
- ๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋ฌธ์ ๊ฐ ๋๋ ๋จ์ ์ผ๋ก, GC๊ฐ ๋๋ฌด ์์ฃผ ์คํ๋๋ฉด ์ํํธ์จ์ด ์ฑ๋ฅ ํ๋ฝ์ ์์ธ์ด ๋ ์ ์๋ค.
- ์ผ์์ ์ธ ์ง์ฐ์๋ ๋ฏผ๊ฐํ ์ค์๊ฐ ์์คํ ์์๋ GC์ ์ฌ์ฉ์ด ์ ํฉํ์ง ์์ ์ ์๋ค.
๊ฐ์ฒด๋ค์ ์ค์ค์ ์ผ๋ก ํ ์์ญ(Heap Area)์์ ์์ฑ๋๊ณ ๋ฉ์๋ ์์ญ(Method Area)์ด๋ ์คํ ์์ญ(Stack Area) ๋ฑ ๋ฃจํธ ์์ญ์์๋ ํ ์์ญ์ ์์ฑ๋ ๊ฐ์ฒด์ ์ฃผ์๋ง ์ฐธ์กฐํ๋ ํ์์ผ๋ก ๊ตฌ์ฑ๋๋ค. ํ์ง๋ง ์ด๋ ๊ฒ ์์ฑ๋ ํ ์์ญ์ ๊ฐ์ฒด๋ค์ด ๋ฉ์๋๊ฐ ์ข ๋ฃ๋๋ ๋ฑ์ ์ด๋ฒคํธ๋ค๋ก ์ธํ์ฌ ํ ์์ญ ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ฐธ์กฐ ๋ณ์๊ฐ ์ญ์ ๋๋ ํ์์ด ๋ฐ์ํ๋ฉด ์์ ๊ทธ๋ฆผ์์์ ๋นจ๊ฐ์ ๊ฐ์ฒด์ ๊ฐ์ด ํ ์์ญ์์ ์ด๋์์๋ ์ฐธ์กฐ๋์ง ์๋ ๊ฐ์ฒด๋ค์ด ๋ฐ์ํ๊ฒ ๋๋ค. ์ด๋ฌํ ๊ฐ์ฒด๋ค์ Unreachableํ๋ค๊ณ ํ๋ฉฐ, ์ฃผ๊ธฐ์ ์ผ๋ก ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ์ ๊ฑฐํด์ค๋ค.
Reachable : ๊ฐ์ฒด๊ฐ ์ฐธ์กฐ๋๊ณ ์๋ ์ํ
Unreachable : ๊ฐ์ฒด๊ฐ ์ฐธ์กฐ๋๊ณ ์์ง ์์ ์ํ (GC์ ๋์์ด ๋จ)
JVM์ ํ ์์ญ(Heap Area)์ ์ฒ์ ์ค๊ณ๋ ๋ ๋ค์์ ๋ ๊ฐ์ง๋ฅผ ์ ์ (Weak Generational Hypothesis)๋ก ์ค๊ณ๋์๋ค.
- ๋๋ถ๋ถ์ ๊ฐ์ฒด๋ ๊ธ๋ฐฉ ์ ๊ทผ ๋ถ๊ฐ๋ฅํ ์ํ(Unreachable)๊ฐ ๋๋ค.
- ์ค๋๋ ๊ฐ์ฒด์์ ์๋ก์ด ๊ฐ์ฒด๋ก์ ์ฐธ์กฐ๋ ์์ฃผ ์ ๊ฒ ์กด์ฌํ๋ค.
์ฆ, ๊ฐ์ฒด๋ ๋๋ถ๋ถ ์ผํ์ฑ์ด๋ฉฐ, ๋ฉ๋ชจ๋ฆฌ์ ์ค๋ซ๋์ ๋จ์์๋ ๊ฒฝ์ฐ๋ ๋๋ฌผ๋ค๋ ๊ฒ์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด์ ์์กด ๊ธฐ๊ฐ์ ๋ฐ๋ผ ๋ฌผ๋ฆฌ์ ์ธ ํ ์์ญ์ ๋๋๊ฒ ๋์๊ณ Young Generation, Old Generation์ ๋ ๊ฐ์ง ์์ญ์ผ๋ก ์ค๊ณ๋์๋ค. ์ด๊ธฐ์๋ Perm ์์ญ์ด ์กด์ฌํ์์ผ๋ Java8๋ถํฐ ์ ๊ฑฐ๋์๋ค.
- Young ์์ญ(Young Generation)
- ์๋กญ๊ฒ ์์ฑ๋ ๊ฐ์ฒด๊ฐ ํ ๋น(Allocation)๋๋ ์์ญ.
- ๋๋ถ๋ถ์ ๊ฐ์ฒด๊ฐ ๊ธ๋ฐฉ Unreachable ์ํ๊ฐ ๋๊ธฐ ๋๋ฌธ์, ๋ง์ ๊ฐ์ฒด๊ฐ Young ์์ญ์์ ์์ฑ๋์๋ค๊ฐ ์ฌ๋ผ์ง๋ค.
- Young ์์ญ์ ๋ํ ๊ฐ๋น์ง ์ปฌ๋ ์ (Garbage Colection)์ Minor GC๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- Old ์์ญ(Old Generation)
- Young ์์ญ์์ Reachable ์ํ๋ฅผ ์ ์งํ์ฌ ์ด์๋จ์ ๊ฐ์ฒด๊ฐ ๋ณต์ฌ๋๋ ์์ญ.
- Young ์์ญ๋ณด๋ค ํฌ๊ฒ ํ ๋น๋๋ฉฐ, ์์ญ์ ํฌ๊ธฐ๊ฐ ํฐ ๋งํผ ๊ฐ๋น์ง๋ ์ ๊ฒ ๋ฐ์ํ๋ค.
- Old ์์ญ์ ๋ํ ๊ฐ๋น์ง ์ปฌ๋ ์ (Garbage Collection)์ Major GC ๋๋ Full GC๋ผ๊ณ ๋ถ๋ฅธ๋ค.
Old ์์ญ์ด Young ์์ญ๋ณด๋ค ํฌ๊ฒ ํ ๋น๋๋ ์ด์ ๋ Young ์์ญ์ ์๋ช ์ด ์งง์ ๊ฐ์ฒด๋ค์ ํฐ ๊ณต๊ฐ์ ํ์๋ก ํ์ง ์์ผ๋ฉฐ ํฐ ๊ฐ์ฒด๋ค์ Young ์์ญ์ด ์๋๋ผ ๋ฐ๋ก Old ์์ญ์ ํ ๋น๋๊ธฐ ๋๋ฌธ์ด๋ค.
์์ธ์ ์ธ ์ํฉ์ผ๋ก Old ์์ญ์ ์๋ ๊ฐ์ฒด๊ฐ Young ์์ญ์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ๋ ์กด์ฌํ ์ ์๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ์ฌ Old ์์ญ์๋ 512 bytes์ ๋ฉ์ด๋ฆฌ(Chunk)๋ก ๋์ด ์๋ ์นด๋ ํ ์ด๋ธ(Card Table)์ด ์กด์ฌํ๋ค.
์นด๋ ํ ์ด๋ธ์๋ Old ์์ญ์ ์๋ ๊ฐ์ฒด๊ฐ Young ์ฌ์ญ์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ๋๋ง๋ค ๊ทธ์ ๋ํ ์ ๋ณด๊ฐ ํ์๋๋ค. ์นด๋ ํ ์ด๋ธ์ด ๋์ ๋ ์ด์ ๋ ๊ฐ๋จํ๋ค. Young ์์ญ์์ ๊ฐ๋น์ง ์ปฌ๋ ์ (Minor GC)์ด ์คํ๋ ๋ Old ์์ญ์ ์กด์ฌํ๋ ๋ชจ๋ ๊ฐ์ฒด๋ค์ ๊ฒ์ฌํ์ฌ ์ฐธ์กฐ๋์ง ์๋ Young ์์ญ์ ๊ฐ์ฒด๋ฅผ ์๋ณํ๋ ๊ฒ์ด ๋นํจ์จ์ ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ Young ์์ญ์์ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ด ์งํ๋ ๋ ์นด๋ ํ ์ด๋ธ๋ง ์กฐํํ์ฌ GC์ ๋์์ธ์ง๋ฅผ ์๋ณํ ์ ์๋๋ก ํ๊ณ ์๋ค.
Young ์์ญ๊ณผ Old ์์ญ์ ์๋ก ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ก ๋์ด ์๊ธฐ ๋๋ฌธ์, ์ธ๋ถ์ ์ธ ๋์ ๋ฐฉ์์ ์๋ก ๋ค๋ฅด๋ค. ํ์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ๋น์ง ์ปฌ๋ ์ ์ด ์คํ๋๋ค๊ณ ํ๋ฉด ๋ค์์ ๋ ๊ฐ์ง ๊ณตํต์ ์ธ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด๊ฒ ๋๋ค.
- Stop The World
- Stop The World๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์คํํ๊ธฐ ์ํด JVM์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํ์ ๋ฉ์ถ๋ ์์ ์ด๋ค. GC๊ฐ ์คํ๋ ๋๋ GC๋ฅผ ์คํํ๋ ์ฐ๋ ๋๋ฅผ ์ ์ธํ ๋ชจ๋ ์ฐ๋ ๋๋ค์ ์์ ์ด ์ค๋จ๋๊ณ , GC๊ฐ ์๋ฃ๋๋ฉด ์์ ์ด ์ฌ๊ฐ๋๋ค. ๋น์ฐํ ๋ชจ๋ ์ฐ๋ ๋๋ค์ ์์ ์ด ์ค๋จ๋๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฉ์ถ๊ธฐ ๋๋ฌธ์, GC์ ์ฑ๋ฅ ๊ฐ์ ์ ์ํด ํ๋์ ํ๋ค๊ณ ํ๋ฉด ๋ณดํต stop-the-world์ ์๊ฐ์ ๋จ์ถํ๋ ์์ ์ ํ๋ ๊ฒ์ด๋ค. ๋ํ JVM์์๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ค์ํ ์คํ ์ต์ ์ ์ ๊ณตํ๊ณ ์๋ค.
- Mark and Sweep
- Mark : ์ฌ์ฉ๋๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ์ฉ๋์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ณํ๋ ์์ .
- Sweep : Mark ๋จ๊ณ์์ ์ฌ์ฉ๋์ง ์์์ผ๋ก ์๋ณ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ๋ ์์ .
- Stop Thw World๋ฅผ ํตํด ๋ชจ๋ ์์ ์ ์ค๋จ์ํค๋ฉด, GC๋ ์คํ์ ๋ชจ๋ ๋ณ์ ๋๋ Reachable ๊ฐ์ฒด๋ฅผ ์ค์บํ๋ฉด์ ๊ฐ๊ฐ์ด ์ด๋ค ๊ฐ์ฒด๋ฅผ ์ฐธ๊ณ ํ๊ณ ์๋์ง๋ฅผ ํ์ํ๊ฒ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ๋๊ณ ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ณํ๋๋ฐ, ์ด๋ฌํ ๊ณผ์ ์ Mark๋ผ๊ณ ํ๋ค. ์ดํ์ Mark๊ฐ ๋์ง ์์ ๊ฐ์ฒด๋ค์ ๋ฉ๋ชจ๋ฆฌ์์ ์ ๊ฑฐํ๋๋ฐ, ์ด๋ฌํ ๊ณผ์ ์ Sweep๋ผ๊ณ ํ๋ค.
Minor GC๋ฅผ ์ ํํ ์ดํดํ๋ ค๋ฉด Young ์์ญ์ ๊ตฌ์กฐ์ ๋ํด ์ดํดํด์ผ ํ๋ค. Young ์์ญ์ 1๊ฐ์ Eden ์์ญ๊ณผ 2๊ฐ์ Survivor ์์ญ, ์ด 3๊ฐ๋ก ๋๋์ด์ง๋ค.
- Eden ์์ญ : ์๋ก ์์ฑ๋ ๊ฐ์ฒด๊ฐ ํ ๋น(Allocation)๋๋ ์์ญ.
- Survivor ์์ญ : ์ต์ 1๋ฒ ์ด์์ GC์์ ์ด์๋จ์ ๊ฐ์ฒด๊ฐ ์กด์ฌํ๋ ์์ญ.
๊ฐ์ฒด๊ฐ ์๋กญ๊ฒ ์์ฑ๋๋ฉด Young ์์ญ ์ค์์๋ Eden ์์ญ์ ํ ๋น(Alloaction)๋๋ค. ๊ทธ๋ฆฌ๊ณ Eden ์์ญ์ด ๊ฝ ์ฐจ๋ฉด Minor GC๊ฐ ๋ฐ์ํ๋๋ฐ, ์ฌ์ฉ๋์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ ํด์ ๋๊ณ ์ฌ์ ํ Eden ์์ญ์ ์กด์ฌํ๋(์ฌ์ฉ๋๋) ๊ฐ์ฒด๋ Survivor ์์ญ์ผ๋ก ์ฎ๊ฒจ์ง๋ค. Survivor ์์ญ์ ์ด 2๊ฐ์ด์ง๋ง ๋ฐ๋์ 1๊ฐ์ ์์ญ์๋ง ๋ฐ์ดํฐ๊ฐ ์กด์ฌํด์ผ ํ๋๋ฐ, Young ์์ญ์ ๋์ ์์๋ฅผ ์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
- ์๋ก ์์ฑ๋ ๊ฐ์ฒด๊ฐ Eden ์์ญ์ ํ ๋น๋๋ค.
- ๊ฐ์ฒด๊ฐ ๊ณ์ ์์ฑ๋์ด Eden ์์ญ์ด ๊ฝ ์ฐจ๊ฒ ๋๊ณ Minor GC๊ฐ ์คํ๋๋ค.
- Eden ์์ญ์์ ์ฌ์ฉ๋์ง ์๋ ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํด์ ๋๋ค.
- Eden ์์ญ์์ ์ด์๋จ์ ๊ฐ์ฒด๋ 1๊ฐ์ Survivor ์์ญ์ผ๋ก ์ด๋๋๋ค.
- 1~2๋ฒ ๊ณผ์ ์ด ๋ฐ๋ณต๋๋ค๊ฐ Survivor ์์ญ์ด ๊ฐ๋ ์ฐจ๊ฒ ๋๋ฉด Survivor ์์ญ์ ์ด์๋จ์ ๊ฐ์ฒด๋ค์ ๋ค๋ฅธ Survivor ์์ญ์ผ๋ก ์ด๋์ํจ๋ค. (1๊ฐ์ Survivor ์์ญ์ ๋ฐ๋์ ๋น ์ํ๊ฐ ๋๋ค.)
- ์ด๋ฌํ ๊ณผ์ ์ ๋ฐ๋ณตํ์ฌ ๊ณ์ํด์ ์ด์๋จ์ ๊ฐ์ฒด๋ Old ์์ญ์ผ๋ก ์ด๋(Promotion)๋๋ค.
๊ฐ์ฒด์ ์์กด ์ตฏ์๋ฅผ ์ธ๊ธฐ ์ํด Minor GC์์ ๊ฐ์ฒด๊ฐ ์ด์๋จ์ ํ์๋ฅผ ์๋ฏธํ๋ age๋ฅผ Object Header์ ๊ธฐ๋กํ๋ค. ๊ทธ๋ฆฌ๊ณ Minor GC ๋ OBejct Header์ ๊ธฐ๋ก๋ age๋ฅผ ๋ณด๊ณ Promotion ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ค.
๋ํ Survivor ์์ญ ์ค 1๊ฐ๋ ๋ฐ๋์ ์ฌ์ฉ๋์ด์ผ ํ๋ค. ๋ง์ฝ ๋ Survivor ์์ญ์ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๊ฑฐ๋, ๋ชจ๋ ์ฌ์ฉ๋์ด 0์ด๋ผ๋ฉด ํ์ฌ ์์คํ ์ด ์ ์์ ์ธ ์ํฉ์ด ์๋๋ผ๋ ๊ฒ์ ์๋ฏธํ๋ค.
์ด๋ฌํ ์งํ ๊ณผ์ ์ ๊ทธ๋ฆผ์ผ๋ก ์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
HotSpot JVM์์๋ Eden ์์ญ์ ๊ฐ์ฒด์ ๋น ๋ฅด๊ฒ ํ ๋น(Allocation)ํ๊ธฐ ์ํด bump the pointer์ TLABs(Thread-Local Allcation Buffers)๋ผ๋ ๊ธฐ์ ์ ์ฌ์ฉํ๋ค. bump the pointer๋ Eden ์์ญ์ ๋ง์ง๋ง์ผ๋ก ํ ๋น๋ ๊ฐ์ฒด์ ์ฃผ์๋ฅผ ์บ์ฑํด๋๋ ๊ฒ์ด๋ค. bump the pointer๋ฅผ ํตํด ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์ํด ์ ํจํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ํ ํ์ ์์ด ๋ง์ง๋ง ์ฃผ์์ ๋ค์ ์ฃผ์๋ฅผ ์ฌ์ฉํ๊ฒ ํจ์ผ๋ก์จ ์๋๋ฅผ ๋์ด๊ณ ์๋ค. ์ด๋ฅผ ํตํด ์๋ก์ด ๊ฐ์ฒด๋ฅผ ํ ๋นํ ๋ ๊ฐ์ฒด์ ํฌ๊ธฐ๊ฐ Eden ์์ญ์ ์ ํฉํ์ง๋ง ํ๋ณํ๋ฉด ๋๋ฏ๋ก ๋น ๋ฅด๊ฒ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ ์ ์๋ค.
์ฑ๊ธ ์ค๋ ๋ ํ๊ฒฝ์ด๋ผ๋ฉด ๋ฌธ์ ๊ฐ ์์ง๋ง ๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์ด๋ผ๋ฉด ๊ฐ์ฒด๋ฅผ Eden ์์ญ์ ํ ๋นํ ๋ ๋ฝ(Lock)์ ๊ฑธ์ด ๋๊ธฐํ๋ฅผ ํด์ฃผ์ด์ผ ํ๋ค. ๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์์์ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด HotSpot JVM์ ์ถ๊ฐ๋ก TLABs(Thread-Lock Allocation Buffers)๋ผ๋ ๊ธฐ์ ์ ๋์ ํ๋ค. TLABs๋ ๊ฐ๊ฐ์ ์ค๋ ๋๋ง๋ค Eden ์์ญ์ ๊ฐ์ฒด๋ฅผ ํ ๋นํ๊ธฐ ์ํ ์ฃผ์๋ฅผ ๋ถ์ฌํจ์ผ๋ก์จ ๋๊ธฐํ ์์ ์์ด ๋น ๋ฅด๊ฒ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋๋ก ํ๋ ๊ธฐ์ ์ด๋ค. ๊ฐ๊ฐ์ ์ค๋ ๋๋ ์์ ์ด ๊ฐ๋ ์ฃผ์์๋ง ๊ฐ์ฒด๋ฅผ ํ ๋นํจ์ผ๋ก์จ ๋๊ธฐํ ์์ด bump the pointer๋ฅผ ํตํด ๋น ๋ฅด๊ฒ ๊ฐ์ฒด๋ฅผ ํ ๋นํ๋ค.
Young ์์ญ์์ ์ค๋ ์ด์๋จ์ ๊ฐ์ฒด๋ Old ์์ญ์ผ๋ก Promotion๋จ์ ํ์ธํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ Major GC๋ ๊ฐ์ฒด๋ค์ด ๊ณ์ Promotion๋์ด Old ์์ญ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํด์ง๋ฉด ๋ฐ์ํ๋ค. Young ์์ญ์ ์ผ๋ฐ์ ์ผ๋ก Old ์์ญ๋ณด๋ค ํฌ๊ธฐ๊ฐ ์๊ธฐ ๋๋ฌธ์ GC๊ฐ ๋ณดํต 0.5~1์ด ์ฌ์ด์ ๋๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ Minor GC๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํฐ ์ํฅ์ ์ฃผ์ง ์๋๋ค. ํ์ง๋ง Old ์์ญ์ Young ์์ญ๋ณด๋ค ํฌ๋ฉฐ Young ์์ญ์ ์ฐธ์กฐํ ์๋ ์๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ Major GC๋ ์ผ๋ฐ์ ์ผ๋ก Minor GC๋ณด๋ค ์๊ฐ์ด ๋ง์ด ์์๋๋ฉฐ, 10๋ฐฐ ์ด์์ ์๊ฐ์ ์ฌ์ฉํ๋ค.
์ฌํ๊น์ง์ ๋ด์ฉ์ ์์ฝํ๋ฉด ๋ค์ ํ์ ๊ฐ๋ค.
GC ์ข ๋ฅ | Minor GC | Major GC |
---|---|---|
๋์ | Young Generation | Old Generation |
์คํ ์์ | Eden ์์ญ์ด ๊ฝ ์ฐฌ ๊ฒฝ์ฐ | Old ์์ญ์ด ๊ฝ ์ฐฌ ๊ฒฝ์ฐ |
์คํ ์๋ | ๋น ๋ฅด๋ค | ๋๋ฆฌ๋ค |
JVM์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํด์ฃผ๋ ๊ฒ์ ๊ฐ๋ฐ์์ ์ ์ฅ์์ ์๋นํ ๋งค๋ฆฌํธ์ด๋ค. ํ์ง๋ง ๋ฌธ์ ๋ GC๋ฅผ ์ํํ๊ธฐ ์ํด Stop The World๋ฅผ ์ํํ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ค์ง๋๋ค๋ ๊ฒ์ด๋ค. ํ(Heap)์ ์ฌ์ด์ฆ๊ฐ ์ปค์ง๋ฉด์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ง์ฐ(Suspend) ํ์์ด ๋๋๋ฌ์ง๊ฒ ๋์๊ณ , ์ด๋ฅผ ๋ง๊ธฐ ์ํด ๋ค์ํ ๊ฐ๋น์ง ์ปฌ๋ ์ ์๊ณ ๋ฆฌ์ฆ์ ์ง์ํ๊ณ ์๋ค.
Serial GC์ Young ์์ญ์ ์์ ์ค๋ช ํ ์๊ณ ๋ฆฌ์ฆ(Mark Sweep)๋๋ก ์ํ๋๋ค. ํ์ง๋ง Old ์์ญ์์๋ Mark Sweep Compact ์๊ณ ๋ฆฌ์ฆ์ด ์ฌ์ฉ๋๋๋ฐ, ๊ธฐ์กด์ Mark Sweep์ Compact๋ผ๋ ์์ ์ด ์ถ๊ฐ๋ ๊ฒ์ด๋ค. Compact๋ ํ ์์ญ์ ์ ๋ฆฌํ๊ธฐ ์ํ ๋จ๊ณ๋ก ์ ํจํ ๊ฐ์ฒด๋ค์ด ์ฐ์๋๊ฒ ์์ด๋๋ก ํ์ ๊ฐ์ฅ ์ ๋ถ๋ถ๋ถํฐ ์ฑ์์ ๊ฐ์ฒด๊ฐ ์กด์ฌํ๋ ๋ถ๋ถ๊ณผ ๊ฐ์ฒด๊ฐ ์กด์ฌํ์ง ์๋ ๋ถ๋ถ์ผ๋ก ๋๋๋ ๊ฒ์ด๋ค.
java -XX:+UserSerialGC -jar Application.java
Serial GC๋ ์๋ฒ์ CPU ์ฝ์ด๊ฐ 1๊ฐ์ผ ๋ ์ฌ์ฉํ๊ธฐ ์ํด ๊ฐ๋ฐ๋์์ผ๋ฉฐ, ๋ชจ๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ์์ ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด 1๊ฐ์ ์ค๋ ๋๋ง์ ์ด์ฉํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ CPU์ ์ฝ์ด๊ฐ ์ฌ๋ฌ ๊ฐ์ธ ์ด์ ์๋ฒ์์ Serial GC๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ฐ๋์ ํผํด์ผ ํ๋ค.
Parallel GC๋ Throughput GC๋ก๋ ์๋ ค์ ธ ์์ผ๋ฉฐ, ๊ธฐ๋ณธ์ ์ธ ์ฒ๋ฆฌ ๊ณผ์ ์ Serial GC์ ๋์ผํ๋ค. ํ์ง๋ง Parallel GC๋ ์ฌ๋ฌ ๊ฐ์ ์ค๋ ๋๋ฅผ ํตํด ๋ณ๋ ฌ(Parallel)์ ์ผ๋ก GC๋ฅผ ์ํํจ์ผ๋ก์จ GC์ ์ค๋ฒํค๋๋ฅผ ์๋นํ ์ค์ฌ์ค๋ค. Parallel GC๋ ๋ฉํฐ ํ๋ก์ธ์ ๋๋ ๋ฉํฐ ์ค๋ ๋ ์ฅ์น์์ ์ค๊ท๋ชจ ๋ฐ ๋๊ท๋ชจ์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํด ๊ณ ์๋์์ผ๋ฉฐ, ์ต์ ์ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ต๋ ์ง์ฐ ์๊ฐ ๋๋ GC๋ฅผ ์ํํ ์ค๋ ๋์ ๊ฐฏ์ ๋ฑ์ ์ค์ ํ ์ ์๋ค.
java -XX:+UserParallelGC - jar Application.java
//์ฌ์ฉํ ์ค๋ ๋์ ๊ฐฏ์
-XX:ParallelGCThreads=THREAD_NUM
//์ต๋ ์ง์ฐ ์๊ฐ
-XX:MaxGCPauseMillis=DELAY_TIME
Parallel GC๊ฐ GC์ ์ค๋ฒํค๋๋ฅผ ์๋นํ ์ค์ฌ์ฃผ์๊ณ , Java8๊น์ง ๊ธฐ๋ณธ ๊ฐ๋น์ง ์ปฌ๋ ํฐ(Default Garbage Collector)๋ก ์ฌ์ฉ๋์๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฉ์ถ๋ ๊ฒ์ ํผํ ์ ์์๊ณ , ์ด๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด์ ๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ์ด ์ถ๊ฐ๋ก ๋ฑ์ฅํ๊ฒ ๋๋ค.
Parallel Old GC๋ JDK5 update6๋ถํฐ ์ ๊ณตํ GC์ด๋ฉฐ, ์์ ์ค๋ช ํ Parallel GC์ ๋น๊ตํ๋ฉด Old ์์ญ์ GC ์๊ณ ๋ฆฌ์ฆ๋ง ๋ค๋ฅด๋ค. Parallel Old GC์์๋ Mark Sweep Compact๊ฐ ์๋ Mark Summary Compaction์ด ์ฌ์ฉ๋๋๋ฐ, Summary ๋จ๊ณ์์๋ ์์ GC๋ฅผ ์ํํ ์์ญ์ ๋ํด์ ๋ณ๋๋ก ์ด์์๋ ๊ฐ์ฒด๋ฅผ ์๋ณํ๋ค๋ ์ ์์ ๋ค๋ฅด๋ฉฐ ์กฐ๊ธ ๋ ๋ณต์กํ๋ค.
CMS(Concurrent Mark Sweep) GC๋ Parallel GC์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฌ๋ฌ ๊ฐ์ ์ค๋ ๋๋ฅผ ์ด์ฉํ๋ค. ํ์ง๋ง ๊ธฐ์กด์ Serial GC๋ Parallel GC์๋ ๋ฌ๋ฆฌ Mark Sweep ์๊ณ ๋ฆฌ์ฆ์ ๋์์ (Concurrent)์ผ๋ก ์ํํ๋ค.
์ด๋ฌํ CMS GC๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ง์ฐ ์๊ฐ์ ์ต์ํํ๊ธฐ ์ํด ๊ณ ์๋์์ผ๋ฉฐ, ์ ํ๋ฆฌ์ผ์ด์ ์ด ๊ตฌ๋์ค์ผ ๋ ํ๋ก์ธ์์ ์์์ ๊ณต์ ํ์ฌ ์ด์ฉ ๊ฐ๋ฅํด์ผ ํ๋ค. CMS GC๊ฐ ์ํ๋ ๋๋ ์์์ด GC๋ฅผ ์ํด์๋ ์ฌ์ฉ๋๋ฏ๋ก ์๋ต์ด ๋๋ ค์ง ์๋ ์์ง๋ง ์๋ต์ด ๋ฉ์ถ์ง๋ ์๊ฒ ๋๋ค.
ํ์ง๋ง ์ด๋ฌํ CMS GC๋ ๋ค๋ฅธ GC ๋ฐฉ์๋ณด๋ค ๋ ๋ง์ ๋ฉ๋ชจ๋ฆฌ์ CPU๋ฅผ ํ์๋ก ํ๋ฉฐ, Compaction ๋จ๊ณ๋ฅผ ์ํํ์ง ์๋๋ค๋ ๋จ์ ์ด ์๋ค. ์ด ๋๋ฌธ์ ์์คํ ์ด ์ฅ๊ธฐ์ ์ผ๋ก ์ด์๋๋ค๊ฐ ์กฐ๊ฐ๋ ๋ฉ๋ชจ๋ฆฌ๋ค์ด ๋ง์ Compaction ๋จ๊ณ๊ฐ ์ํ๋๋ฉด ์คํ๋ ค Stop The World ์๊ฐ์ด ๊ธธ์ด์ง๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
//deprecated in java9 and finally dropped in java14
java -XX:+UseConcMArkSweepGC - jar Application.java
๋ง์ฝ GC๊ฐ ์ํ๋๋ฉด์ 98% ์ด์์ ์๊ฐ์ด CMS GC์ ์์๋๊ณ , 2% ์ดํ์ ์๊ฐ์ด Heap์ ์ ๋ฆฌ์ ์ฌ์ฉ๋๋ค๋ฉด CMS GC์ ์ํด OutOfMemoryError๊ฐ ๋ฐ์ํ ๊ฒ์ด๋ค. ๋ฌผ๋ก ์ด๋ฅผ ๋นํ์ฑํํ๋ ์ต์ ์ด ์์ผ๋, CMS GC๋ Java9 ๋ฒ์ ๋ถํฐ deprecated ๋์๊ณ ๊ฒฐ๊ตญ Java14์์๋ ์ฌ์ฉ์ด ์ค์ง๋์๊ธฐ ๋๋ฌธ์ ๊ตณ์ด ์์๋ณผ ํ์๋ ์์ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
G1(Garbage First) GC๋ ์ฅ๊ธฐ์ ์ผ๋ก ๋ง์ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์๋ CMS GC๋ฅผ ๋์ฒดํ๊ธฐ ์ํด ๊ฐ๋ฐ๋์๊ณ , Java7๋ถํฐ ์ง์๋๊ธฐ ์์ํ๋ค.
๊ธฐ์กด์ GC ์๊ณ ๋ฆฌ์ฆ์์๋ ํ ์์ญ์ ๋ฌผ๋ฆฌ์ ์ผ๋ก Young ์์ญ(Eden ์์ญ, 2๊ฐ์ Survivor ์์ญ)๊ณผ Old ์์ญ์ผ๋ก ๊ตฌ๋ถํ์ฌ ์ฌ์ฉํ๋ค. G1 GC์์๋ Eden ์์ญ์ ํ ๋นํ๊ณ , Survivor๋ก ๋ณต์ฌํ๋ ๋ฑ์ ๊ณผ์ ์ ์ฌ์ฉํ์ง๋ง ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋๋์ง ์๋๋ค. ๋์ ์ง์ญ(Region)์ด๋ผ๋ ๊ฐ๋ ์ ์๋ก ๋์ ํ์ฌ ํ์ ๊ท ๋ฑํ๊ฒ ์ฌ๋ฌ ๊ฐ์ ์ง์ญ์ผ๋ก ๋๋๊ณ , ๊ฐ ์ง์ญ์ ์ญํ ๊ณผ ํจ๊ป ๋ ผ๋ฆฌ์ ์ผ๋ก ๊ตฌ๋ถํ์ฌ ๊ฐ์ฒด๋ฅผ ํ ๋นํ๋ค.
G1 GC์์๋ Eden, Survivor, Old ์ญํ ์ ๋ํด Humonogous์ Available/Unused๋ผ๋ ๋ ๊ฐ์ง ์ญํ ์ด ์ถ๊ฐ๋๋ค. Humonogous๋ ์ง์ญ์ ํฌ๊ธฐ๊ฐ 50%๋ฅผ ์ด๊ณผํ๋ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ ์ง์ญ์ ์๋ฏธํ๋ฉฐ, Available/Unused๋ ์ฌ์ฉ๋์ง ์์ ์ง์ญ์ ์๋ฏธํ๋ค.
G1 GC์ ํต์ฌ์ ํ(Heap)์ ๋์ผํ ํฌ๊ธฐ์ ์ง์ญ(Region)์ผ๋ก ๋๋๊ณ , ๊ฐ๋น์ง๊ฐ ๋ง์ ์ง์ญ์ ๋ํด ์ฐ์ ์ ์ผ๋ก GC๋ฅผ ์ํํ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ G1 GC๋ ๋ค๋ฅธ ๊ฐ๋น์ง ์ปฌ๋ ์ ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ ๊ฐ์ง GC(Minor GC, Major GC)๋ก ๋๋์ด ์ํ๋๋ค.
ํ ์ง์ญ์ ๊ฐ์ฒด๋ฅผ ํ ๋นํ๋ค๊ฐ ํด๋น ์ง์ญ์ด ๊ฝ ์ฐจ๋ฉด ๋ค๋ฅธ ์ง์ญ์ ๊ฐ์ฒด๋ฅผ ํ ๋นํ๊ณ , Minor GC๊ฐ ์คํ๋๋ค. G1 GC๋ ๊ฐ ์ง์ญ์ ์ถ์ ํ๊ณ ์๊ธฐ ๋๋ฌธ์, ๊ฐ๋น์ง๊ฐ ๊ฐ์ฅ ๋ง์(Garage First) ์ง์ญ์ ์ฐพ์์ Mark and Sweep์ ์ํํ๋ค.
Eden ์ง์ญ์์ GC๊ฐ ์ํ๋๋ฉด ์ด์๋จ์ ๊ฐ์ฒด๋ฅผ ์๋ณ(Mark)ํ๊ณ , ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์(Sweep)ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด์๋จ์ ๊ฐ์ฒด๋ฅผ ๋ค๋ฅธ ์ง์ญ์ผ๋ก ์ด๋์ํค๊ฒ ๋๋ค. ๋ณต์ ๋๋ ์ง์ญ์ด Available/Unused ์ง์ญ์ด๋ฉด ํด๋น ์ง์ญ์ ์ด์ Survivor ์์ญ์ด ๋๊ณ , Eden ์์ญ์ Available/Unused ์ง์ญ์ด ๋๋ค.
์์คํ ์ด ๊ณ์ ์ด์๋๋ค๊ฐ ๊ฐ์ฒด๊ฐ ๋๋ฌด ๋ง์ ๋น ๋ฅด๊ฒ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ํ ์ ์์ ๋ Major GC(Full GC)๊ฐ ์ํ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์ G1 GC์ ํ GC๋ค์ ์ฐจ์ด์ ์ด ๋๊ฐ์ ๋ณด์ธ๋ค.
๊ธฐ์กด์ ํ GC ์๊ณ ๋ฆฌ์ฆ๋ค์ ๋ชจ๋ ํ ์์ญ์์ GC๊ฐ ์ํ๋์์ผ๋ฉฐ, ๊ทธ์ ๋ฐ๋ผ ์ฒ๋ฆฌ ์๊ฐ์ด ์๋นํ ์ค๋ ๊ฑธ๋ ธ๋ค. ๊ทธ๋ฌ๋ G1 GC๋ ์ด๋ ์์ญ์ ๊ฐ๋น์ง๊ฐ ๋ง์์ง๋ฅผ ์๊ณ ์๊ธฐ ๋๋ฌธ์ GC๋ฅผ ์ํํ ์ง์ญ์ ์กฐํฉํ์ฌ ํด๋น ์ง์ญ์ ๋ํด์๋ง GC๋ฅผ ์ํํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ ์์ ์ ๋์์ (Concurrent)์ผ๋ก ์ํ๋๊ธฐ ๋๋ฌธ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ง์ฐ๋ ์ต์ํํ ์ ์๋ค.
๋ฌผ๋ก G1 GC๋ ํ GC ๋ฐฉ์๊ณผ ๋น๊ตํ๋ฉด ์์ฃผ ํธ์ถ๋ ๊ฒ์ด๋ค. ํ์ง๋ง ์์ ๊ท๋ชจ์ ๋ฉ๋ชจ๋ฆฌ ์ ๋ฆฌ ์์ ์ด๊ณ ๋์์ ์ผ๋ก ์ํ๋๊ธฐ ๋๋ฌธ์ ์ง์ฐ์ด ํฌ์ง ์์ผ๋ฉฐ, ๊ฐ๋น์ง๊ฐ ๋ง์ ์ง์ญ์ ๋ํด ์ ๋ฆฌ๋ฅผ ์ํํ๋ฏ๋ก ํจ์ฌ ํจ์จ์ ์ด๋ค.
java -XX:+UseG1GC -jar Application.java
์ด๋ฌํ ๊ตฌ์กฐ์ G1 GC๋ ๋น์ฐํ ์์ ์ค๋ช ํ๋ GC ๋ฐฉ์๋ค๋ณด๋ค ์ฒ๋ฆฌ ์๋๊ฐ ๋น ๋ฅด๋ฉฐ, ํฐ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์์ ๋ฉํฐ ํ๋ก์ธ์ค ๊ธฐ๋ฐ์ผ๋ก ์ด์๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํด ๊ณ ์๋์๋ค. ๋ํ G1 GC๋ ํ GC ๋ฐฉ์์ ์ฒ๋ฆฌ ์๋๋ฅผ ๋ฅ๊ฐํ๊ธฐ ๋๋ฌธ์ Java9๋ถํฐ ๊ธฐ๋ณธ ๊ฐ๋น์ง ์ปฌ๋ ํฐ(Default Garbage Collector)๋ก ์ฌ์ฉ๋๋ค.