์๋ฐ ๊ธฐ๋ฐ์ Spring Boot๋ก ๋ฐฑ์๋ ๊ฐ๋ฐ์ ํ๋ค ๋ณด๋ฉด ์ด๋ ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋๋ ค์ง๊ฑฐ๋ ์์๋ ๋๊ฒ ๋ง๋๋ OutOfMemoryError๊ฐ์ ์๋ฌ๋ฅผ ํ๋ฒ์ฉ์ ๋ดค์ ๊ฒ์ด๋ค. ์ด ๋ GC์ ๋์ ์๋ฆฌ๋ฅผ ์ ํํ ์๊ณ ์๋ค๋ฉด ๋ฌธ์ ์ ์์ธ์ ์ฐพ์ ํด๊ฒฐํ๋๋ฐ ๋ง์ ๋์์ด ๋๋ค. ์ด๋ฒ ํฌ์คํ ์์๋ ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๋ฉด์๋ ๋ง์ฐํ ์๊ณ ์๋ ๊ฐ๋น์ง ์ปฌ๋ ์ (GC)์ ๋ํด์ ์ ๋ฆฌํด ๋ณด๊ณ ์ ํ๋ค.
GC๋ฅผ ๋ฐฐ์์ผ ํ๋ ์ด์
์๋ฐ๋ฅผ ์ฒ์ ๋ฐฐ์ฐ๋ฉด ๊ฐ์ฅ ๋จผ์ ๋ฃ๋ ์ฅ์ ์ค ํ๋๊ฐ ๋ฐ๋ก “์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ”๋ค. C ์ธ์ด๋ C++๊ฐ์ ์ธ์ด์์๋ ๊ฐ๋ฐ์๊ฐ malloc()์ด๋ calloc()์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋์ ์ผ๋ก ํ ๋นํ๊ณ free()๋ก ์ง์ ๋์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํด์ผ ํ๋ค. ์ด๋ ๊ฐ๋ฐ์๊ฐ ์ค์๋ก ๋ฉ๋ชจ๋ฆฌ ํด์ ์ฝ๋๋ฅผ ๊น๋นกํ๊ฒ ๋๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ๋ ์์ธ์ด ๋ ์ ์๋ค. ํน์ ์ด๋ฏธ ํด์ ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐธ์กฐํ๋ฉด Segmentation Fault์ ํจ๊ป ํ๋ก์ธ์ค๊ฐ ์ข
๋ฃ๋๋ ๋ฌด์๋ฌด์ํ ์ผ์ ๊ฒช์ ์๋ ์๋ค. ์๋ฐ๋ ์ด๋ฌํ ์ํํ ์์
์ JVM์ GC์๊ฒ ์ผ์ํจ์ผ๋ก์จ ์๋์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ํ๋๋ก ํ์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ์กฐ๊ธ ๋ ์ง์คํ ์ ์๋๋ก ํ๋ค.
ํ์ง๋ง GC๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ๋ฆฌํ๋ ๋์ ์ ํ๋ฆฌ์ผ์ด์
์ ์ ์ ๋ฉ์ถฐ์ผ ํ๋ Stop-The-World(STW)๊ฐ ๋ฐ์ํ ์ ์๊ณ , GC๊ฐ ๋น๋ฒํ๊ฒ ๋ฐ์ํ๊ฑฐ๋ ๋๋ฌด ์ค๋ ๋๊ฒ๋๋ฉด ์ ํ๋ฆฌ์ผ์ด์
์ ์ฑ๋ฅ์ ๋ง๋ํ ์ํฅ์ ์ฃผ๊ฒ ๋๋ค.
๊ทธ๋์ ์ฐ๋ฆฌ๋ GC๊ฐ ์ธ์ , ์ด๋ป๊ฒ, ์ ๋์ํ๋์ง ์์์ผ ์ด๋ฌํ ๋ฌธ์ ์ ๋์ฒํ ์ ์๋ ๊ฒ์ด๋ค.
์ํธ๋ฐฐํ์ ์๋ฏธ
๊ฐ๋ฐ์๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ ๊ด๋ฆฌํ๊ฒ ๋๋ฉด ํ ๋น๊ณผ ํด์ ์ ์กฐ๊ธ ๋ ์ ๊ฒฝ์ ์จ์ผ ๊ฒ ์ง๋ง ์๋ฐ์ GC์ ๊ฐ์ ๋ฐฉ์์ ๋ํ ํ์ต์ ๋ ํ์ํ๊ฒ ์ง? ๋ฐ๋๋ก ์๋ฐ๋ GC๋ฅผ ํตํด ๊ฐ๋ฐ์๊ฐ ์ง์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น๊ณผ ํด์ ์ ์ ๊ฒฝ์ธ ํ์๋ ์์ง๋ง ๋ด๋ถ GC์ ๋์ ์๋ฆฌ์ ๋ํด์ ์ดํดํ๊ณ ์์ด์ผ ํ๋ ํ์ต ๊ณก์ ์ด ์๊ธด๋ค. ์ด์จ๋ ์๋ฐ๋ก ๊ฐ๋ฐ์ ํ๊ธฐ๋ก ํ ์ด์ GC๋ ํ์์ ์ผ๋ก ์์์ผ ํ ์์๋ค.
์๋ฐ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ
GC๋ฅผ ์ดํดํ๋ ค๋ฉด ๋จผ์ GC๊ฐ ํ๋ํ๋ ๋ฌด๋์ธ JVM์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์์์ผ ํ๋ค. JVM์ด ์ด์์ฒด์ ๋ก๋ถํฐ ํ ๋น ๋ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ ํฌ๊ฒ 5๊ฐ์ง ์์ญ์ผ๋ก ๋๋๋๋ฐ ์๋ ๊ทธ๋ฆผ์ Java8 ์ด์ ๋ฒ์ ์ JVM๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋ํ๋ธ๋ค.
ํ ์์ญ (Heap Area)
- ๋ชจ๋ ์ค๋ ๋๊ฐ ๊ณต์ ํ๋ ์์ญ์ด๋ค.
- new๋ก ์์ฑ๋ ๋ชจ๋ ๊ฐ์ฒด(Instance)์ ๋ฐฐ์ด์ด ์ ์ฅ๋๋ค.
- Java8 ๋ถํฐ๋ ์ ์ ๋ณ์(static variable)์ ๋ฌธ์์ด ํ(String Pool)๋ ์ด๊ณณ์ ์์ฃผํ๊ณ GC์ ์ฃผ์ ํ๊ฒ์ด ๋๋ค.
๋ฉ์๋ ์์ญ (Method Area / Metaspace)
- ๋ชจ๋ ์ค๋ ๋๊ฐ ๊ณต์ ํ๋ ์์ญ์ด๋ค.
- ํด๋์ค ์ด๋ฆ, ๋ถ๋ชจ ํด๋์ค ์ด๋ฆ, ๋ฉ์๋ ์ ๋ณด, ๋ฐ์ดํธ์ฝ๋๋ฑ ํด๋์ค ๋ฉํ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ค.
- Java8 ๋ถํฐ๋ Metaspace๋ผ๋ ์ด๋ฆ์ผ๋ก ๋ถ๋ฆฌ๋ฉฐ JVM ํ์ด ์๋ OS์ ๋ค์ดํฐ๋ธ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค.
์คํ (Stack Area)
- ๊ฐ ์ค๋ ๋๋ง๋ค ๋ณ๋๋ก ์์ฑ๋๋ค. (๊ณต์ ์ ๋จ)
- ๋ฉ์๋ ์คํ์ ํ์ํ ์ง์ญ๋ณ์, ๋งค๊ฐ๋ณ์, ๋ฆฌํด ๊ฐ๋ฑ์ด ์์๋ก ์ ์ฅ๋๋ค.
- ๋ฉ์๋ ์ํ์ด ๋๋๋ฉด ์ฆ์ ์ญ์ ๋์ด ๊นจ๋ํ๊ฒ ๊ด๋ฆฌ๋๋ค. GC์ ๋์์ด ์๋๋ค.
PC ๋ ์ง์คํฐ
- ๊ฐ ์ค๋ ๋๋ง๋ค ์กด์ฌํ๋ค.
- ํ์ฌ ์ค๋ ๋๊ฐ ์คํ ์ค์ธ JVM๋ช ๋ น(Instruction)์ ์ฃผ์๋ฅผ ๊ธฐ๋กํ๋ค.
- CPU์ ๋ ์ง์คํฐ์ ์ ์ฌํ๊ฒ ๋ค์์ ์คํํ ์ฝ๋ ๋ผ์ธ์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ ์ญํ ์ ํ๋ค.
๋ค์ดํฐ๋ธ ๋ฉ์๋ ์คํ
- ๊ฐ ์ค๋ ๋๋ง๋ค ์กด์ฌํ๋ค.
- ์๋ฐ๊ฐ ์๋ ๋ค๋ฅธ ์ธ์ด(C, C++๋ฑ)์ผ๋ก ๊ฐ๋ฐ๋ ๋ค์ดํฐ๋ธ ์ฝ๋๋ฅผ ์คํํ ๋ ์ฌ์ฉํ๋ ์คํ์ด๋ค.
- JNI๋ฅผ ํตํด ํธ์ถ๋๋ ๋ฉ์๋๋ฅผ ์ํ ๊ณต๊ฐ์ด๋ค. ๋ค์ดํฐ๋ธ ์์ญ์ด๋ผ GC์ ๋์์ด ์๋๋ค.
์ด 5๊ฐ์ง ์์ญ ์ค์์ ํนํ ํ(Heap)๊ณผ ์คํ(Stack) ์์ญ์ ์ํธ์์ฉ์ด ์๋ฐ ํ๋ก๊ทธ๋๋ฐ์ ํต์ฌ์ด๋ผ๊ณ ํ ์ ์๋ค.
๋ฉ์๋ ์์ญ PermGen์์ Metaspace๋ก ์งํ
์๋ฐ8 ์ด์ ๊ณผ ์ดํ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ์ ๋ณํ๊ฐ ์์๋๋ฐ ์ฃผ์ ๋ณํ๋ ๋ค์๊ณผ ๊ฐ๋ค.
- Java8 ์ด์ (PermGen)
- ํด๋์ค ๋ฉํ๋ฐ์ดํฐ(ํด๋์ค ์ด๋ฆ, ๋ฉ์๋ ์ ๋ณด๋ฑ)์ ์ ์ ๋ณ์, ์์ ํ ๋ฑ์ด PermGen์ด๋ผ๋ ์์ญ์ ์ ์ฅ๋์๋ค.
- PermGen์ ํ์ ์ผ๋ถ์ฒ๋ผ ๊ด๋ฆฌ๋๊ณ ํฌ๊ธฐ๊ฐ ๊ณ ์ ์ด๋ผ์ ์ ์ ๋ณ์๋ฅผ ๋๋ฌด ๋ง์ด ์ฐ๊ฑฐ๋ ํด๋์ค๋ฅผ ๋ง์ด ๋ก๋ฉํ๋ฉด OutOfMemoryError ์๋ฌ๊ฐ ๋ฐ์ํ์ฌ ๊ฝค๋ ๊ณจ์นซ๊ฑฐ๋ฆฌ์๋ค.
- Java8 ์ดํ (Metaspace)
- ๊ธฐ์กด์ PermGen์ ์ ์ฅ๋๋ ํด๋์ค ๋ฉํ๋ฐ์ดํฐ ์ ๋ณด๊ฐ ์ด๊ณณ์ ์ ์ฅ๋๋ค.
- PermGen์ด ์ฌ๋ผ์ง๊ณ Metaspace๊ฐ ๋ฑ์ฅํ๋ค.
- Metaspace๋ JVM์ ํ ์์ญ์ด ์๋ OS์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋๋ฐ RAM์ด ํ์ฉํ๋ ํ ํฌ๊ธฐ๊ฐ ๋์ ์ผ๋ก ๋์ด๋ ์ ์๊ธฐ ๋๋ฌธ์ ๋ก๋ฉ๋๋ ํด๋์ค๊ฐ ๋ง๋๋ผ๋ OutofMemoryError ๋ฐ์ ์ํ์ ํฌ๊ฒ ์ค์ผ ์ ์๋ค.
ํด๋์ค ๋ฉํ ์ ๋ณด ์ด์ธ์ ์ ์ ๋ณ์์ ์์ ํ ๋ฐ์ดํฐ๋ Heap ์์ญ์ผ๋ก ์ด๋๋์ด ๊ณผ๊ฑฐ์ PermGen์์ GC๊ฐ ์ ์๋๋ ๋ถ๋ถ์ ๋ ๋ช ํํ GC ๊ด๋ฆฌ ๋์์ผ๋ก ์ด์ ์ ํ๋ค.
๊ฐ๋น์ง ์ปฌ๋ ํฐ(GC)์ ๋์ ์๋ฆฌ
์ด์ GC๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง ์ดํด๋ณด์. GC๊ฐ ํ๋ ์ผ์ ๋จ์ํ๊ฒ ์๊ฐํ๋ฉด ์ฐ๋ ๊ธฐ ์ฐพ๊ธฐ์ ๋ฒ๋ฆฌ๊ธฐ๋ค.
Reachability: ๋ฌด์์ด ์ฐ๋ ๊ธฐ์ง?
GC๋ ์ด๋ค ๊ฐ์ฒด๋ฅผ ์ญ์ ํด์ผ ํ ์ง ์ด๋ป๊ฒ ํ๋จํ ๊น? ์๋ฐ๋ ๋๋ฌ ๊ฐ๋ฅ์ฑ(Reachability)๋ผ๋ ๊ฐ๋ ์ ์ฌ์ฉํ๋ค.
- Reachable: ๋๊ตฐ๊ฐ ์์ ์ ์ฐธ์กฐํ๊ณ ์์ด์ ์ ํจํ ์ํ
- Unreachable: ์๋ฌด๋ ์์ ์ ์ฐธ์กฐํ๊ณ ์์ง ์์์ ์ฐ๋ ๊ธฐ๋ก ์ ๋ฝํ ์ํ – ์๊ฑฐ ๋์ (Garbage)
๊ทธ๋ ๋ค๋ฉด “์ฐธ์กฐํ๊ณ ์๋ค”๋ ๊ฑด ์ด๋์๋ถํฐ ์ฐธ์กฐ๋ฅผ ๋งํ๋ ๊ฑธ๊น? ๊ทธ ์์์ ์ด ๋๋ ๊ฐ์ฒด๋ค์ GC Root์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. GC Root์์ ์์ํด์ ์ฐธ์กฐ ์ฐ๊ฒฐ์ด ์ด์ด์ง๋ ๊ฐ์ฒด๋ ์ด๋ ค๋๊ณ ์ด์ด์ง์ง ์๋ ๊ฐ์ฒด๋ ๋ฒ๋ฆฐ๋ค.
๋ํ์ ์ธ GC Root
- ์คํ(Stack)์ ์ง์ญ ๋ณ์ ๋ฐ ๋งค๊ฐ๋ณ์: ํ์ฌ ์คํ ์ค์ธ ๋ฉ์๋ ์์์ ์ฌ์ฉ ์ค์ธ ๋ณ์๋ค์ด ๊ฐ๋ฆฌํค๋ ๊ฐ์ฒด๋ ๋น์ฐํ ์ด๋ ค์ผ ํ๋ค.
- ํ์ฑ ์ค๋ ๋(Active Thread): ์คํ ์ค์ธ ์ค๋ ๋ ์์ฒด๋ ๋ฃจํธ๊ฐ ๋๋ค.
- ์ ์ ๋ณ์(Static Variable): ํด๋์ค์ static ํ๋์์ ์ฐธ์กฐํ๋ ๊ฐ์ฒด๋ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋๋ ๋๊น์ง ์ด์์์ด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
- JNI ์ฐธ์กฐ: C/C++ ๊ฐ์ ๋ค์ดํฐ๋ธ ์ฝ๋์์ ๋ง๋ ๊ฐ์ฒด ์ฐธ์กฐ๋ค.
GC Root๊ฐ ๋ ์ ์๋ ๊ฒ๋ค์ ๋๋ถ๋ถ ํ ์์ญ ๋ฐ์ ์๋ ์กด์ฌ๋ค์ด๋ค. ํ ๋ฐ์์ ํ ์์ ๊ฐ๋ฆฌํค๋ ํ์ดํ๊ฐ ๋ฐ๋ก ์๋ช ์ค์ด๋ค.
Mark-and-Sweep
GC๋ ๊ธฐ๋ณธ์ ์ผ๋ก Mark-and-Sweep ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋๋ฐ ๊ฐ๋ ์ ๋ค์๊ณผ ๊ฐ๋ค.
- Mark(ํ์ํ๊ธฐ): GC๋ ๋ชจ๋ GC Root์์ ์์ํด์ ์ฐธ์กฐ๋ ๊ฐ์ฒด๋ค์ ์ญ ์ดํด๋ณธ๋ค. ์ฐธ์กฐ๊ฐ ์ ์ง๋๋ ๊ฐ์ฒด๋ ๋งํฌ๋ฅผ ํด๋๋ค.
- Sweep(์ธ์ด๋ด๊ธฐ): ํ ๋ฉ๋ชจ๋ฆฌ ์ ์ฒด๋ฅผ ํ์ผ๋ฉด์ ๋งํฌ๊ฐ ์๋ ๊ฐ์ฒด๋ค์ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ํ๋ค.
- Compact(์์ถํ๊ธฐ): ์ค๊ฐ์ค๊ฐ์ ํด์ ๋ ๋ฉ๋ชจ๋ฆฌ ๋๋ฌธ์ ๋น๊ณต๊ฐ์ด ์๊ธฐ๋ ์ด๋ฅธ๋ฐ ๋ฉ๋ชจ๋ฆฌ ํํธํ๊ฐ ๋ฐ์ํ๋๋ฐ ํํธํ๊ฐ ์ฌํ ์๋ก ์ฌ์ด์ฆ๊ฐ ํฐ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๋ ์๋ฆฌ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์๋ค. ๊ทธ๋์ ์์กดํ ๊ฐ์ฒด๋ค์ ํ์ชฝ์ผ๋ก ๋ชจ์์ ๋น ๊ณต๊ฐ์ ํฌ๊ฒ ํ๋ณดํ๋ ์์ ์ ๋งํ๋ค.
Stop-The-World (STW)
GC๊ฐ ์ด์ฌํ ์ฒญ์๋ฅผ ํ๋ ๋์ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ชจ๋ ์ค๋ ๋๋ ์ผ์ ์ ์งํ๋ค. ์๋ง๊ฐ ๋ฐฉ์ ์ฒญ์ํ๊ณ ์๋๋ฐ ์์ด๊ฐ ๊ณ์ ์ด์ง๋ฝํ๋ฉด ์ ๋ฆฌ๊ฐ ์๋๋ค๊ณ ์๊ฐํ๋ฉด ์ฝ๋ค. GC๊ฐ ๊ฐ์ฒด์ ์์กด ์ฌ๋ถ๋ฅผ ํ๋จํ๊ณ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฎ๊ธฐ๋ ์ค์(Compaction) ์ ํ๋ฆฌ์ผ์ด์
์ด ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ฑฐ๋ ์ฐธ์กฐ๋ฅผ ๋ฐ๊พธ๋ฉด ๊ผฌ์ผ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ฐ๋ฆฌ๊ฐ ํํ ๋งํ๋ GC ํ๋์ด ๋ฐ๋ก ์ด STW ์๊ฐ์ ์ค์ฌ ๋ชจ๋ ์ค๋ ๋๊ฐ ๋ฉ์ถ๋ ์๊ฐ์ ์ต์ํํ๊ธฐ ์ํ ๋
ธ๋ ฅ์ธ ๊ฒ์ด๋ค.
๊ฐ๋น์ง ์ปฌ๋ ์ (GC) ๋งค์นด๋์ฆ
์ด์ ์กฐ๊ธ ๋ ๊น๊ฒ GC์ ๋์์ ๋ํด์ ์ดํด๋ณด์. ์๋ฐ๋ ํจ์จ์ ์ธ GC๋ฅผ ์ํด ๋ค์๊ณผ ๊ฐ์ ์ ์ ๋ฅผ ๋๊ณ ์๋ํ๋ค.
- ๋๋ถ๋ถ์ ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ๋ ์งง์ ๊ฒ์ด๋ค. (๋๋ถ๋ถ์ ๊ฐ์ฒด๊ฐ ์ฐธ์กฐ๋ ์ดํ ๊ธ๋ฐฉ Unreachable ์ํ๊ฐ ๋ ๊ฒ์ด๋ค.)
- ์ค๋๋ ๊ฐ์ฒด์์ ์๋ก์ด ๊ฐ์ฒด๋ก์ ์ฐธ์กฐ๋ ๋งค์ฐ ์ ๊ฒ ๋ฐ์ํ ๊ฒ์ด๋ค.
์ฝ๊ฒ ๋งํด ์ฐ๋ฆฌ๊ฐ for๋ฌธ ์์์ ๋ง๋๋ ์์ ๋ณ์๋ DTO ๊ฐ์ ๊ฒ๋ค์ ์ ๊น ์ฐ์ด๊ณ ๋ฐ๋ก ๋ฒ๋ ค์ง ๊ฒ์ด๋ค. ๊ทธ๋์ JVM์ ํ์ Young Generation๊ณผ Old Generation์ผ๋ก ๋๋์ด ๊ด๋ฆฌํ๋ค.
Young Generation ์์ญ
Young Generation ์์ญ์ 3๊ฐ์ ๊ตฌ์ญ์ผ๋ก ๋๋๋ค.
- Eden: ๊ฐ์ฒด๊ฐ ์ฒ์ ์์ฑ๋๋ฉด ์์ฃผํ๋ ๊ณณ์ด๋ค. (ํ์ด๋๋ ๊ณณ)
- Survivor0 (S0) & Survivor1 (S1): Eden์์ ์ด์๋จ์ ๊ฐ์ฒด๋ค์ด ์ฎ๊ฒจ์ง๋ ๊ณณ์ด๋ค.
Eden ์์ญ์ด ๋ชจ๋ ์ฐจ๋ฉด Minor GC๊ฐ ์ผ์ด๋๋๋ฐ Minor GC์ ๋ชฉ์ ์ Young Generation ์์ญ(Eden + S0 + S1) ์ ์ฒด๋ฅผ ์ฒญ์ํ๋ ๊ฒ์ด๋ค. ์ ํ๋ฆฌ์ผ์ด์
๊ตฌ๋ ํ GC๊ฐ ์ฒ์ ์ผ์ด๋ ๋ Young Generation์ ๋์๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
์ฒ์ GC๊ฐ ๋ฐ์ํ ๋๋ S0, S1 ์์ญ์๋ ๊ฐ์ฒด๊ฐ ์๊ธฐ ๋๋ฌธ์ S0, S1 ์์ญ์ ๋ณด์ง ์์ ๊ฒ์ด๋ค.
- ์๋ก ํ์ด๋ ๊ฐ์ฒด๋ ๋ฌด์กฐ๊ฑด Eden ์์ญ์ ์์ฃผํ๋ค.
- Eden์ด ๋ชจ๋ ์ฐจ๋ฉด Minor GC๊ฐ ๋ฐ์ํ๋ค.
- Eden์ ์๋ ๊ฐ์ฒด ์ค reachableํ ๊ฐ์ฒด๋ง ๊ณจ๋ผ์ ๋น์ด์๋ S0 ์์ญ์ผ๋ก ๋ณต์ฌํ๋ค.
- S0์ผ๋ก ์ด๋ํ ๊ฐ์ฒด์ Age๋ฅผ ์ฆ๊ฐ์ํจ๋ค.
- Eden์ ๋๋จธ์ง ์ฐ๋ ๊ธฐ(unreachable) ๊ฐ์ฒด๋ค์ ์น ์ ๋ฆฌํ๋ค.
๋ค์ GC๋ถํฐ๋ Young Generation์ ๋ค์๊ณผ ๊ฐ์ด ๋์ํ๋ค.
- Eden ์์ญ๊ณผ S0 ์์ญ์ ๋ชจ๋ reachableํ ๊ฐ์ฒด๋ฅผ S1์ผ๋ก ์ด๋์ํจ๋ค.
- S1์ผ๋ก ์ด๋ํ ๊ฐ์ฒด์ Age๋ฅผ ์ฆ๊ฐ์ํจ๋ค.
- Eden ์์ญ๊ณผ S0 ์์ญ์ ๋ชจ๋ ์ฐ๋ ๊ธฐ(unreachable) ๊ฐ์ฒด๋ค์ ์ ๋ฆฌํ๋ค.
- ๋ค์ Minor GC์์ Eden๊ณผ S1์ ๋ชจ๋ reachableํ ๊ฐ์ฒด๋ฅผ S0๋ก ์ด๋์ํจ๋ค.
- S0์ผ๋ก ์ด๋ํ ๊ฐ์ฒด์ Age๋ฅผ ์ฆ๊ฐ์ํจ๋ค.
์์ ๊ฐ์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ฉด์ ์ด์๋จ์ ๊ฐ์ฒด๋ค์ S0์ S1์ ๋ฐ๋ณต์ ์ผ๋ก ์ด๋ํ๊ฒ ๋๊ณ ๊ทธ ๋๋ง๋ค Age๊ฐ ์ฆ๊ฐ ๋๋ค.
์ด๋ ์ ๋ ๋์ด(Age)๋ฅผ ๋จน์ ๊ฐ์ฒด๋ค์ ํน์ ๊ฐ์ ๋์ด์๋ ์๊ฐ Old ์ธ๋๊ฐ ๋๋ค.
S0์ S1์ ๋ฐ๋ณต์ ์ผ๋ก ์ด๋ํ๋ฉด์ ํ์ชฝ Survivor ์์ญ์ ๋น์ฐ๋ ์ด์ ๊ฐ ๋ฐ๋ก ํํธํ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํ ๊ฒ์ด๋ค.
Old Generation ์์ญ
Young ์์ญ์์ ์ค๋ซ๋์ ์ด์๋จ์ ๊ฐ์ฒด๋ค์ ๋์ด(Age)๊ฐ ๊ธฐ์ค์ ๋๊ธฐ๋ฉด Old Generation ์์ญ์ผ๋ก ์ด๋ํ๊ฒ ๋๋ค. ์ด๊ฒ์ Promotion(์น๊ธ)์ด๋ผ๊ณ ํ๋ฉฐ Old ์์ญ์ Young ์์ญ๋ณด๋ค ํฌ๊ธฐ๊ฐ ํฌ๋ค. ๋ง์ฝ Old Generation์ด ๊ฐ๋ ์ฐจ๊ฒ๋๋ฉด Major GC ํน์ Full GC๊ฐ ๋ฐ์ํ๋๋ฐ Major GC๋ ํ ์ ์ฒด๋ฅผ ์ฒญ์ํ๊ณ Minor GC๋ณด๋ค STW ์๊ฐ์ด ๋ ๊ธธ๋ค. ์์ ์ ์ ๋ฅผ ํตํด ๋ดค์ ๋ Major GC๊ฐ ์์ฃผ ๋ฐ์ํ๋ค๋ ๊ฒ์ ์ฌ๊ฐํ ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฉฐ ์ด๋์ ๊ฐ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ๊ณ ์์์ ์์ฌํด ๋ด์ผ ํ๋ค.
Promotion: ์น๊ธ ์กฐ๊ฑด๊ณผ MaxTenuringThreshold
๊ฐ์ฒด๊ฐ Old ์์ญ์ผ๋ก ๊ฐ๊ธฐ ์ํ ๋์ด ๊ธฐ์ค ๊ฐ์ MaxTenuringThreshold ๋ผ๋ ์ต์ ์ผ๋ก ๊ฒฐ์ ๋๋ค.
- ๊ธฐ๋ณธ๊ฐ: ๋ณดํต 15์ด๊ณ Minor GC๋ฅผ 15๋ฒ ๋ฒํ จ์ผ Old ์์ญ์ผ๋ก ๊ฐ ์๊ฒฉ์ด ์ฃผ์ด์ง๋ค.
- ๋์ ์กฐ์ : JVM์ ์ํฉ์ ๋ฐ๋ผ ์ด ๊ฐ์ ์ ๋์ ์ผ๋ก ์ค์ด๊ธฐ๋ ํ๋ค. ๋ง์ฝ Survivor ์์ญ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ๋ฉด ๋์ด๊ฐ 15๊ฐ ์๋๋๋ผ๋ Old ์์ญ์ผ๋ก ๋ณด๋ผ ์ ์๋ค.

New ๋ผ๊ณ ํ์๋ ์๋ก์ด ๊ฐ์ฒด๋ค์ด Young Generation๋ด์ Eden ์์ญ์ผ๋ก ๋ค์ด์ ์์ธ๋ค. Survivor0(S0), Survivor(S1), Old Generation์์ญ์ ์์ง ๋น์ด์๋ ์ํ๋ค.

Eden ์์ญ์ด ๊ฐ์ฒด๋ก ๊ฐ๋์ฐจ๋ฉด Minor GC๊ฐ ๋ฐ์ํ๋ค. ์ด๋ ์ฌ์ฉ๋์ง ์๋ ๊ฐ์ฒด๋ ์ ๊ฑฐ๋๊ณ ์ด์์๋ ๊ฐ์ฒด๋ Survivor ์์ญ (์ฌ๊ธฐ์๋ S0)์ผ๋ก ์ด๋ํ๋ฉด ๋์ด(Age)๊ฐ 1 ์ฆ๊ฐํ๋ค.

Survivor ์์ญ์์ ์ฌ๋ฌ ๋ฒ์ Minor GC๋ฅผ ๊ฑฐ์น๋ฉฐ ์ด์๋จ์ ํน์ ๋์ด์ ๋๋ฌํ ๊ฐ์ฒด๋ค์ Old Generation์ผ๋ก ์ด๋ํ๋ค. (Promotion)

Old Generation์ด ๊ฐ๋ ์ฐฌ ์ํ์์ Major GC๊ฐ ๋ฐ์ํ๋ค. ์ฌ์ฉ๋์ง ์๋ ๊ฐ์ฒด๋ค์ ์ ๊ฑฐ๋๊ณ (ํ๋ฆฐ ํํ) ์ด์๋จ์ ๊ฐ์ฒด๋ค์ ํ์ชฝ์ผ๋ก ๋ชจ์ฌ ์์ถํ๋ค. ์ด ๊ณผ์ ์ Old Generation์ ๊ณต๊ฐ์ ํจ์จ์ ์ผ๋ก ํ๋ณดํ๋ค.
๋ค์ํ GC ์๊ณ ๋ฆฌ์ฆ
์๋ฐ๋ ์ฌ์ฉ ํ๊ฒฝ์ ๋ง์ถฐ ๋ค์ํ GC ์๊ณ ๋ฆฌ์ฆ์ ์ ๊ณตํ๋ค. ์ํฉ์ ๋ง๋ ๋๊ตฌ๋ฅผ ์ ํํ๋ ๊ฒ์ด ์ฑ๋ฅ ์ต์ ํ์ ์ง๋ฆ๊ธธ์ด ๋ ์ ์๋ค.
Serial GC & Parallel GC
- Serial GC (-XX: +UseSerialGC)
- GC ์ค๋ ๋๊ฐ ๋ฑ 1๊ฐ๋ค.
- ๊ตฌ์กฐ๊ฐ ๋จ์ํ์ง๋ง GC๊ฐ ์ผ์ด๋๋ ๋์ STW ์๊ฐ์ด ๊ธธ๋ค. (์ฒญ์๋ถ๊ฐ 1๋ช ์ด๋ผ ์ฒญ์ํ๋ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆผ)
- CPU ์ฝ์ด๊ฐ 1๊ฐ์ธ ํ๊ฒฝ์ด๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์์ฃผ ์ ์ ๊ฒฝ์ฐ์ ์ ํฉํ๋ค.
- ์น ์๋ฒ์ ๊ฐ์ด ์๋ง์ ์์ฒญ์ ๋์์ ์ฒ๋ฆฌํด์ผ ํ๋ ํ๊ฒฝ์ด ์๋ ํผ์ ๋์๊ฐ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ ์ ๊น ์คํ๋๊ณ ์ข ๋ฃ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๊ฐ์ด ๋จ๋ฐ์ฑ CLIํด์ด๋ ๋ฐฐ์น ํ๋ก์ธ์ค์์ ์ฌ์ฉํ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค.
- Parallel GC (-XX: +UseParallelGC)
- Java8์ ๋ํดํธ GC๋ค.
- Young ์์ญ์ GC ์์ ์ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํ๋ค. (Old ์์ญ์ ์ค์ ์ ๋ฐ๋ผ ๋ค๋ฆ)
- ์ฒ๋ฆฌ๋์ ์ค์ํ๋ ๋ฐฐ์น ์์ ์ด๋ ๋ฐ์ดํฐ ๋ถ์ ์์ ์ ์ ๋ฆฌํ๋ค.
CMS GC (-XX: +UseConcMarkSweepGC)
- STW ์๊ฐ์ ์ต์ํํ๊ธฐ ์ํด ์ ํ๋ฆฌ์ผ์ด์ ์คํ ์ค์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ GC ์์ ์ ๋์์ ์ํํ๋ค.
- ํ์ง๋ง CPU ์๋ชจ๊ฐ ๋ง๊ณ ๋ฉ๋ชจ๋ฆฌ ํํธํ๊ฐ ์์ฃผ ๋ฐ์ํ๋ค๋ ๋จ์ ์ด ์๋ค.
- Java9 ๋ถํฐ๋ Deprecated ๋์๊ณ , Java14์์ ์์ ํ ์ญ์ ๋๋ค.
G1(Garbage First) GC (-XX: +UseG1GC)
- ํ ์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๊ณ ์๋ GC ์๊ณ ๋ฆฌ์ฆ ์ด๋ค.
- Java9 ๋ถํฐ ํ์ฌ(Java25) ๊น์ง ๊ธฐ๋ณธ GC๋ก ์ฌ์ฉ๋๊ณ ์๋ค.
- ์ด์ ์ฒ๋ผ ํ์ ๋ฌผ๋ฆฌ์ ์ธ Young/Old ์์ญ์ผ๋ก ๋๋์ง ์๊ณ Region์ด๋ผ๋ ์์ ์ฌ๊ฐํ ๋ธ๋ก๋ค๋ก ๋ฐ๋ํ์ฒ๋ผ ์ชผ๊ฐ ๊ฒ์ด ํน์ง์ด๋ค.
- ๊ฐ Region์๊ฒ Young์ด๋ Old ์ญํ ์ ๋์ ์ผ๋ก ๋ถ์ฌํ๋ค.
- ์ด๋ฆ ์ฒ๋ผ Garbage๊ฐ ๋ง์ Region์ ๋จผ์ (First) ์ฒญ์ํ์ฌ ํจ์จ์ด ๋งค์ฐ ์ข๋ค.
- ๋์ฉ๋ ๋ฉ๋ชจ๋ฆฌ์์๋ ์์ธก ๊ฐ๋ฅํ ์งง์ ์ค๋จ ์๊ฐ์ ์ ๊ณตํ์ฌ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ฐ์ฅ ๊ถ์ฅ๋๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
- Eden์ ๋ ๋๋ฆฌ๋ฉด ๋ค์ GC์์ Survivor / Promotion์ ๊ฐ๋นํ ์ ์๋ค๊ณ ํ๋จ๋ ๋ GC๊ฐ ๋ฐ์ํ๋ค.
- Young GC๊ฐ ๋ฐ์ํ๋ค๊ฐ Old ์์ญ์ด ์ด๋์ ๋ ์์ด๋ฉด Mixed GC๊ฐ ๋ฐ์ํ๋ค.
Region์ ํฌ๊ธฐ
G1GC์ Region์ ํฌ๊ธฐ๋ ๊ณ ์ ๋ ํฌ๊ธฐ๊ฐ ์๋ ํ ํฌ๊ธฐ์ ๋ฐ๋ผ ์๋์ผ๋ก ๊ฒฐ์ ๋๋ค.
- 2048๊ฐ์ ๋ฒ์น
- JVM์ ์์ํ ๋ ์ ์ฒด ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฝ 2048๊ฐ์ Region์ผ๋ก ๋๋๋ ค๊ณ ์๋ํ๋ค.
(Region Size = Total Heap Size / 2048)
- JVM์ ์์ํ ๋ ์ ์ฒด ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฝ 2048๊ฐ์ Region์ผ๋ก ๋๋๋ ค๊ณ ์๋ํ๋ค.
- ๋ฒ์์ ์ ํ
- ๊ณ์ฐ๋ ๊ฐ์ด ์๋ฌด๋ฆฌ ์๊ฑฐ๋ ์ปค๋ Region์ ํฌ๊ธฐ๋ ๋ฐ๋์ ์ต์ 1MB์์ ์ต๋ 32MB ์ฌ์ด์ฌ์ผ ํ๋ค.
- 2์ ๊ฑฐ๋ญ์ ๊ณฑ
- ํฌ๊ธฐ๋ ๋ฐ๋์ 1, 2, 4, 8, 16, 32 MB์ค ํ๋์ฌ์ผ ํ๋ค.
| ํ ํฌ๊ธฐ(Xmx) | ๊ณ์ฐ๋ Region ์ฌ์ด์ฆ | ์ค์ Region ์ฌ์ด์ฆ |
| 1 GB | 0.5 MB | 1 MB (์ต์๊ฐ) |
| 2 GB | 1 MB | 1 MB |
| 4 GB | 2 MB | 2 MB |
| 8 GB | 4 MB | 4 MB |
| 16 GB | 8 MB | 8 MB |
| 32 GB | 16 MB | 16 MB |
| 64 GB ์ด์ | 32 MB ์ด์ | 32 MB (์ต๋๊ฐ) |
G1GC์ ๋์ ์ฌ์ดํด
G1GC๋ ํฌ๊ฒ ๋ค์ 3๊ฐ์ง ๋จ๊ณ๋ฅผ ์ํํ๋ฉฐ ๋์ํ๋ค.
- Young Only Phase (ํ์์ ๋ชจ๋)
- ์ ํ๋ฆฌ์ผ์ด์
์ด ์คํ๋๋ ๋๋ถ๋ถ์ ์๊ฐ ๋์ G1GC๋ ์ด ๋ชจ๋์ ์๋ค.
- ๋์: ์ค์ง Young ์์ญ(Eden + Survivor)๋ง ์ฒญ์ํ๋ค.
- ํน์ง: Old ์์ญ์ ๊ฑด๋๋ฆฌ์ง ์๋๋ค. ์๋ก ์๊ธด ๊ฐ์ฒด๋ง ๋น ๋ฅด๊ฒ ์ฒญ์ํ๊ณ , ์ด์๋จ์ ๊ฐ์ฒด๋ Old ์์ญ์ผ๋ก Promotion ์ํจ๋ค.
- ์ ํ๋ฆฌ์ผ์ด์
์ด ์คํ๋๋ ๋๋ถ๋ถ์ ์๊ฐ ๋์ G1GC๋ ์ด ๋ชจ๋์ ์๋ค.
- Concurrent Marking Cycle (์ ํ ์ค๋น ๋จ๊ณ)
- Young GC๋ง ๊ณ์ํ๋ค ๋ณด๋ฉด ์ธ์ ๊ฐ Old ์์ญ์ ๊ฐ์ฒด๊ฐ ์์ด๊ฒ ๋๋ค. Old ์์ญ์ ์ฌ์ฉ๋์ด ํน์ ์๊ณ์น(๊ธฐ๋ณธ 45%)๋ฅผ ๋์ด์๋ฉด G1GC๋ Old ์์ญ ์ฒญ์ ์ค๋น๋ฅผ ํ๋ค.
- ๋์: ์ ํ๋ฆฌ์ผ์ด์ ์คํ๊ณผ ๋์์(Concurrent) Old ์์ญ์ ์๋ ๊ฐ์ฒด๋ค ์ค ์ด์์๋ ๊ฐ์ฒด๊ฐ ๋ฌด์์ธ์ง ํ์ (Marking) ํ๊ธฐ ์์ํ๋ค.
- ํน์ง: ์ด ๋๋ Young GC๋ ๊ณ์ ๋ฐ์ํ๋ค. Marking ์์ ์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์กฐ์ฉํ ์ด๋ฃจ์ด์ง๋ค.
- Young GC๋ง ๊ณ์ํ๋ค ๋ณด๋ฉด ์ธ์ ๊ฐ Old ์์ญ์ ๊ฐ์ฒด๊ฐ ์์ด๊ฒ ๋๋ค. Old ์์ญ์ ์ฌ์ฉ๋์ด ํน์ ์๊ณ์น(๊ธฐ๋ณธ 45%)๋ฅผ ๋์ด์๋ฉด G1GC๋ Old ์์ญ ์ฒญ์ ์ค๋น๋ฅผ ํ๋ค.
- Mixed GC Phase (๋์ฒญ์ ๋ชจ๋)
- Marking์ด ๋๋์ ์ด๋ Old Region์ ์ฐ๋ ๊ธฐ๊ฐ ๋ง์์ง ํ์
์ด ์๋ฃ๋๋ฉด Mixed GC ๋จ๊ณ๋ก ์ง์
ํ๋ค.
- ๋์: ๋ชจ๋ Young ์์ญ + ์ฐ๋ ๊ธฐ๊ฐ ๋ง์ ์ผ๋ถ Old ์์ญ์ ํฉ์ณ์ ๋์์ ์ฒญ์ํ๋ค.
- ํน์ง: ํ ๋ฒ์ Mixed GC๋ก ๋ชจ๋ Old ์์ญ์ ๋ค ์น์ฐ๋๊ฒ ์๋๋ค. ๋ชฉํํ ๋งํผ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ๋ณด๋ ๋๊น์ง ์ฌ๋ฌ ๋ฒ์ Mixed GC๋ฅผ ๋๋์ด ์ํํ๋ค.
- ์ข ๋ฃ: ์ถฉ๋ถํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ๋ณด๋๋ฉด ๋ค์ Young Only Phase๋ก ๋์๊ฐ๋ค.
- Marking์ด ๋๋์ ์ด๋ Old Region์ ์ฐ๋ ๊ธฐ๊ฐ ๋ง์์ง ํ์
์ด ์๋ฃ๋๋ฉด Mixed GC ๋จ๊ณ๋ก ์ง์
ํ๋ค.

1. ์ด๊ธฐ์ํ
ํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ฌ๋ฌ ๊ฐ์ Region์ผ๋ก ๋๋์ด์ ธ ์๋ค. ๊ฐ ์ ์ ์ํ๋ฒณ์ ํด๋น Region์ ํ์ฌ ์ญํ ์ ๋ํ๋ธ๋ค.
E: Eden Region
S: Suvivor Region
O: Old Region
ํฐ์E: ๋น Region

2. Young GC
Eden ์์ญ์ด ๊ฝ ์ฐจ๋ฉด GC๊ฐ ๋ฐ์ํ๋ค.(Eden์ ๋ ๋๋ฆฌ๋ฉด ๋ค์ GC์์ Survivor / Promotion์ ๊ฐ๋นํ ์ ์๋ค๊ณ ํ๋จ๋ ๋)
์ด ๋ Eden๊ณผ ์ผ๋ถ Survivor ์์ญ์ด๋ Old์์ญ์ผ๋ก ๋ณต์ฌํ๊ณ ๋ณต์ฌ๊ฐ ์๋ฃ๋๋ฉด ์๋์ Region์ Empty ์ํ๊ฐ ๋๋ค. (์ด๋ฏธ์ง์์ S -> E๋ก์ ํ์ดํ๋ ์๋ชป ํ๊ธฐ๋ ๊ฒ์ด๋ ๋ฌด์ํ๊ธฐ ๋ฐ๋๋ค.)

3. Mixed GC(Young + Old ํ์)
GC๊ฐ ์ํ๋ ๋ ์ฐ๋ ๊ธฐ๊ฐ ๊ฐ์ฅ ๋ง์ Old Region๋ ํจ๊ป ์ ํํ์ฌ ์ฒญ์ํ๋ค. (Mixed GC)
์ด๋ฅผ ํตํด ์ ์ฒด ํ์ ๋ฉ์ถ๋ Major GC์ ๋น๋๋ฅผ ํ๊ธฐ์ ์ผ๋ก ์ค์ผ ์ ์๊ฒ ๋๋ค.
(์ฌ๊ธฐ์๋ S -> E ๋ฐฉํฅ์ ํ์ดํ๋ ์๋ชป ํ๊ธฐ๋ ๊ฒ์ด๋ ๋ฌด์ํ๊ธฐ ๋ฐ๋๋ค.)
๊ฐ์ฒด๋ ํญ์ ๋ค๋ฆ๊ณผ ๊ฐ์ ํ ๋ฐฉํฅ์ผ๋ก ํ๋ฅธ๋ค.
- New -> Eden (์์ฑ)
- Eden -> Survivor (์์กด, ์ฌ๋ฌ Survivor Region์ผ๋ก ๋ถ์ฐ๋์ด ์ด๋ํ๋ค)
- Survivor -> Survivor (๋ ์์กด, ์ฌ๋ฌ Survivor Region์ผ๋ก ๋ถ์ฐ๋์ด ์ด๋ํ๋ค)
- Survivor -> Old (์ฅ์, Promotion, ์ฌ๋ฌ Old Region์ผ๋ก ๋ถ์ฐ๋์ด ์ด๋ํ๋ค)
ZGC (Z Garbage Collector) (-XX: +UseZGC)
- G1GC ์ฒ๋ผ ์ ์ฒด ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๊ฒ ์ชผ๊ฐ์ ๊ด๋ฆฌํ๋ Region ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ค.
- Java11(์คํ์ ), Java15(์ ์)๋ถํฐ ๋์ ๋ ์ฐจ์ธ๋ GC๋ค.
- ๋ชฉํ: ํ ํฌ๊ธฐ๊ฐ ์ ํ ๋ผ๋ฐ์ดํธ(TB)๊ฐ ๋์ด๋ STW์๊ฐ์ 10ms ์ดํ๋ก ์ ์งํ๋ ๊ฒ์ด ๋ชฉํ๋ค.
- ์๋ฆฌ: Colored Pointers(ํฌ์ธํฐ์ ์๊น ์ ๋ณด๋ฅผ ์ ํ)์ Load Barriers(๊ฐ์ฒด์ ์ฝ์ ๋ ๋ผ์ด๋ค์ด ์ฒ๋ฆฌ)๋ผ๋ ๊ณ ๊ธ ๊ธฐ์ ์ ์ฌ์ฉํ๋ค.
- ํ์ฌ OpenJDK ๊ณ์ด์์ STW๋ฅผ ๊ฐ์ฅ ์งง๊ณ ์์ธก ๊ฐ๋ฅํ๊ฒ ๋ง๋ GC ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
- Low Latency(์ ์ง์ฐ)๊ฐ ์๋ช ์ธ ์ค์๊ฐ ์๋น์ค์ ์ ํฉํ๋ค.
- G1GC์ ๋นํด์ CPU ์๋ชจ๊ฐ ๋ ๋ง๋ค.
- 64bit ์์คํ ์์ ์ฌ์ฉ๊ฐ๋ฅํ๋ค. (32bit ์์คํ ์ ์ฌ์ฉ ๋ถ๊ฐ)
- ํต์ฌ ํค์๋๋ Colored Pointer, Load Barrier, Concurrent Reallocation ์ด๋ค.
ZGC๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ค์ง ์์ด ์ํ๋๋ ๋ฉ์นด๋์ฆ
์๋ ๊ทธ๋ฆผ์ ZGC๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ค์ง ์์ด GC๊ฐ ์ผ์ด๋ ์ ์๋์ง ์ค๋ช ํ๋ ๊ทธ๋ฆผ์ด๋ค.

1. Colored Pointer (ํฌ์ธํฐ์ ์๊น ์ ํ๊ธฐ)
64bit ๊ฐ์ฒด ์ฐธ์กฐ ํฌ์ธํฐ์ ์์ ๋นํธ๋ค์ด Color Bits๋ก ์ฌ์ฉ๋๋ค. ์ด ๋นํธ๋ค์ ๊ฐ์ฒด๊ฐ ์ด์์๋์ง (Marked0/1), ํน์ ์ฌ๋ฐฐ์น(์ด๋) ๋์๋์ง(Remapped)๋ฅผ ๋ํ๋ธ๋ค. ์ด ์ ๋ณด๋ฅผ ํตํด ZGC๋ ๊ฐ์ฒด ์ฐธ์กฐ ํฌ์ธํฐ๋ง ๋ณด๊ณ ๊ฐ์ฒด์ ์ํ๋ฅผ ์ ์ ์๋ค.

2. Load Barrier (์ ๊ทผ ๊ฒ๋ฌธ์)
์ ํ๋ฆฌ์ผ์ด์ ์ค๋ ๋๊ฐ ๊ฐ์ฒด์ ์ ๊ทผํ๋ฉด Load Barrier๊ฐ ์ฐธ์กฐ ํฌ์ธํฐ์ ์๊น์ ํ์ธํ๋ค. ์๊น์ด ์ฌ๋ฐ๋ฅธ ์ํ๋ผ๋ฉด ๋ฐ๋ก ํต๊ณผ ํ์ฌ ๊ฐ์ฒด์ ์ ๊ทผํ๋ค. ์๋ชป๋ ์ํ(์: GC๊ฐ ๊ฐ์ฒด๋ฅผ ์ด๋์ํค๋ ์ค)๋ผ๋ฉด ์ ์ ๋ฉ์ถฐ ํฌ์ธํฐ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๊ณ ์น ํ(Slow Path) ๊ฐ์ฒด์ ์ ๊ทผํ๋ค.

3. Concurrent Relocation
๊ฐ์ฒด๊ฐ Old Region์์ New Region์ผ๋ก ์ด์ฌ๋ฅผ ๊ฐ๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์ง Old Pointer(Bad Color)๋ฅผ ๊ฐ์ง๊ณ ์ ๊ทผํ๋ ค ํ๋ฉด Load Barrier๊ฐ Forwarding Table(์ฃผ์๋ก)์ ํ์ธํ์ฌ ์ ์ฃผ์๋ฅผ ์ฐพ์๋ธ๋ค. ๊ทธ๋ฆฌ๊ณ ํฌ์ธํฐ๋ฅผ New Pointer(Good Color)๋ก ์ ๋ฐ์ดํธ ํ ํ ์ ์์น์ ๊ฐ์ฒด์ ์ ๊ทผํ๊ฒ ํ๋ค. ์ด ๋ชจ๋ ๊ณผ์ ์ด ์ ํ๋ฆฌ์ผ์ด์ ๋ฉ์ถค ์์ด ์์ฃผ ๋น ๋ฅด๊ฒ ์ผ์ด๋๋ค.
ZGC๊ฐ STW๋ฅผ ๊ฐ์ฅ ๋จ์ถํ ์๋ GC์ธ๋ฐ ์ ๊ธฐ๋ณธ GC๋ก ์ฌ์ฉํ์ง ์์๊น?
ZGC๋ STW๊ฐ์ฅ ์ต์ํํ ์ ์๋ GC๋ ๋ง์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ๋ฒ์ฉ์ GC๊ฐ ์๋๋ค. G1GC๋ ์ค/๋ํ ํ ํฌ๊ธฐ์์๋ ๋น๊ต์ ์์ ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ง๋ง ZGC๋ ์คํ ํ ํฌ๊ธฐ์๋ ์ ๋นํ์ง ์์ GC์๊ณ ๋ฆฌ์ฆ์ด๋ค. ์ฆ ๋ฒ์ฉ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ์๋ G1GC์ ๋นํด์ ๋ถ์กฑํ๊ธฐ ๋๋ฌธ์ด๋ค.
GC๊ด๋ จ JVM ์ต์
์ ํ๋ฆฌ์ผ์ด์
์คํ์ ๊ด๋ จ GC ๋ก๊ทธ๋ฅผ ์์ฑํ๊ณ GC ๋์์ ํ์ํ ๋ช๊ฐ์ง ์ต์
๋ค์ด ์๋ค.
Java 11์ด์ ๋ถํฐ๋ -XX:+PrintGCDetails, -XX:+PrintGCTimeStamps์ ๊ฐ์ ์ต์
๋ค์ ํ๊ธฐ๋๊ณ -Xlog ํ๋๋ก ํตํฉ๋์๋ค.
-Xlog:gc*:file=/var/log/gc.log:time,uptime,level,tags:filecount=10,filesize=10MPlaintext์ ์ต์ ์ GC๊ด๋ จ ๋ชจ๋ ๋ก๊ทธ๋ฅผ /var/log/gc.log ํ์ผ์ ๊ธฐ๋กํ๊ณ ๋ก๊ทธ ํ์ผ์๋ ์๊ฐ(time), JVM ์์ ํ ๊ฒฝ๊ณผ ์๊ฐ(uptime), ๋ก๊ทธ ๋ ๋ฒจ(level), ๋ก๊ทธ๊ฐ ์ด๋ค ์์ญ์์ ๋์จ ๊ฒ์ธ์ง(tag) ์ ๋ณด๋ฅผ ๊ธฐ๋กํ๋ค. ๋ํ ๋ก๊ทธ ํ์ผ ๊ฐ์๋ 10๊ฐ๋ก ์ ํํ๊ณ ๋ก๊ทธ ํ์ผ ์ฌ์ด์ฆ๋ 10M๋ก ์ ํํ๋ค. ํ์ผ ํฌ๊ธฐ๊ฐ 10M๊ฐ ๋๋ฉด ์๋์ผ๋ก rotate ํ๋ค.
๋ค์์ GC๊ด๋ จ ์ฃผ์ JVM ์ต์ ํ๋ค. G1GC ๊ธฐ์ค์ผ๋ก ์์ฑํ์๋ค.
| ์ต์ | ์ค๋ช | ๊ธฐ๋ณธ๊ฐ |
| -Xms | ํ ๋ฉ๋ชจ๋ฆฌ์ ์ด๊ธฐ ํฌ๊ธฐ | ์ด์์ฒด์ ๋ง๋ค ๋ค๋ฆ |
| -Xmx | ํ ๋ฉ๋ชจ๋ฆฌ์ ์ต๋ ํฌ๊ธฐ | ๋ณดํต Xms์ ๋์ผํ๊ฒ ์ค์ |
| -XX:+UseG1GC (+UseZGC) | G1GC ์๊ณ ๋ฆฌ์ฆ ์ฌ์ฉ | Java 9์ด์ ๊ธฐ๋ณธ ์๊ณ ๋ฆฌ์ฆ |
| -XX:MaxGCPauseMillis | GC ์ต๋ ๋ฉ์ถค ์๊ฐ ๋ชฉํ ์ค์ (STW) | G1GC ํ๋์์ ๊ฐ์ฅ ์ค์ (200ms) |
| -XX:NewRatio | Young:Old ์์ญ ๋น์จ | ๊ธฐ๋ณธ 2 (Old๊ฐ Young์ 2๋ฐฐ) |
| -XX:SurvivorRatio | Eden:Survivor ์์ญ ๋น์จ | ๊ธฐ๋ณธ 8 (Eden์ด Survivor์ 8๋ฐฐ) |
| -XX:G1HeapRegionSize | ํ์ ๋๋๋ region์ ํฌ๊ธฐ ์ง์ (1 ~ 32MB, 2์ ๊ฑฐ๋ญ์ ๊ณฑ) | ์๋ ๊ณ์ฐ๋์ง๋ง ๊ณ ์ ํ ์๋ ์์ |
| -XX:InitiatingHeapOccupancyPercent | Old ์์ญ์ด ์ ์ฒด ํ์ ๋ช %๊ฐ ์ฐผ์ ๋ Mixed GC(Old ์์ญ ์ฒญ์)๋ฅผ ์ํ marking์ ์์ํ ์ง ๊ฒฐ์ | 45% (OOM์ด ๋ฐ์ํ๊ฑฐ๋ Old ์์ญ์ด ๊ธ๊ฒฉํ ์ฐฌ๋ค๋ฉด ์ด ๊ฐ์ ์ค์ฌ์ ๋ฏธ๋ฆฌ ์ฒญ์ํ๊ฒ ํ๋ ๊ฒ์ด ์ข์) |
| -XX:G1NewSizePercent | Young ์์ญ์ ์ต์ ํฌ๊ธฐ ๋น์จ | 5% |
| -XX:G1MaxNewSizePercent | Young ์์ญ์ ์ต๋ ํฌ๊ธฐ ๋น์จ | 60% |
| -XX:MaxTenuringThreshold | Old ์์ญ์ผ๋ก ์ด๋ํ Age ์ค์ | 15 |
| -XX:+HeapDumpOnOutOfMemoryError | OOM ์๋ฌ๊ฐ ๋ฐ์ํด์ ์๋ฒ๊ฐ ์ฃฝ์ ๋ ์ฃฝ๊ธฐ ์ง์ ์ ํ ๋ฉ๋ชจ๋ฆฌ ์ํ๋ฅผ hprof ํ์ผ๋ก ๋คํ๋ฅผ ๋ฌ๋ค. | OOM ๋ฐ์์ ์์ธ ํ์ ์ ์ํ ์ค์ํ ์๋ฃ๊ฐ ๋๋ค. (ํ์๋ก ์ง์ ) |
| -XX:HeapDumpPath | ํ ๋คํ ํ์ผ์ ๊ฒฝ๋ก ์ง์ | ๊ธฐ๋ณธ์ ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ ๋๋ ํ ๋ฆฌ์ ์์ฑ๋๋ ํ ๋คํ ํ์ผ์ ์ฌ์ด์ฆ๊ฐ ํฌ๋ค๋ ๊ฒ์ ๊ฐ์ํ์ฌ ๋์คํฌ ํฌ๊ธฐ๊ฐ ์ฌ์ ์๋ ๋๋ ํ ๋ฆฌ๋ก ์ง์ ์ ํ๋ ๊ฒ์ด ์ข์. |
| -XX:MetaspaceSize | ํ์ด ์๋ Metaspace ํด๋์ค ์ ๋ณด ์ ์ฅ ๊ณต๊ฐ์ ์ต๋ ํฌ๊ธฐ๋ฅผ ์ ํ | ์ฝ 21MB (128~256MB ์ ๋ ์ค์ ๊ถ์ฅ) |
| -XX:+DisableExplicitGC | ์ฝ๋์์ System.gc() ํธ์ถ์ ๋ฌด์ํ๋ ์ต์ | false |
| -XX:ParallelGCThreads | ์ฒญ์ํ ์ค๋ ๋ ๊ฐ์ | CPU ์ฝ์ด ์์ ๋ฐ๋ผ ๊ฒฐ์ (์ฝ์ด ์๊ฐ ๋ง๋ค๊ณ ๋ฌด์์ 1:1๋ก ๋๋ฆฌ๋ฉด ์ค๋ ๋ ๊ฐ ๋๊ธฐํ ์ค๋ฒํค๋๊ฐ ์ปค์ง๋ฏ๋ก 8๊ฐ ์ด์ ๋ถํฐ๋ ์ฆ๊ฐํญ์ ์ค์ด๋ ๊ฒ์ด ์ข์) |
| -XX:ConcGCThreads | ๋ฐฑ๊ทธ๋ผ์ด๋์์ Marking ์์ ์ ์ํํ ์ค๋ ๋ ์ | ParallelGCThreads ์์น์ 1/4 |
JVM์ ๊ธฐ๋ณธ๊ฐ์ ํ์ธํ๊ณ ์ ํ ๋ ๋ค์ ๋ช ๋ น์ด ๋์์ด ๋ ์ ์๋ค.
java -XX:+PrintFlagsFinal -version
GC ๋์ ์๋ฎฌ๋ ์ด์
์ ํ๋ฆฌ์ผ์ด์
์์ GC ๋์์ ๋ํด์ ์๊ฐ์ ์ผ๋ก ์ด๋ป๊ฒ ๋์ํ๋์ง ์ดํด๋ณด์.
์ํ ์ฝ๋๋ while loop ๋ด์์ 100KB byte ๋ฐฐ์ด ์ธ์คํด์ค๋ฅผ ์์ฑ๋ง ํ๋๋ก ํ๋ ๋ณ์๊ฐ ์๊ณ loop์ด 100๋ฒ ์ํ๋ ๋๋ง๋ค static List์ 100KB ํฌ๊ธฐ์ byte ๋ฐฐ์ด์ ์ ์ฅํ๋๋ก ํ๋ค. ์๊ฐ์ด ์ง๋ ์๋ก static List์๋ 100KB byte ๋ฐฐ์ด์ด ๋์ ๋์ ์์ผ ๊ฒ์ด๊ณ static List์ 5000๊ฐ(500MB) ๊ฐ ์์ด๋ฉด List๋ฅผ clear ํ๋๋ก ํ์ ๋ G1GC์ GC ๊ทธ๋ํ๋ ์ด๋ป๊ฒ ๋๋์ง ์ดํด๋ณด์. JVM ํ ๋ฉ๋ชจ๋ฆฌ๋ 512MB๋ฅผ ์ค์ ํ์๋ค.
GC ๋์์ ๋ํ ์๊ฐํ๋ VisualVM์ ์ฌ์ฉํ์๋ค. VisualVM์์ GC๋์์ ์๊ฐํํ์ฌ ํ์ธํ๋ ค๋ฉด VisualVM์์ VisualGC ํ๋ฌ๊ทธ์ธ์ ์ค์นํ๋ฉด ๋๋ค.
VisualVM ์คํ > Tools > Plugins > Available Plugins > VisualGC
ํ
์คํธ ์ ํ๋ฆฌ์ผ์ด์
์ ์คํํ๋ฉด VisualVM ์ข์ธก ๋ฉ๋ด Local ํญ๋ชฉ์ ์คํํ ์ ํ๋ฆฌ์ผ์ด์
์ด pid์ ํจ๊ป ๋ชฉ๋ก์ ๋ํ๋๋ค. ํด๋น ์ ํ๋ฆฌ์ผ์ด์
์ ์ ํํ์ฌ ์๋จ์ VisualGC ํญ์ ์ ํํ๋ฉด GC๋์์ ์๊ฐํํ์ฌ ๋ณผ ์ ์๋ค.
์ํ์ฝ๋
public class GCLoadTest {
// Old ์์ญ์ผ๋ก ๋์ด๊ฐ ๊ฐ์ฒด๋ค์ ๋ด์ ๋ฆฌ์คํธ (๋ฉ๋ชจ๋ฆฌ ๋์ ์๋ฎฌ๋ ์ด์
)
private static List<byte[]> oldGenList = new ArrayList<>();
public static void main( String[] args ) throws InterruptedException {
System.out.println("Start GC Load Test ...");
int loopCount = 0;
while ( true ) {
// 1. Eden ์์ญ์ ํ ๋น๋ ์งง์ ์๋ช
์ฃผ๊ธฐ ๊ฐ์ฒด (100KB) - ์๊ฑฐ ๋์
byte[] shortLived = new byte[100 * 1024];
// 2. ๊ฐ๋์ฉ Old ์์ญ์ผ๋ก promotion๋ ๊ฐ์ฒด ์ ์ฅ
// 100 ๋ฃจํ๋ง๋ค 100KB์ฉ Old ๋์ ์์ฑ
if( loopCount % 100 == 0 ) {
oldGenList.add( new byte[100 * 1024] );
if ( oldGenList.size() % 100 == 0 ) {
System.out.println("Total retained count: " + oldGenList.size() );
System.out.println("Total retained size: " + ( oldGenList.size() * 100 / 1024 ) + "MB");
System.out.println("=============================");
}
}
// 3. OOM ๋ฐฉ์ง์ฉ sleep
Thread.sleep( 2 );
loopCount++;
// Old ์์ญ ๊ณผ๋ํ ์ฆ๊ฐ ๋ฐฉ์ง (ํ
์คํธ์ฉ์ผ๋ก 500MB๊ฐ ์ฐจ๋ฉด ๋น์)
if ( oldGenList.size() > 5000 ) {
oldGenList.clear();
System.out.println("Cleared old gen list. (Released Memory)");
}
}
}
}Java์ ์ฝ๋๋ฅผ ์ปดํ์ผํ๊ณ ๋ค์๊ณผ ๊ฐ์ด ์คํํด๋ณด์.
java -Xms512m -Xmx512m -XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-Xlog:"gc*:file=gc.log:time,uptime,level,tags" \
GCLoadTestBashgc.log ํ์ผ์ ์ฒซ ๋ถ๋ถ์ ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ด์ฉ์ด ์๋ค.
[2025-12-28T00:03:47.682+0900][0.012s][info][gc,heap] Heap region size: 1M
[2025-12-28T00:03:47.683+0900][0.013s][info][gc ] Using G1
[2025-12-28T00:03:47.683+0900][0.013s][info][gc,heap,coops] Heap address: 0x00000007a0000000, size: 512 MB, Compressed Oops mode: Zero based, Oop shift amount: 3Plaintext‘Heap region size: 1M’: Heap region ํฌ๊ธฐ๋ 1MB (xmx 512MB ํ ํฌ๊ธฐ์ ๋ํ region ํฌ๊ธฐ๋ 1MB๋ค.)
‘Using G1’์ ํตํด์ G1GC ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ฒซ๋ฒ์งธ GC๋ก๊ทธ๋ฅผ ์ดํด๋ณด์.
[2025-12-28T00:03:48.341+0900][0.671s][info][gc,start ] GC(0) Pause Young (Normal) (G1 Evacuation Pause)
[2025-12-28T00:03:48.341+0900][0.672s][info][gc,task ] GC(0) Using 9 workers of 9 for evacuation
[2025-12-28T00:03:48.343+0900][0.673s][info][gc,phases ] GC(0) Pre Evacuate Collection Set: 0.0ms
[2025-12-28T00:03:48.343+0900][0.673s][info][gc,phases ] GC(0) Evacuate Collection Set: 1.5ms
[2025-12-28T00:03:48.343+0900][0.673s][info][gc,phases ] GC(0) Post Evacuate Collection Set: 0.2ms
[2025-12-28T00:03:48.343+0900][0.673s][info][gc,phases ] GC(0) Other: 0.7ms
[2025-12-28T00:03:48.343+0900][0.674s][info][gc,heap ] GC(0) Eden regions: 25->0(306)
[2025-12-28T00:03:48.343+0900][0.674s][info][gc,heap ] GC(0) Survivor regions: 0->1(4)
[2025-12-28T00:03:48.343+0900][0.674s][info][gc,heap ] GC(0) Old regions: 0->0
[2025-12-28T00:03:48.343+0900][0.674s][info][gc,heap ] GC(0) Humongous regions: 0->0Plaintext๊ฐ ๋ก๊ทธ๋ฅผ ํ์ค์ฉ ํ์ ํด๋ณด์.
Using 9 workers of 9 for evacuation
์ด 9๊ฐ์ GC ์ค๋ ๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ณ๋ ฌ๋ก ์์
์ ์ฒ๋ฆฌํจ.
์ด GC ์ํ ์๊ฐ์ ๋ค์๊ณผ ๊ฐ์ด ํ์ธํ ์ ์๋ค.
Pre Evacuate Collection Set: 0.0ms: ๊ฐ์ฒด๋ฅผ ์ฎ๊ธฐ๊ธฐ ์ ์ฒญ์ํ ๋ฆฌ์ ์ ๊ณ ๋ฅด๋ ์๊ฐ
Evacuate Collection Set: 1.5ms: ์ค์ ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ๋ฆฌํ๋ ์๊ฐ
Post Evacuate Collection Set: 0.2ms: ์ด์ฌ ํ ์ ๋ฆฌ ์๊ฐ
Other: 0.7ms: ๊ทธ ์ธ ์์ํ ์์ ์๊ฐ (์ด ์๊ฐ์ด ๋น์ ์์ ์ผ๋ก ๊ธธ๋ค๋ฉด OS๋ฌธ์ ๋ ๊ฐ์ํ ํ๊ฒฝ ๋ฌธ์ ๋ฅผ ์์ฌํด ๋ณผ์ ์์)
์ด GC์ ์์๋ ์๊ฐ = STW ์๊ฐ = 2.4ms
Eden regions: 25 -> 0(306)
25๊ฐ์ Eden region์ด ๋ชจ๋ ๋น์์ ธ 0๊ฐ๊ฐ ๋์๋ค๋ ์๋ฏธ.
(306)๊ณผ ๊ฐ์ด ๊ดํธ ์์ ๊ฐ์ ๋ค์ GC๊ฐ ์ํ๋ ๋๊น์ง ์ฑ์์ง Eden region์ ๋ชฉํ ๊ฐ์๋ฅผ ์๋ฏธํ๋ค. ์์ ์คํ ์ต์ ์์ -XX:MaxPauseMillis=200์ผ๋ก ์ง์ ํ๋๋ฐ 25๊ฐ์ region์ ์ฒญ์ํ๋๋ฐ 2.4ms ๋ฐ์ ๊ฑธ๋ฆฌ์ง ์์๊ธฐ ๋๋ฌธ์ ๋ชฉํ ์๊ฐ 200ms์ ๋ง์ถ๋ ค๊ณ ์ฒญ์ํ region ๊ฐ์๋ฅผ ๋ ๋๋ฆฐ ๊ฒ์ด๋ผ๊ณ ๋ณด๋ฉด ๋๊ฒ ๋ค.
Survivor regions: 0 -> 1(4)
GC์ Survivor ์์ญ์ ๋น์ด์๊ณ GC ํ ์ด์๋จ์ ๊ฐ์ฒด๋ค์ด 1๊ฐ์ Survivor ๋ฆฌ์ ์ผ๋ก ์ด๋ํ๋ค๋ ์๋ฏธ.
(4)์ ๊ฐ์ด ๊ดํธ ์์ ๊ฐ์ ๋ค์์ 306๊ฐ์ Eden region์ ์ ๋ฆฌํ ๋ ์ด์๋จ๋ ๊ฐ์ฒด๋ฅผ ์์ํ์ฌ ๋ฏธ๋ฆฌ survivor region์ ๋น์๋๊ธฐ ์ํ ์์ฝ ๊ฐ์๋ผ๊ณ ๋ณด๋ฉด ๋๊ฒ ๋ค.
(Survivor ์์ญ์ด 4๊ฐ๊ฐ ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ด ์๋๋ค. GC๊ฐ ๋ฐ์ํ์ ๋ ์ด์๋จ์ ๊ฐ์ฒด๋ฅผ ์ด๋ํ๋ Survivor region์ด 1๊ฐ๋ง ์ฌ์ฉ๋๋ฉด 1๊ฐ๋ง ์ฌ์ฉํ๋ ๊ฒ์ด๊ณ , 4๊ฐ๊ฐ ๋์น๋๋ก ๊ฐ์ฒด๋ค์ด ์ด์๋จ๋ ๋ค๋ฉด ๊ทธ ๋๋ Old ์์ญ์ผ๋ก ๋๊ธด๋ค.)
Old regions: 0 -> 0
์์ฑ๋ old region์ ์์์ ์๋ฏธ.
์ด๋ฒ์ oldGenList ๋ฆฌ์คํธ์ ๊ฐ์๊ฐ ๊ฑฐ์ 5000๊ฐ์ ์ก๋ฐํ ์์ ์ GC๋ก๊ทธ๋ฅผ ์ดํด๋ณด์.
[2025-12-28T00:24:49.524+0900][1261.901s][info][gc,start ] GC(1510) Pause Young (Normal) (G1 Evacuation Pause)
[2025-12-28T00:24:49.524+0900][1261.901s][info][gc,task ] GC(1510) Using 9 workers of 9 for evacuation
[2025-12-28T00:24:49.525+0900][1261.901s][info][gc,phases ] GC(1510) Pre Evacuate Collection Set: 0.0ms
[2025-12-28T00:24:49.525+0900][1261.901s][info][gc,phases ] GC(1510) Evacuate Collection Set: 0.4ms
[2025-12-28T00:24:49.525+0900][1261.901s][info][gc,phases ] GC(1510) Post Evacuate Collection Set: 0.1ms
[2025-12-28T00:24:49.525+0900][1261.901s][info][gc,phases ] GC(1510) Other: 0.1ms
[2025-12-28T00:24:49.525+0900][1261.901s][info][gc,heap ] GC(1510) Eden regions: 1->0(25)
[2025-12-28T00:24:49.525+0900][1261.901s][info][gc,heap ] GC(1510) Survivor regions: 0->0(4)
[2025-12-28T00:24:49.525+0900][1261.901s][info][gc,heap ] GC(1510) Old regions: 511->511
[2025-12-28T00:24:49.525+0900][1261.901s][info][gc,heap ] GC(1510) Humongous regions: 0->0PlaintextOld regions: 511 -> 511
Old region์ด 511๊ฐ๋ก ๊ฑฐ์ ๋๋ถ๋ถ์ ํ์ ์ฐจ์งํ๊ณ ์๋ค.
Survivor regions: 0 -> 0
Survivor region์ 0๊ฐ๋ก ์๋ง๋ ์ด ์์ ์๋ Survivor์ ๊ฑฐ์น์ง ์๊ณ ๋ฐ๋ก Old region์ผ๋ก ๊ฐ์ฒด๊ฐ ์ด๋ํ๊ณ ์๋ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
์ํ ์๊ฐ์ ์ด 0.6ms ๋ฐ์ ๊ฑธ๋ฆฌ์ง ์์์ง๋ง ์ด๋ ์๋ง๋ Old region์ด ๋๋ถ๋ถ์ ํ์ ์ฐจ์งํ๊ณ ์์ผ๋ฏ๋ก ์ฌ์ฉ๊ฐ๋ฅํ Eden region์ด ์๋นํ ๋ถ์กฑํ์ ๊ฒ์ด๋ค. ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ํ๊ธฐ ์ํด์ GC๊ฐ ๋งค์ฐ ๋น๋ฒํ๊ฒ ๋ฐ์ํ์ ๊ฒ์ผ๋ก ์์๋๋ค. ์ค์ ๋ก ์ด ์์ ์ GC๋ก๊ทธ๋ฅผ ๋ณด๋ฉด 1์ด ์์์ ์ฌ์ง์๊ณ ๊ณ์ GC๊ฐ ๋ฐ์ํจ์ ํ์ธํ ์ ์๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ด ์๋นํ ์ ํ๋ ์์ ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
VisualVM์ VisualGC๋ฅผ ํตํ GC ๊ทธ๋ํ๋ ๋ค์๊ณผ ๊ฐ๋ค.

๋ถ์์ ๋ค๋ชจ ์์ญ์ด oldGenList๊ฐ clear()๋ ์์ ์ด๋ค. ์ด๋ฐ์ GC๊ทธ๋ํ๊ฐ ์งค๋ ค์ ๊ทธ๋ ์ง ์ด๋ฐ์ ๊ทธ๋ํ๋ ๋ถ์์ ๋ค๋ชจ ์์ญ(๋ฉ๋ชจ๋ฆฌ ์ด๊ธฐํ ์์ )๊ณผ ๊ฑฐ์ ๋์ผํ๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
๊ทธ๋ํ๋ฅผ ๋ณด๋ฉด ์ ์ ์๋ฏ์ด oldGenList์ ๋ฐ์ดํฐ๊ฐ ์์ผ ์๋ก Eden๊ณผ Survivor region์ ๊ฐ์๋ ์ ์ ์์ด์ง๊ณ Old region์ ๊ฐ์๊ฐ ์ ์ ๋์ด๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค. clear๋ฅผ ํ์ง ์์๋ค๋ฉด OutOfMemoryError๊ฐ ๋ฐ์ํ์ ๊ฒ์ด๋ค.
VisualVM์ Sampler ํญ์ ๋ณด๋ฉด ์ด๋ค ํ์ ์์ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ๋์ง ํ์ธํ ์ ์๋ค.


Sampler ํ ๋ฉ๋ชจ๋ฆฌ์ ์ค๋ ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํตํด์ ๋์ถฉ ์ด๋์์ ๋์๊ฐ ๋ฐ์ํ๋์ง ์ง์ํ ์ ์๋ค.
Sampler – ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ณด๋ฉด byte[] ๋ฐฐ์ด์ ๋๋ถ๋ถ์ ํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋๊ณ ์์์ ํ์ธํ ์ ์๊ณ ์ค๋ ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ณด๋ฉด main ์ค๋ ๋์์ ๋๋ถ๋ถ์ ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ ์์์ ์ ์ ์๋ค.
์ค์ ์ด์ ํ๊ฒฝ์์๋ OutOfMemoryError์ ๋ํด์ gc ๋ก๊ทธ ํ์ผ๊ณผ ํ ๋คํ ํ์ผ์ VisualVM์ ์
๋ ฅํ์ฌ ๋ถ์ํ๋ ๊ฒ์ด ๋ง์ ๋์์ด ๋ ๊ฒ์ด๋ค.
์ง๊ธ๊น์ง GC์ ๋ํ ๋ด์ฉ์ ์ ๋ฆฌํด ๋ดค๋ค.
GC ๋ก๊ทธ๋ฅผ ๋ถ์ํด ๋ณธ ์ ๋ ์๊ณ ๋ง์ฐํ GC๊ฐ ์ค์ํ ๋ถ๋ถ์ด๋ผ๊ณ ์๊ฐ๋งํ๊ณ ์์์ง ์ธ์ธํ๊ฒ ์๊ณ ์์ง๋ ์์๋ค. ์ด๋ฒ ํฌ์คํ
์ ์์ฑํ๋ฉด์ GC์ ๋ํด์ ๋ณธ์ธ์ด ๊ฐ์ฅ ๋ง์ด ๋ฐฐ์ด ๊ฒ ๊ฐ๋ค.
์ด ํฌ์คํ
์ ํตํด์ ๊ฐ๋ฐํ๋ ์๋น์ค๊ฐ ๋ ์์ ์ ์ด๊ณ ๋น ๋ฅด๊ฒ ๋์ํ๋๋ก ํ๋๋ฐ ๋์์ด ๋๊ธธ ๋ฐ๋๋ค.
์ฐธ๊ณ ์ฌ์ดํธ
https://newrelic.com/blog/apm/java-garbage-collection
https://medium.com/@khurshidbek-bakhromjonov/java-memory-management-understanding-the-jvm-heap-method-area-stack-24a4d4fa2363
https://www.ibm.com/think/topics/garbage-collection-java
https://www.baeldung.com/jvm-static-storage

