[Java] JVM - Garbage Collector
by rlaehddnd0422์ปดํจํฐ์์ ๋ฉ๋ชจ๋ฆฌ๋ ํ์ ๋ ์์์ด๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ์ง ์๊ฑฐ๋ ํ์์๋ ๋ถ๋ถ์ ํด์ ํด์ฃผ์ด์ผ ํฉ๋๋ค.
C์ C++์ ๊ฐ์ ์ธ๋งค๋์ง๋ ์ธ์ด์์๋ free()์ ๊ฐ์ ํจ์๋ฅผ ํธ์ถํ์ฌ ๊ฐ๋ฐ์๊ฐ ์ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํด์ฃผ๋ ์์ ์ ์ํํด์ผ ํ๋ ๊ฒ๊ณผ ๋ฐ๋๋ก ์๋ฐ์์๋ JVM ๋ด๋ถ์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ์์ ์ฃผ๊ธฐ์ ์ผ๋ก ์ฐธ์กฐ๋์ง ์๋ ๊ฐ์ฒด๋ค์ ๊ฒ์ฌํ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ๋ ์์ ์ ์ํํฉ๋๋ค.
์ฉ์ด ์ ๋ฆฌ
- ๊ฐ๋น์ง ์ปฌ๋ ํฐ : JVM ๋ด๋ถ์ ์์นํ์ฌ ๋ฉ๋ชจ๋ฆฌ์์ ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ๊ฐ์ฒด๋ฅผ ์ฐพ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ํ๋ ์ญํ ์ ํ๋ ๊ตฌ์ฑ์์
- ๊ฐ๋น์ง ์ปฌ๋ ์ : ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ ์ํด ์ํ๋๋ ํ๋ก์ธ์ค
๊ฐ๋น์ง ์ปฌ๋ ์ ์ new ํค์๋๋ก ์์ฑํ ๊ฐ์ฒด๊ฐ ์ ์ฅ๋๋ "ํ ์์ญ"์ ๋ํด์๋ง ์ด๋ฃจ์ด์ง๋๋ค.
๊ฐ๋น์ง ์ปฌ๋ ์ ์ด ์ด๋ป๊ฒ ๋์ํ๋์ง ๊ทธ๋ฆผ์ ํตํด ๋ ์์ธํ ์์๋ด ์๋ค.
- new ํค์๋๋ก ์์ฑ๋ ๊ฐ์ฒด, ๋ฐฐ์ด์ด ์ ์ฅ๋๋ ๊ณณ์ธ ํ ์์ญ์ ๋๋ค.
- ํจ์จ์ ์ธ ๊ฐ๋น์ง ์ปฌ๋ ํฐ ๋์์ ์ํด ํ ์์ญ์ ๋ค์ ํ ์์ญ์ ํฌ๊ฒ Young, Tenured, Permanent ์์ญ์ผ๋ก ๊ตฌ๋ถ๋ฉ๋๋ค.
- Young Generation
- ๊ฐ์ฒด๊ฐ ์์ฑ๋์๋ง์ ์ ์ฅ๋๊ณ ์๊ธด์ง ์ผ๋ง ๋์ง ์์ ๊ฐ์ฒด๊ฐ ์ ์ฅ๋๋ ๊ณต๊ฐ์ ๋๋ค.
- Eden ์์ญ์ด ๊ฝ ์ฐจ๋ ๊ฒฝ์ฐ GC๊ฐ ์ด๋ฃจ์ด์ง๋๋ฐ์. GC์ ์ํด ์ด์๋จ์ ๊ฐ์ฒด๋ค์ Survivor ์์ญ์ผ๋ก ์ด๋๋๊ณ , Survivor ์์ญ์ด ๊ฝ ์ฐจ๊ฒ ๋๋ ๊ฒฝ์ฐ์๋ Tenured์ Old ์์ญ์ผ๋ก ์ด๋ํฉ๋๋ค.
- Tenured Generation
- Young Generation ๊ณต๊ฐ์ด ๊ฝ ์ฐผ์ ๋ ์๋ก์ด ๊ฐ์ฒด๋ ๋ฐฐ์ด์ด ์์ฑ๋๋ฉด ๊ธฐ์กด์ Young Generation์ ์๋ ๊ฐ์ฒด ๋ฐ ๋ฐฐ์ด์ ์ฐธ์กฐ๊ฐ ์ด๊ณณ์ Old์์ญ์ผ๋ก ์ด๋๋๊ฑฐ๋ ํ์๋ฉ๋๋ค.
- Young Generation๊ณผ Tenured Generation์์์ ์ด๋ฃจ์ด์ง๋ GC๋ฅผ "Minor GC"๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
- ์ดํ Old ์์ญ์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์ฉ์น๋ฅผ ๋๊ฒ ๋๊ฑฐ๋ Minor GC๋ฅผ ์ํํ ๋ค์๋ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๊ธฐ์ ๊ณต๊ฐํ ์ฌ์ ํ ๋ถ์กฑํ ๊ฒฝ์ฐ์ ๊ฐ์ด Minor GC๊ฐ ์คํจํ ๊ฒฝ์ฐ Old ์์ญ์ ์๋ ๋ชจ๋ ๊ฐ์ฒด๋ค์ ๊ฒ์ฌํ์ฌ ์ฐธ์กฐ๋์ง ์๋ ๊ฐ์ฒด๋ค์ ํ๊บผ๋ฒ์ ์ญ์ ํ๋ GC๊ฐ ์คํ๋ฉ๋๋ค.
- ์ด๋ ๊ฒ Old ์์ญ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ํ๋ GC๋ฅผ "Major GC"๋ผ๊ณ ๋งํฉ๋๋ค.
Permenant GenerationJDK8 ๋ถํฐ ์ฌ๋ผ์ง๊ณ Metaspace๋ก ๋์ฒด๋จ.
- Young Generation
๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ์ด๋ค ์๋ฆฌ๋ก ์๋ฉธ ๋์์ ์ ์ ํ ๊น?
๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ์ด๋ค ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๊ฐ์ฒด๊ฐ ํ์ฌ ์ฌ์ฉ๋๊ณ ์๋์ง ํ๋ณํ ๊น์. ๋ง์ ์๊ณ ๋ฆฌ์ฆ์ด ์ฌ์ฉ๋์ง๋ง ๊ณตํต์ ์ธ ์๋ฆฌ๊ฐ ์์ต๋๋ค. ๋จผ์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ์ฌ์ฉ๋์ง ์๋ ๊ฐ์ฒด๋ฅผ ํ๋ณํ๊ธฐ ์ํด Reachablity ๊ฐ๋ ์ ์ฌ์ฉํฉ๋๋ค.
Reachablity / Reachable, Unreachable
- ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ์ฌ์ฉ๋์ง ์๋ ๊ฐ์ฒด๋ฅผ ํ๋ณํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๊ธฐ์ค
- Reachable : ํ ์์ญ์ ํ ๋น๋ ์ด๋ ํ ๊ฐ์ฒด๊ฐ ์ ํจํ ์ฐธ์กฐ๊ฐ ์๋ ๊ฒฝ์ฐ Reachable ํ๋ค๊ณ ํ๋จํ๊ณ ์ด๋ ค๋ .
- Unreachable : ํ ์์ญ์ ํ ๋น๋ ์ด๋ ํ ๊ฐ์ฒด๊ฐ ์ ํจํ ์ฐธ์กฐ๊ฐ ์๋ ๊ฒฝ์ฐ, ์ฆ ์ฌ์ฉ๋์ง ์๋๋ค๊ณ ํ๋จํ ๊ฒฝ์ฐ Unreachable ๊ฐ์ฒด๋ก ํ๋จํ์ฌ ๊ฐ๋ฐ์ง๋ก ๊ฐ์ฃผํ๊ณ GC๋ฅผ ์ํ
ํ๋์ ๊ฐ์ฒด๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ณ ๋ค๋ฅธ ๊ฐ์ฒด๋ ๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ๋ฐฉ์์ผ๋ก ํ์ฑ๋ ์ฐธ์กฐ ์ฌ์ฌ์ ๊ฒฝ์ฐ์ ์ ํจํ ์ฐธ์กฐ ์ฌ๋ถ๋ฅผ ํ์ ํ๋ ค๋ฉด ์ ํจํ "์ต์ด์" ์ฐธ์กฐ๊ฐ ์์ด์ผ ํฉ๋๋ค. ์ด ์ฐธ์กฐ ์ฌ์ฌ ์ค "์ต์ด"์ ์ฐธ์กฐํ ๊ฒ์ Root Set์ด๋ผ๊ณ ํฉ๋๋ค.
Root Set์ด ๋๊ธฐ ์ํ ์กฐ๊ฑด
- ๊ฐ๊ฐ์ ์ฐ๋ ๋์ Stack ์์ญ์ ์กด์ฌํ๋ Local Variable, Operand Stack์ ์กด์ฌํ๋ ์ฐธ์กฐ ๊ฐ ๋ฑ
- Heap ์์ญ์ ์กด์ฌํ๋ Constant Pool ์ฐธ์กฐ ๊ด๊ณ
- JNI (Java Native Interface)๋ฅผ ํตํด ์์ฑ๋ ๊ฐ์ฒด๋ค
- Meta ์์ญ์ ์กด์ฌํ๋ Load ๋ Class ์ Data๋ค
- Heap ์์ญ ๋ด๋ถ์์ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ ์ค์ธ ๊ฐ์ฒด
์ด๋ ํ ๊ฐ์ฒด๊ฐ ์ฐธ์กฐ ์ฌ์ฌ์์ ์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ Root Set์ ์ํด ์ฐธ์กฐ๋์ง ์๋๋ค๋ฉด Unreachable Objects๋ก ํ๋จํ๋ฉฐ, GC์ ๋์์ผ๋ก ์ ์ ๋ฉ๋๋ค.
์ด๋ ๊ฒ ์ ์ ๋ ๊ฐ์ฒด๋ค์ ๋ฐ๋ก ์ ์ ๋์๋ค๊ณ ํด์ ๋ฐ๋ก GC์ ์ํด ์๊ฑฐ๋๋ ๊ฒ์ ์๋๊ณ , ์์คํ ์ ์ฑ๋ฅ์ ์ํฅ์ด ๊ฐ์ง ์๋๋ก ์คํํ์์ ๊ฒฐ์ ํ๋ ๋ณ๋์ ์๊ณ ๋ฆฌ์ฆ์ ํ ๋๋ก ๊ฐ๋น์ง ์ปฌ๋ ์ ์ด ์ํ๋ฉ๋๋ค.
<์ฐธ๊ณ ์๋ฃ>
'๐ Backend > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422