๐Today...
์์ํ๊ธฐ์ ์ ์๊ณ ์ถ์ด์ ์๊ธด์งค ์ฐพ๋ค๊ฐ ๊ฐ์ ธ์๋๋ฐ ์์ง์ง ์นดํ์์ ์๋ฆฌ๋ด์ ์์๋คใ ใ ใ ์ทจํฅ์ ๊ฒฉ ๊ฐ๊ทธ
โ์ค๋์ TIL(Today I Learn)
JVM
JVM์ ์๋ฐ ํ๋ก๊ทธ๋จ์ ์คํ์ํค๋ ๋๊ตฌ์ด๋ค. .java ์ฝ๋๋ฅผ ์ปดํ์ผ ํ์ฌ .class ๋ฐ์ดํธ ์ฝ๋๋ก ๋ง๋ค๋ฉด ์ด์ฝ๋๊ฐ JVMํ๊ฒฝ์์ ์คํ๋๋ค. JVM์ JRE(Java Runtime Environment)์ ํฌํจ๋์ด์๋ค. ์ฆ, ์๋ฐ๋ก ์์ฑํ ์์ค์ฝ๋๋ฅผ ํด์ํ์ฌ ์คํํ๋ ๋ณ๋์ ํ๋ก๊ทธ๋จ์ด๋ค.
์๋ฐ๋ "์ด์์ฒด์ ๋ก ๋ถํฐ ๋ ๋ฆฝ์ "์ด๋ผ๊ณ ๋งํ๋๋ฐ ์ด๊ฒ์ด JVM์ ํตํด ๊ตฌํ๋๋๊ฒ์ด๋ค. ํ๋์ ๋ฐ์ดํธ์ฝ๋๋ก ๋ชจ๋ ํ๋ซํผ์์ ๋์์ด ๊ฐ๋ฅํด์ง๋ค. ์ฆ, ์ ๊ทธ๋ฆผ์์ ๋ณผ์์๋ฏ์ด ์๋ฐ๋ ํ๋ซํผ์๋ ์ข ์์ ์ด์ง ์์ง๋ง, JVM์ ํ๋ซํผ์ ์ข ์์ ์ด๋ค. ๋ฆฌ๋ ์ค์ JVM๊ณผ ์๋์ฐ์ JVM์ ๋ค๋ฅด๊ณ ์๋ฐ๋ฅผ ์คํํ๊ธฐ ์ํด์๋ ๋ฐ๋์ JVM์ด ์ค์น๋์ด์์ด์ผ ํ๋ค.
๋ฐ์ดํธ ์ฝ๋ : ์ธ๊ฐ์นํ์ JAVA์ฝ๋ => ์ปดํจํฐ๊ฐ ํด์ํ๋ ๊ธฐ๊ณ์ด์ ์ค๊ฐ ๋จ๊ณ
JVM์ ๊ตฌ์กฐ
์ง๊ธ๊น์ง ๋ฒํผ๋ง ๋๋ฅด๋ฉด ์๋์ผ๋ก ์งํ๋๋ ์๋ฐ์ฝ๋์ ์คํ์์๋ฅผ ๊ฐ๋จํ๊ฒ ์์๋ณด์!
1. ์๋ฐ ์์ค์ฝ๋ ์์ฑ(.java) ํ์ ์คํ
2. ์ปดํ์ผ๋ฌ๊ฐ ์คํ๋์ด ์ปดํ์ผ์ ์งํ
3. ์ปดํ์ผ์ ๊ฒฐ๊ณผ๋ก ์๋ฐ์ฝ๋(.java) => ๋ฐ์ดํธ์ฝ๋(.class) ํ์ผ๋ก ๋ณํ
4. JVM์ด ์ด์์ฒด์ ๋ก ๋ถํฐ ์์ค์ฝ๋ ์คํ์ ํ์ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ์(Runtime Data Area)
5. ํด๋์ค๋ก๋๊ฐ ๋ฐ์ดํธ ์ฝ๋ํ์ผ์ JVM์ Runtime Data Area์ ์ ์ฌ(์์ค์ฝ๋๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋)
6. ๋ก๋๊ฐ ์๋ฃ๋๋ฉด ์คํ์์ง(Excution Engine)์ด Runtime Data Area์ ์ ์ฌ๋ ๋ฐ์ดํธ์ฝ๋๋ฅผ ์คํ
7. ์ธํฐํ๋ฆฌํฐ๋ฅผ ํตํด ์ฝ๋๋ฅผ ํ์ค์ฉ ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญํ์ฌ ์คํ์ํด
8. ํน์ ๋ฐ์ดํธ์ฝ๋๊ฐ ์์ฃผ ์คํ๋ ์์ JIT Compiler(Just-In-Time)๋ฅผ ํตํด ๋ฐ์ดํธ์ฝ๋ ์ ์ฒด๋ฅผ ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญํ๊ณ ์คํ
# JIT ์ปดํ์ผ๋ฌ
JIT ์ปดํ์ผ๋ฌ๋ ๊ฐ์ ์ฝ๋๋ฅผ ๋งค๋ฒ ํด์ํ์ง ์๊ณ , ์คํํ ๋ ์ปดํ์ผ์ ํ๋ฉด์ ํด๋น ์ฝ๋๋ฅผ ์บ์ฑํด๋ฒ๋ฆฐ๋ค. ์ดํ์ ๋ฐ๋ ๋ถ๋ถ๋ง ์ปดํ์ผํ๊ณ , ๋๋จธ์ง๋ ์บ์ฑ๋ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํ์ผํ๋ค. ์ด๋ ๊ฒ JIT ์ปดํ์ผ๋ฌ๋ ์ด์์ฒด์ ์ ๋ง๊ฒ ๋ฐ์ดํธ ์คํ ์ฝ๋๋ก ํ ๋ฒ์ ๋ณํํ์ฌ ์คํํ๊ธฐ ๋๋ฌธ์ ์ธํฐํ๋ฆฌํฐ ๋ฐฉ์๋ณด๋ค ์ฑ๋ฅ์ด 10๋ฐฐ ~ 20๋ฐฐ ์ ๋ ๋ ๋๋ค.
JVM๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ
# Stack Area / Heap Area
๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉด ๋ฉ์๋๋ฅผ ์ํ ๊ณต๊ฐ์ธ Method Frame์ด ์์ฑ๋๋ค, ์ด๋ ๋ฉ์๋ ๋ด๋ถ์ ์ฌ์ฉ๋๋ ์ฐธ์กฐ๋ณ์, ๋งค๊ฐ๋ณ์, ์ง์ญ๋ณ์, ๋ฆฌํด๊ฐ, ์ฐ์ฐ์ ์ผ์ด๋๋ ๊ฐ๋ค์ด ์์๋ก ์ ์ฅ๋๋ค. ์ด๋ฌํ Method Frame์ด Stack์ ํธ์ถ๋๋ ์์๋๋ก ์์ด๊ณ ๋์์๋ฃ์์ ์ญ์์ผ๋ก ์ ๊ฑฐ๋๋ค.
JVM์์๋ ๋จ ํ๋์ Heap area๊ฐ ์กด์ฌํ๋ค. JVM์ด ๋์ํ๋ฉด ์ด์์ญ์ ์๋์ ์ผ๋ก ์์ฑ๋๋ฉฐ, ๊ฐ์ฒด, ์ธ์คํด์ค ๋ณ์, ๋ฐฐ์ด ๋ฑ์ ์ ์ฅํ๋ค. ์๋ฅผ๋ค์ด
Fruit apple = new Fruit();
new Fruit()๊ฐ ์คํ๋๋ฉด Heap์์ญ์ ์ธ์คํด์ค๊ฐ ์์ฑ๋๊ณ , ์ธ์คํด์ค๊ฐ ์์ฑ๋ ์ฃผ์๊ฐ์ apple์ ํ ๋นํด์ค๋ค. ์ด๋ apple์ด Stack์ ์ ์ธ๋ ๋ณ์์ด๊ณ , ๊ฐ์ฒด๋ฅผ ์ ๊ทผํ๋ฉด Stack์ ์ ์ฅ๋ ์ฐธ์กฐ๋ณ์๋ฅผ ํตํด์ Heap์์ญ์ ์กด์ฌํ๋ ๊ฐ์ฒด๋ฅผ ๋ค๋ฃจ๋ ๊ฒ์ด๋ค. ์ด๋ฌํ Heap์์ญ์ ์ค์ ๊ฐ์ฒด์ ๊ฐ์ด ์ ์ฅ๋๋ ๊ณต๊ฐ์ด๋ค.
Garbage Collection
๊ฐ๋น์ง ์ปฌ๋ ์ ์ GC๋ผ๊ณ ์ค์ฌ์๋ ๋ถ๋ฅด๋ฉฐ, JVM์ Heap ์์ญ์์ ๋์ ์ผ๋ก ํ ๋นํ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ค ํ์ ์๊ฒ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ(Unreachable) ์ ์ฃผ๊ธฐ์ ์ผ๋ก ์ญ์ ํ๋ ํ๋ก์ธ์ค์ด๋ค. C๋ C++์ ๊ฒฝ์ฐ์ ๊ฐ๋ฐ์๊ฐ ์๋์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๊ณ ํด์ ํด์ค์ผ ํ์ง๋ง, ์๋ฐ์์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์๋์ ์ผ๋ก ํด์ฃผ๊ธฐ ๋๋ฌธ์, ๋ฉ๋ชจ๋ฆฌ ๋์๋ฑ์ ๋ฌธ์ ์ ๋ํด ํฌ๊ฒ ๊ด์ฌํ์ง ์์๋ ๋๋ค.
# GC์ ๋จ์
1. ๋ฉ๋ชจ๋ฆฌ์ ํด์ ์์ (GC์ ๋์ ์์ )์ ์ ํํ๊ฒ ์์์๋ค.
2. GC๊ฐ ๋์ํ๋ ๋์ ๋ค๋ฅธ ๋์์ ๋ฉ์ถ๊ธฐ ๋๋ฌธ์ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ๋ค.
# GC์ ๋์๋ฐฉ์
GC๋ Heap์ ํ ๋นํ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ์ญ์ ํด์ค๋ค๊ณ ํ๋ค. Heap์ ์์ญ์ ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ณ ์ด์์๋ ๊ธฐ๊ฐ์ ๋ฐ๋ผ์ Young๊ณผ Old ์์ญ์ผ๋ก ๋๋๋ค.
๋จผ์ , Young ์์ญ์๋ ์๋กญ๊ฒ ์์ฑ๋ ๊ฐ์ฒด๊ฐ ํ ๋น๋๊ณ , ์ฌ๊ธฐ์ ๋ง์ ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ณ ์ฌ๋ผ์ง๋ ๊ฒ์ ๋ฐ๋ณตํ๋ค. ์ด๊ณณ์์ ํ๋ํ๋ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ฅผ Minor GC๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๊ทธ๋ฆฌ๊ณ Old์์ญ์ Young์์ญ์์ ์ํ๋ฅผ ์ ์งํ๊ณ ์ด์๋จ์ ๊ฐ์ฒด๋ค์ด ๋ณต์ฌ๋๋ ๊ณณ์ด๋ค. ์ด๊ณณ์ Young์์ญ๋ณด๋ค ํฌ๊ฒ ํ ๋น๋๊ณ , ํฌ๊ธฐ๊ฐ ํฐ ๋งํผ GC๋ ์ ๊ฒ ๋ฐ์ํ๋ค. ์ด๊ณณ์์ ํ๋ํ๋ ๊ฐ๋น์ง์ปฌ๋ ํฐ๋ฅผ Major GC๋ผ๊ณ ๋ถ๋ฅธ๋ค.