๐ฅ JVM์ ๊ตฌ์ฑ์์
JVM์ javac๋ก ๋ณํ๋ "์๋ฐ ๋ฐ์ดํธ ์ฝ๋ (.class) "๋ฅผ ์คํํ ์ ์๋ ๊ฐ์ ์ปดํจํฐ
1. ํด๋์ค ๋ก๋ ์์คํ
- ํด๋์ค๋ฅผ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ก๋ํ๋ ์ญํ
- JVM์ ๋ถ๋ชจ ์ฐ์ (Parent-First) ์์ ๋ชจ๋ธ๋ก ๋ก๋ฉ
ํด๋์ค๋ฅผ ๋ก๋ํ ๋ ๋จผ์ ๋ถ๋ชจ ๋ก๋์๊ฒ ์์ํ๊ณ , ๋ถ๋ชจ๊ฐ ์ฐพ์ง ๋ชปํ ๊ฒฝ์ฐ์๋ง ์์ ์ด ์ง์ ๋ก๋
2. ๋ฐํ์ ๋ฐ์ดํฐ ์์ญ
- ํ๋ก๊ทธ๋จ ์คํ ์ค์ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ
- ์ค๋ ๋๋ง๋ค ๋ ๋ฆฝ์ ์ธ ๊ณต๊ฐ(Stack, PC, Native Stack)๊ณผ ๋ชจ๋ ์ค๋ ๋๊ฐ ๊ณต์ ํ๋ ๊ณต๊ฐ(Heap, Metaspace)์ผ๋ก ๋๋จ
3. ์คํ ์์ง
- ๋ก๋๋ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์ค์ ์คํ (interpreter, JIT Compiler, Garbage Collector)
- Interpreter: ๋ฐ์ดํธ ์ฝ๋๋ฅผ ํ ์ค์ฉ ํด์ํ๋ฉฐ ์คํ
- JIT Compiler: ์์ฃผ ์คํ๋๋ ์ฝ๋๋ฅผ ๊ธฐ๊ณ์ด๋ก ์ปดํ์ผํด ์ฑ๋ฅ ์ต์ ํ
- Garbage Collector: ๋ ์ด์ ์ฐธ์กฐ๋์ง ์๋ Heap ๊ฐ์ฒด๋ฅผ ์๊ฑฐ
4. ๋ค์ดํฐ๋ธ ์ธํฐํ์ด์ค
- JVM๊ณผ OS/ํ๋์จ์ด ๊ฐ ์ํธ์์ฉ์ ์ง์
- native ํค์๋๊ฐ ๋ถ์ ๋ฉ์๋๋ ์๋ฐ ์ฝ๋๊ฐ ์๋ OS ๋ ๋ฒจ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(C/C++ ๋ฑ)๋ฅผ ํธ์ถ
- Native Method Libraries๋ ๋ค์ดํฐ๋ธ ๋ฉ์๋ ์คํ์ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ์ด๋ฅผ ํฌํจํ๊ณ ์์
Q. ๋ค์ดํฐ๋ธ(Native)๋?
- ๋ค์ดํฐ๋ธ ์ฝ๋ = ์๋ฐ๊ฐ ์๋ OS/CPU์ฉ ๊ธฐ๊ณ์ด๋ก ์ง์ ์์ฑ๋ ์ฝ๋๋ฅผ ์๋ฏธ
- ๋๋ถ๋ถ C/C++๋ก ๊ตฌ์ฑ. (์: OpenSSL ๋ผ์ด๋ธ๋ฌ๋ฆฌ, OS ์์คํ ์ฝ)
- ๊ทธ๋์ native ํค์๋๊ฐ ๋ถ์ ์๋ฐ ๋ฉ์๋๋ ์๋ฐ ์ฝ๋๊ฐ ์๋๋ผ OS ๋ ๋ฒจ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(C ๋ฑ)๋ฅผ ํธ์ถํ๋ค๋ ์๋ฏธ
๐ “๋ค์ดํฐ๋ธ”๊ฐ ๊ณง “C”๋ฅผ ๋ปํ๋ ๊ฑด ์๋๊ณ , ๋ณดํต C/C++๋ก ์์ฑ๋ OS ์ฐ๋ ์ฝ๋๋ผ๋ ๊ฑธ ์๋ฏธ
๐ JVM ๋ฉ๋ชจ๋ฆฌ ๊ตฌ๋ถ
JVM์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ด๋นํ๋ ๊ตฌ์ฑ์์๋ "๋ฐํ์ ๋ฐ์ดํฐ ์์ญ"
์ฌ๊ธฐ์๋ <๋ชจ๋ ์ค๋ ๋๊ฐ ๊ณตํต์ผ๋ก ์ฌ์ฉํ๋ ์์ญ>๊ณผ <์ค๋ ๋ ๋ณ ํ ๋น๋๋ ์์ญ>์ผ๋ก ๊ตฌ๋ถ
<๋ชจ๋ ์ค๋ ๋๊ฐ ๊ณตํต์ผ๋ก ์ฌ์ฉํ๋ ์์ญ>
1. ๋ฉ์๋ ์์ญ (HotSpot์์๋ Metaspace)
- JVM์ด ์์๋ ๋ ์์ฑ๋๋ ๊ณต๊ฐ์ด๋ฉฐ ํด๋์ค ๋ฐ์ดํฐ(๋ฐ์ดํธ ์ฝ๋)๊ฐ ์ฌ๊ธฐ์ ์ ์ฅ
๐ ํด๋์ค ๋ก๋ฉ ์ ์ฌ๋ผ๊ฐ๋ ํด๋์ค ๊ด๋ จ ๋ฉํ๋ฐ์ดํฐ ์ ์ฅ์ - ํด๋์ค ๋ฉํ๋ฐ์ดํฐ, ๋ฐํ์ ์์ ํ(RCP), ๋ฐ์ดํธ์ฝ๋๊ฐ ์ ์ฅ๋๊ณ ๋ชจ๋ ์ค๋ ๋๊ฐ ๊ณต์
(โป static ํ๋ “๊ฐ”์ Heap์ Class<T> ๊ฐ์ฒด์ ์ ์ฅ) - Method Area/Metaspace์๋ static ๋ณ์์ ์ ์์ ๋ํ ์ ๋ณด(“static ํ๋๊ฐ ์๋ค”๋ ๋ฉํ๋ฐ์ดํฐ)๊ฐ ์ฌ๋ผ๊ฐ
static ๋ณ์์ ์ค์ ๊ฐ์ Heap์ Class<T> ๊ฐ์ฒด ์์ ์ ์ฅ๋จ!
๐ static ๋ณ์๋ ๋ ผ๋ฆฌ์ ์ผ๋ก๋ Method Area, ์ค์ HotSpot ๊ตฌํ์์๋ Heap(Class ๊ฐ์ฒด)์ ๊ฐ ์ ์ฅ
[Method Area / Metaspace]
โโ Class A Metadata
โ โโ static ํ๋๋ค
โ โโ ๋ฉ์๋/ํ๋ ์ ๋ณด
โ โโ Runtime Constant Pool (ํด๋์ค A ์ ์ฉ)
โ โโ "Hello" → (์คํ๋๋ ์์ ์ Heap์ String ๊ฐ์ฒด ์ฐธ์กฐ)
โ โโ ์ซ์ 123
โ โโ ๋ฉ์๋ ํธ๋ค ์ฌ๋ณผ ๋ฑ
โโ Class B Metadata
โ โโ Runtime Constant Pool (ํด๋์ค B ์ ์ฉ)
...
- ๊ตฌ์ฑ์์
1) ํด๋์ค ์ด๋ฆ, ๋ถ๋ชจ ํด๋์ค, ์ธํฐํ์ด์ค ์ ๋ณด
2) ๋ฉ์๋/ํ๋์ ์๊ทธ๋์ฒ(ํ์ , ์ ๊ทผ ์ ์ด์ ๋ฑ)
3) ๋ฐํ์ ์์ ํ(Runtime Constant Pool) ← ๊ฐ ํด๋์ค๋ง๋ค ๋ ๋ฆฝ์ ์ผ๋ก ์กด์ฌ
. ํด๋์ค ๋ก๋ฉ ์, .class ํ์ผ ์์ ์๋ Constant Pool ์ ๋ณด๋ฅผ JVM ๋ฉ์๋ ์์ญ์ ์ฌ๋ ค๋๊ณ , ํ์ํ๋ฉด ํ ๊ฐ์ฒด(์: String ๋ฆฌํฐ๋ด) ์ฐธ์กฐ๋ ๊ฐ์ด ์ ์ฅ
- ์ฌ๋ณผ(Symbol): ํด๋์ค ์ด๋ฆ, ๋ฉ์๋ ์ด๋ฆ, ํ๋ ์ด๋ฆ ๊ฐ์ “๋ฌธ์์ด ์๋ณ์”
- ๋ฆฌํฐ๋ด(Literal): ์ซ์ 10, ๋ฌธ์์ด "Hello", ์์ ๊ฐ ๊ฐ์ ๊ฒ
"Hello"๋ผ๋ ๋ฌธ์์ด ๋ฆฌํฐ๋ด์ด ์ฝ๋์ ๋ฑ์ฅํ๋ฉด, ํด๋น ํด๋์ค์ ์์ ํ ํญ๋ชฉ์ "Hello"๋ผ๋ ์ํธ๋ฆฌ๊ฐ ๊ธฐ๋ก๋จ
๋ฐํ์ ์์ ํ์ "Hello" = ์ฒ์์๋ ๋จ์ “์์/๊ธฐํธ” ์ ๋ณด
์คํ ์ค ์ฌ์ฉ๋ ๋ (constant pool entry๊ฐ resolve๋ ๋_)
→ Heap์ String ๊ฐ์ฒด์ ์ฐ๊ฒฐ๋์ด, ๊ทธ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ์ฐธ์กฐ(์ฃผ์๊ฐ)๋ฅผ ๋ค๊ณ ์๋ ์ฌ๋กฏ์ด ๋จ.
์ฒ์์๋ ๋ชฉ๋ก, ํ์ง๋ง ์ค์ ๋ฐํ์์๋ “๋ชฉ๋ก + Heap ๊ฐ์ฒด ์ฐธ์กฐ”๋ก ๋์.
๐ RCP๋ ๋จ์ ๊ฐ ์ ์ฅ์๊ฐ ์๋๋ผ ๋์ ์ฐ๊ฒฐ/ํด์์ ์ํ ํ ์ด๋ธ
. ๋ฐํ์ ์์ ํ์ ๋จ์ํ ๊ฐ ์ ์ฅ์๊ฐ ์๋๋ผ, JVM์ด ๋์ ๋ฐ์ธ๋ฉ(๋ฉ์๋ ํธ์ถ ์ฐ๊ฒฐ), ํ๋ ์ฐธ์กฐ ํด์, ํด๋์ค ์ฐธ์กฐ ํด์ ๊ฐ์ ์์ ํ ๋๋ ์ฌ์ฉ
. JVM์ด ํด๋์ค ๋์์ “ํด์ํ๊ณ ์ฐ๊ฒฐํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ”
4) static ๋ณ์(์ ์ ํ๋)
5) ๋ฉ์๋ ์ฝ๋ ์์ฒด(JIT ์ด์ ์๋ ๋ฐ์ดํธ์ฝ๋)
Q. HotSpot์ด๋?
- JVM(Java Virtual Machine)์ ๊ตฌํ์ฒด ์ค ํ๋
OpenJDK = HotSpot์ด ๊ธฐ๋ณธ ํ์ฌ - HotSpot JVM์ ํน์ง์ JIT(Just-In-Time) ์ปดํ์ผ๋ฌ๊ฐ ๋ค์ด์๋ค๋ ์ .
→ ๊ทธ๋์ ์ธํฐํ๋ฆฌํฐ๋ณด๋ค ๋น ๋ฅด๊ณ , ์ ์ ์ปดํ์ผ๋ณด๋ค๋ ์ํฉ์ ๋ง์ถฐ ์ต์ ํ ๊ฐ๋ฅ. - HotSpot = ์์ฃผ ์คํ๋๋ ์ฝ๋๋ฅผ ์บ์นํด์ ์ต์ ํํ๋ JVM.
- JVM = ์ฌ๋ฌ GC ์์ง์ ํ๊ณ ์๋ ํ๋ซํผ
์) Serial GC, Parallel GC, CMS (deprecated), G1GC, ZGC, Shenandoah - ํ๋์ JVM ํ๋ก์ธ์ค์์ ๋์์ ์ฌ๋ฌ GC๋ฅผ ํผ์ฉํ ์๋ ์์ผ๋ฏ๋ก ์คํํ ๋ ํ๋์ GC ์๊ณ ๋ฆฌ์ฆ๋ง ์ ํํด์ ์ฌ์ฉ
- HotSpot JVM์ ๋ฒ์ ์ ๋ฐ๋ผ ๊ธฐ๋ณธ GC๊ฐ ๋ค๋ฅด๋ค
Java 8 → Parallel GC
Java 9 ์ดํ → G1GC
Java 11/17 ์ดํ → G1GC ์ฌ์ ํ ๊ธฐ๋ณธ, ํ์ง๋ง ZGC/Shenandoah๋ ์ ํ ๊ฐ๋ฅ
2. ํ ์์ญ (Heap)
- ์คํ ์ค์ ๋์ ์ผ๋ก ์์ฑ๋ ๊ฐ์ฒด์ ๋ฐฐ์ด์ด ์ ์ฅ๋๋ ์์ญ, ์๋ ์ด๊ธฐํ ๋ฐ์
- new ์ฐ์ฐ์ ํตํด ์์ฑ๋ ๋ณ์ (Reference Type์ ํด๋น - class, interface, enum, Array)
- GC(Garbage Collector)์ ํ๊ฒ์ด ๋๋ ์์ญ์ด๋ฏ๋ก(ํ ๋น ํด์ ) GC๋ฅผ ์ํด ์ผ๋ฐ์ ์ผ๋ก Young/Old Region ์ผ๋ก ๋๋์ด์ง
๐ HotSpot์์๋ Eden/Survivor/Old Region ๊ตฌ์กฐ๋ก ๊ด๋ฆฌ - ๊ตฌ์ฑ์์
1) ๋ฌธ์์ด ๋ฆฌํฐ๋ด ํ (String Literal Pool = Intern Pool)
ํ ์์์ ํด์ํ ์ด๋ธ ๊ธฐ๋ฐ์ผ๋ก ๊ด๋ฆฌ๋๋ ์ ์ญ ์บ์
"Hello" ๊ฐ์ ๋ฌธ์์ด ๋ฆฌํฐ๋ด์ด ์ค์ ๊ฐ์ฒด๋ก ๋ง๋ค์ด์ ธ ์ ์ฅ๋๋ ๊ณต๊ฐ
๋ชจ๋ ํด๋์ค๊ฐ ๊ณต์ ํ๋ค. (ํด๋์ค๋ณ๋ก ๋ฐ๋ก ์์ง ์์)
"Hello"๊ฐ ์ฌ๋ฌ ํด๋์ค์์ ๋ฑ์ฅํด๋ ํ๋์ ๊ฐ์ฒด๋ง ์์ฑ๋๊ณ , ๊ทธ ์ฐธ์กฐ๊ฐ ์์ ํ ํญ๋ชฉ์ ์ฐ๊ฒฐ - String s = "Hello";
"Hello" ๋ฌธ์์ด์ ํ(Heap)์ String ๊ฐ์ฒด๋ก ์กด์ฌํจ
๊ทธ๋ฐ๋ฐ ์ด ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ(ํฌ์ธํฐ)๊ฐ ๋ฐํ์ ์์ ํ ์์๋ ๋ฑ๋ก
→ ๊ทธ๋์ "Hello"๋ผ๋ ๋ฆฌํฐ๋ด์ ํ๋ก๊ทธ๋จ ์ ์ฒด์์ ๊ณต์ ๊ฐ๋ฅ - static์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ง ์์๋ “์ ์”๊ฐ Metaspace์ ์ฌ๋ผ๊ฐ๋ค.
๋จ, static ํ๋์ ์ค์ ๊ฐ ์ ์ฅ์๋ Heap์ Class<T> ๊ฐ์ฒด ๋ด๋ถ๋ค.
static ํ๋๊ฐ ์ฐธ์กฐํ๋ ๊ฐ์ฒด๋ Class<T> ๊ฐ์ฒด(Heap)๋ฅผ ํตํด GC Root๋ก ๋๋ฌ ๊ฐ๋ฅํ๋ค.
์ฐธ์กฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๋์ ๊ฐ์ฒด๋ Heap์ ์กด์ฌ
static List<String> cache = new ArrayList<>();
์ด cache๋ GC Root๋ผ์ ํ๋ก๊ทธ๋จ ๋๋ ๋๊น์ง ์ ์ง์์ง(๋ช ์์ ์ผ๋ก null ์ฒ๋ฆฌํ์ง ์์ผ๋ฉด).
๋๋ ํด๋์ค ์ธ๋ก๋ฉ(class unloading) ์ด ์ผ์ด๋ ํด๋์ค ์์ฒด๊ฐ GC ๋์์ด ๋๊ณ , ๊ทธ ํด๋์ค์ static ํ๋ ์ฐธ์กฐ๋ ํจ๊ป ์ฌ๋ผ์ง - String a = "Hello";
String b = new String("Hello");
a: ๋ฆฌํฐ๋ด ํ์ ํตํด Heap์ intern table์ ์๋ ๊ฐ์ฒด ์ฐธ์กฐ → ๊ณต์ .
b: Heap์ ์๋ก์ด String ๊ฐ์ฒด๋ฅผ ๊ฐ์ ๋ก ์์ฑ → a์ b๋ ์๋ก ๋ค๋ฅธ ๊ฐ์ฒด.
ํ์ง๋ง b.intern()์ ํธ์ถํ๋ฉด b๋ intern table์ "Hello" ์ฐธ์กฐ๋ฅผ ๋๋ ค์ค → a์ ๋์ผํด์ง.
<์ค๋ ๋๋ณ ํ ๋น๋๋ ์์ญ>
3. ์๋ฐ ์คํ
- ์ค๋ ๋์ ๋ฉ์๋ ํธ์ถ๊ณผ ๋ก์ปฌ ๋ณ์๋ฅผ ์ ์ฅํ๋ ์์ญ์ผ๋ก ์คํ ํ๋ ์์ ์์ฑ๋์ง๋ง ๋ก์ปฌ ๋ณ์์ ์๋ ์ด๊ธฐํ๊ฐ ์ด๋ฃจ์ด์ง์ง ์์ผ๋ฏ๋ก ์ฌ์ฉ ์ ๋ฐ๋์ ๊ฐ ํ ๋น ํ์(ํนํ primitive)
- ์ง์ญ๋ณ์๋ ๋ฉ์๋์ ๋งค๊ฐ๋ณ์, ํธ์ถ๋ ๋ฉ์๋์ ์ ๋ณด๊ฐ ์ ์ฅ๋๋ ์์ญ
- ํด๋น ๋ฉ์๋์ ํธ์ถ์ด ์ข ๋ฃ๋๋ฉด ์ฌ๋ผ์ง (ํ ๋น ํด์ )!
4. ํ๋ก๊ทธ๋จ ์นด์ดํฐ (PC Register)
- ์ค๋ ๋๊ฐ ์์๋ ๋ ์์ฑ
- ํ์ฌ ์คํ ์ค์ธ JVM ๋ช ๋ น์ ์ฃผ์๋ฅผ ์ ์ฅ (์ค๋ ๋๊ฐ ์ด๋ค ๋ถ๋ถ์ ์ด๋ค ๋ช ๋ น์ด๋ก ์คํ ์ค์ธ์ง ์ ์ฅํ๋ ๊ณต๊ฐ)
5. ๋ค์ดํฐ๋ธ ๋ฉ์๋ ์คํ
- Java๊ฐ ์๋ ๋ค๋ฅธ ์ธ์ด๋ก ์์ฑ๋ ์ฝ๋๋ฅผ ์ํ ๊ณต๊ฐ
- Java Native Interface๋ฅผ ํตํด ํธ์ถํ๋ C/C++ ๋ฑ์ ์ฝ๋๋ฅผ ์ํํ๊ธฐ ์ํ ๊ณต๊ฐ
๐ OS/๋ค์ดํฐ๋ธ ABI ๊ท์น์ ๋ง์ถฐ ์ฝ ์คํ/๋ ์ง์คํฐ๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํด ์๋ฐ ์คํ๊ณผ ๋ถ๋ฆฌ
Q. ์ JNI ํธ์ถ์ด ํ์ํ๊ฐ?
- ์๋ฐ๋ง์ผ๋ก OS ๊ธฐ๋ฅ์ ๋ค ๋ค๋ฃฐ ์๋ ์์ (์: ํ์ผ ๋์คํฌ๋ฆฝํฐ, ์์คํ ์ฝ, GUI)
- ๊ณ ์ฑ๋ฅ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(C/C++๋ก ์์ฑ๋ DB ๋๋ผ์ด๋ฒ, ์ํธํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ)๋ฅผ ์ฐ๊ธฐ ์ํด
- JVM ๋ด๋ถ ๋์(์ค๋ ๋ ์์ฑ, ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ฑ)๋ ์ฌ์ค OS API ํธ์ถ์ด ํ์
Q. ABI(Application Binary Interface)
- OS์ CPU๊ฐ ์ ํ “๋ฐ์ด๋๋ฆฌ ๋ ๋ฒจ ์ฝ์” >> Windows x64, Linux x64, ARM ๋ฑ๋ง๋ค ํธ์ถ ๊ท์ฝ(calling convention)์ด ๋ค๋ฆ.
- ์๋ฐ ์คํ ํ๋ ์์ JVM ์ ์ฉ ๊ท์ฝ์ ๋ฐ๋ฅด๊ธฐ ๋๋ฌธ์, ๋ค์ดํฐ๋ธ ์คํ ํ๋ ์๊ณผ ์์ด ์ฐ๋ ค๋ฉด ๋ถ๋ฆฌํด์ ๊ด๋ฆฌ๊ฐ ํ์
Q. Person p = new Person("Euiseon", 35);
- ์ด ๋, ๋ณ์ p๋ ์คํ์ ์ ์ฅ์ด ๋จ.
- new Person("์ด์์ ", 35)์ด๋ผ๋ ์ค์ Person ๊ฐ์ฒด ๋ฐ์ดํฐ๋ ํ์ ์ ์ฅ์ด ๋จ
Q. ๊ทธ๋ฌ๋ฉด ๋ณ์ p๊ฐ ์ ์ฅ๋ ์คํ์ ๋ฉ๋ชจ๋ฆฌ์๋ ์ฃผ์๊ฐ์ด ๋ค์ด์๋๊ฑด๊ฐ?
- ์๋ฐ ์ธ์ด ๊ด์ ์์ p๋ ๊ฐ์ฒด์ ์ฐธ์กฐ(reference)๋ฅผ ์ ์ฅ == ํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ์ผ์ข
์ ์ฃผ์๊ฐ(raw pointer or compressed OOP)
๐ ์๋ฐ ์ธ์ด์์๋ "์ฃผ์๊ฐ"์ด๋ผ๋ ํํ ๋์ ์ฐธ์กฐ๋ผ๋ ๊ฐ๋ ์ฌ์ฉ
๐ค classloader๋?
- .class ํ์ผ(๋ฐ์ดํธ์ฝ๋)์ ์ฐพ์์ JVM์ ๋ฉ๋ชจ๋ฆฌ(Method Area/Metaspace)์ ์ ์ฌํ๋ ์ญํ ์ ํ๋ JVM์ ๊ตฌ์ฑ ์์
- ๋ก๋ฉ๋ ํด๋์ค๋ JVM ์์์ java.lang.Class ๊ฐ์ฒด๋ก ํํ
๐ ์ฐ๋ฆฌ๊ฐ SomeClass.class๋ผ๊ณ ์ธ ๋์ ๊ทธ ๊ฐ์ฒด! - JVM์๋ ์ฌ๋ฌ ๋จ๊ณ์ ๋ก๋๊ฐ ์กด์ฌํ๋ฉฐ ๋ถ๋ชจ ์ฐ์ (Parent-First) ์์ ๋ชจ๋ธ์ด๋ผ๋ ๊ท์น์ผ๋ก ์์ฐจ์ ๋ก๋ฉ
- ์๋ฐ ํ๋ก๊ทธ๋จ์ด A๋ผ๋ ํด๋์ค๋ฅผ ์ฒ์ ์ฐธ์กฐํ๋ฉด, JVM์ ํด๋์ค ๋ก๋ ์ฒด์ธ์ ๋ฐ๋ผ๊ฐ๋ฉฐ .class๋ฅผ ์ฝ์ด์จ ๋ค, JVM ๋ด๋ถ์ ๋ก๋ฉ
- ์ผ๋ฐ ์ฒด์ธ: Bootstrap → Platform(Java 9+) → Application(System) → (์ฌ์ฉ์ ์ ์ ๋ก๋)
<๊ตฌ์ฑ์์>
1. Bootstrap ClassLoader
- ์๋ฐ ํต์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(java.lang.*, java.util.*)๋ฅผ ๋ก๋.
- C/C++๋ก ์์ฑ๋ ๋ค์ดํฐ๋ธ ์ฝ๋๋ผ์ ์๋ฐ ๊ฐ์ฒด๋ก๋ ์กด์ฌํ์ง ์์.
- Bootstrap ClassLoader๋ “JVM ๋ถํ (bootstrap) ๋จ๊ณ์์ ๊ธฐ๋ณธ ํด๋์ค๋ฅผ ์ฌ๋ฆฌ๋ ๋ค์ดํฐ๋ธ ๋ก๋” (์น ๊ฐ๋ฐ์ CSS ํ๋ ์์ํฌ Bootstrap๊ณผ ์ ํ ๊ด๊ณ์์)
2. Platform ClassLoader (Java 9+)
- JDK์ ํ์ค ๋ชจ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ์: java.sql.*, java.xml.*
3. Application(System) ClassLoader
- ๊ฐ๋ฐ์๊ฐ classpath์ ๋ฃ์ .class/JAR (์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ JAR)
4. ์ฌ์ฉ์ ์ ์ ๋ก๋
- ํ์ํ๋ฉด ์ฐ๋ฆฌ๊ฐ ์ง์ ํ์ฅํด์ ๋ง๋ค ์ ์์. (์: ๋คํธ์ํฌ์์ ํด๋์ค๋ฅผ ๊ฐ์ ธ์ค๊ธฐ, ์ํธํ๋ JAR ํด์ ํ ๋ก๋ฉ ๋ฑ)
<ํด๋์ค ๋ก๋ฉ ๊ณผ์ >
1. ๋ก๋ฉ (Loading)
- ํด๋์ค ๋ก๋๊ฐ .class ๋ฐ์ดํธ์ฝ๋๋ฅผ ์ฝ์ด์ JVM ๋ด๋ถ ๊ตฌ์กฐ๋ก ๋ณํ
- ์ด๋ ํด๋์ค์ ๊ตฌ์กฐ(ํ๋, ๋ฉ์๋, ์์ํ ๋ฑ)๊ฐ ๋ฉ์๋ ์์ญ(Method Area/Metaspace)์ ์ฌ๋ผ๊ฐ
๐ “A๋ผ๋ ํด๋์ค๊ฐ ์ด๋ค ๋ฉค๋ฒ๋ฅผ ๊ฐ๋๋ค”๋ผ๋ ๋ฉํ์ ๋ณด๊ฐ ์๊น
2. ๋งํฌ (Linking)
- ๊ฒ์ฆ(Verify): ๋ฐ์ดํธ์ฝ๋ ์ ํจ์ฑ ๊ฒ์ฌ
- ์ค๋น(Prepare): static ๋ณ์์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ํ ๋น, ๊ธฐ๋ณธ๊ฐ(0, null)์ผ๋ก ์ด๊ธฐํ
- ํด๊ฒฐ(Resolve): ์์ํ ์ฐธ์กฐ๋ฅผ ์ค์ ๋ฉ๋ชจ๋ฆฌ ์ฐธ์กฐ๋ก ์นํ (ํ์ ์์ ์ ์ง์ฐ๋๊ธฐ๋ ํจ)
3. ์ด๊ธฐํ (Initialization)
- static ๋ณ์์ ์ค์ ๊ฐ ํ ๋น (์: static int i = 10;)
- static ๋ธ๋ก ์คํ
- ์ด ์์ ์ Heap์ Class<A> ๊ฐ์ฒด๊ฐ ์์ฑ๋ผ์, A.class๋ก ์ ๊ทผํ ์ ์๊ฒ ๋จ
- static ํ๋ ๊ฐ๋ค์ ์ด Class<A> ๊ฐ์ฒด์ ํ๋ ์์ ์ ์ฅ
๋ก๋ฉ/๋งํฌ
→ ๋ฉ์๋ ์์ญ(Metaspace)์ ๋ฐ์ดํธ์ฝ๋ + ํด๋์ค ๋ฉํ๋ฐ์ดํฐ ์ฌ๋ผ๊ฐ / static ๋ณ์์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ํ ๋น
์ด๊ธฐํ
→ static ํ๋์ ๊ฐ ์ฑ์์ง
→ Heap์ Class<A> ๊ฐ์ฒด 1๊ฐ๊ฐ ์์ฑ
→ ์ด ๊ฐ์ฒด๊ฐ ๋ฐ๋ก ์ฐ๋ฆฌ๊ฐ A.class ๋ผ๊ณ ์ธ ๋ ์ฐธ์กฐํ๋ ๋์
<Parent-first delegation model>
- ํด๋์ค ๋ก๋์ ๋์ ๋ฐฉ์ (์ฌ๋ฌ ๋ก๋๊ฐ ๋์์ ์์ ๋ ๋๊ฐ ์ด ํด๋์ค๋ฅผ ๋ก๋ฉํ ์ง ์ ํ๋ ๊ท์น)
- Bootstrap ClassLoader: rt.jar ๊ฐ์ JVM ํต์ฌ ํด๋์ค ๋ก๋ฉ (ex: java.lang.*)
Platform ClassLoader : JDK ํ์ค ๋ชจ๋(java.*)์ ๋ก๋ฉ(Java 9+์ ๋ชจ๋ ์์คํ ๊ธฐ๋ฐ)
Application (System) ClassLoader: ์ฐ๋ฆฌ๊ฐ ๋ง๋ ์ ํ๋ฆฌ์ผ์ด์ ํด๋์ค ๋ก๋ฉ (classpath ์ง์ ๋ ๊ฒ)
ํ์ํ๋ฉด ์ฌ์ฉ์ ์ ์ ClassLoader๋ ๋ง๋ค ์ ์์ - ์๋ฐ ํด๋์ค ๋ก๋๋ ๋ถ๋ชจ์๊ฒ ๋จผ์ ์์(Delegation)ํ๊ณ , ๋ถ๋ชจ๊ฐ ๋ชป ์ฐพ์์ ๋๋ง ์์ ์ด ์ง์ ๋ก๋ฉ
- ๋์ ์์
์ด๋ค ํด๋์ค๊ฐ ํ์ํ๋ฉด, ํ์ฌ ํด๋์ค ๋ก๋๊ฐ ๋ถ๋ชจ์๊ฒ ๋จผ์ ์์ฒญ
๋ถ๋ชจ๊ฐ ๋ ๊ทธ ๋ถ๋ชจ์๊ฒ ์์ฒญ (์ต์ข ์ ์ผ๋ก Bootstrap๊น์ง ์ฌ๋ผ๊ฐ)
๋ถ๋ชจ ์ฒด์ธ ์ค ํ๋๊ฐ ํด๋์ค๋ฅผ ์ฐพ์ผ๋ฉด ๊ทธ๋๋ก ์ฌ์ฉ
๋ถ๋ชจ๋ค์ด ๋ชป ์ฐพ์ ๊ฒฝ์ฐ์๋ง ์์ ๋ก๋๊ฐ ์ง์ ๋ก๋ฉ
์ฆ, “ํญ์ ์์์๋ถํฐ ๋จผ์ ์ฐพ์๋ณด๊ณ , ์์ผ๋ฉด ์๋๊ฐ ์ฑ ์์ง๋ค”๋ ์๋ฆฌ
Q. ์ ์ด๋ ๊ฒ Parent Delegation์ ์ฐ๋๊ฐ?
- ๋ณด์: java.lang.String ๊ฐ์ ํต์ฌ ํด๋์ค๋ ๋ฌด์กฐ๊ฑด Bootstrap์์ ๋ก๋ → ๋๊ตฐ๊ฐ ๋ด๊ฐ ๋ง๋ String.class๋ก ๋ฐ๊ฟ์น๊ธฐ ๋ถ๊ฐ
- ์ผ๊ด์ฑ: JVM ์ด๋์์ ํธ์ถํ๋ ๋์ผํ ํด๋์ค๋ ๋์ผํ ClassLoader๊ฐ ๋ก๋ํ ํ๋์ Class ๊ฐ์ฒด๋ง ์กด์ฌํ๋๋ก ๋ณด์ฅ
- ์ ์ฐ์ฑ: ํ์ํ๋ค๋ฉด ํน์ ํด๋์ค๋ง ์ฌ์ฉ์ ์ ์ ๋ก๋๋ก ์ปค์คํ ํ๊ฒ ๋ก๋ ๊ฐ๋ฅ
Q. Human ํด๋์ค๋ฅผ ๋ด๊ฐ ๋ง๋ค์๋ค๋ฉด?
- ์คํ ์ค new Human() ํธ์ถ → JVM์ Human ํด๋์ค ๋ก๋ฉ ์ฌ๋ถ ํ์ธ
์์ง ๋ก๋ ์ ๋จ → Application ClassLoader๊ฐ ๋ถ๋ชจ(Bootstrap, Platform)์๊ฒ ์์
๋ถ๋ชจ ๋ก๋๋ค์ Human์ ๋ชป ์ฐพ์ → Application ClassLoader๊ฐ classpath์์ Human.class๋ฅผ ์ฐพ์ ๋ก๋
JVM ๋ฉํ์คํ์ด์ค์ ํด๋์ค ์ ๋ณด๊ฐ ์ฌ๋ผ๊ฐ๊ณ , Human ํด๋์ค์ static ๋ธ๋ก/ํ๋ ์ด๊ธฐํ๊ฐ ์คํ๋จ
โณ ์คํ ์์ง์ด๋?
- ์๋ฐ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๊ธฐ๊ณ์ด๋ก ๋ณํํ์ฌ ์คํ
- Tiered Compilation ์ฌ์ฉ: JVM์ ์ธํฐํ๋ฆฌํฐ๋ก ๋จผ์ ์คํ → ์ผ์ ๊ธฐ์ค(ํธ์ถ/๋ฃจํ ์นด์ดํฐ) ๋์ผ๋ฉด JIT ์ปดํ์ผ ์งํ
1. interpreter
- ์คํ ์ค์ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ํ ๋ผ์ธ์ฉ ์ฝ๊ณ ์คํ, ์๋๊ฐ ๋๋ ค์ง๋ ํ์ ์กด์ฌ (ํนํ ๋ฐ๋ณต๋ฌธ)
2. JIT Compiler
- ์๋ฐ ํ๋ก๊ทธ๋จ์ด ์คํ๋ ๋ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๊ธฐ๊ณ์ด๋ก ๋ณํํ๋ ๊ณผ์ ์์ ํ๋ก๊ทธ๋จ์ ์คํ ํจํด์ ๋ถ์ํ์ฌ ์์ฃผ ์คํ๋๋ ์ฝ๋(ํซ ์คํ)๋ฅผ ์ค์ฌ์ผ๋ก ์ต์ ํ๋ฅผ ์ํ
- JIT ์ปดํ์ผ๋ฌ๋ ๋ฉ์๋ ๋จ์๋ก ์ปดํ์ผ์ ์ํํจ
๐ ์คํ ์ด๋ฐ์๋ ์ธํฐํ๋ฆฌํฐ๋ก ์คํํ๋ค๊ฐ ํธ์ถ/๋ฃจํ ์นด์ดํฐ๊ฐ ์๊ณ์น๋ฅผ ๋์ผ๋ฉด Tiered JIT๊ฐ ๊ทธ ๋ฉ์๋/๋ฃจํ๋ฅผ ๋ค์ดํฐ๋ธ๋ก ์ปดํ์ผํจ - ๋ฉ์๋ ๋จ์์ ์ปดํ์ผ์ ์คํ ํจํด์ ๋ฐ๋ผ ์ต์ ํ๋ฅผ ์ํ (๋์ ์ธ์ด์ ํน์ฑ์ ํ์ฉํ๋ ๋ฐฉ๋ฒ)
- "์์ฃผ ์คํ๋๋ ๋ฐ์ดํธ ์ฝ๋ ์์ญ์ ๋ฐํ์ ์ค์ ๊ธฐ๊ณ์ด๋ก ์ปดํ์ผํ์ฌ ์ฌ์ฉ"
3. ๋ํ์ ์ธ ์ต์ ํ ์์
1) ์ธ๋ผ์ด๋(Inlining)
- ์์ ๋ฉ์๋ ํธ์ถ์ ์์ ๊ณ ์ง์ ์ฝ๋๋ก ์นํ
- int add(int a, int b) { return a+b; }
int result = add(1,2);
์๋๋ผ๋ฉด add ๋ฉ์๋๋ฅผ ํธ์ถํด์ผ ํ์ง๋ง, JIT์ ํธ์ถ์ ์์ ๊ณ ๊ทธ๋ฅ int result = 1+2;๋ก ์นํ!
๋ฉ์๋ ํธ์ถ ์ค๋ฒํค๋ ์ ๊ฑฐ → ๋น ๋ฆ
์์ ๋ฉ์๋๊ฐ ๋ฐ๋ณต ํธ์ถ๋ ๋, ํธ์ถ ์ค๋ฒํค๋๋ฅผ ์์ ๊ณ ํธ์ถ๋ถ์ ์ฝ๋ ์์ฒด๋ฅผ “์ง์ ๋ฐ์ ๋ฃ๋” ์ต์ ํ
2) ํ๊ฐ์ํ(Devirtualization)
- ๊ฐ์ ํธ์ถ์ ์ค์ ํธ์ถ๋ก ๋ฐ๊ฟ ํธ์ถ ์ค๋ฒํค๋ ์ ๊ฑฐ
- List<String> list = new ArrayList<>();
list.add("A");
๋ฐ์ดํธ์ฝ๋ ์์ผ๋ก๋ List.add (์ธํฐํ์ด์ค ๋ฉ์๋ ํธ์ถ) → ๋ฐํ์์ ์ด๋ค ๊ตฌํ์ธ์ง ๋ชจ๋ฆ
๊ทผ๋ฐ JIT์ ์ค์ ๊ฐ์ฒด ํ์ ์ด ArrayList์์ ์๋ฉด, ๋ฐ๋ก ArrayList.add๋ฅผ ํธ์ถํ๋๋ก ์ต์ ํ
์๋ฐ๋ ๋ณดํต “๊ฐ์ ๋ฉ์๋ ํธ์ถ(virtual call)” ๋ฐฉ์์ ์จ์ → ๋ฐํ์์ ์ค์ ํ์ ์ ์ฐพ์ ํธ์ถ
JIT์ ์คํ ์ค์ “ํญ์ ArrayList๋ก๋ง ํธ์ถ๋๋ค?” ๊ฐ์ ํจํด์ ๋ฐ๊ฒฌํ๋ฉด, ๋งค๋ฒ ๊ฐ์ ๋์คํจ์นํ์ง ์๊ณ ๋ฐ๋ก ArrayList.add()๋ฅผ ํธ์ถํ๋๋ก ์นํ
๐ “๊ฐ์ ํธ์ถ์ ์ค์ ํธ์ถ๋ก ๋ฐ๊ฟ๋ฒ๋ฆฐ๋ค = ํ๊ฐ์ํ”
3) Escape Analysis + Scalar Replacement
- ๋ฉ์๋ ์์์๋ง ์ฐ์ด๋ ๊ฐ์ฒด๋ผ๋ฉด ํ ๋์ ์คํ/๋ ์ง์คํฐ์ ๋๊ฑฐ๋ ์์ ํ๋๋ฅผ ๋ก์ปฌ ๋ณ์๋ก ์ชผ๊ฐ๋ฒ๋ ค GC ๋ถ๋ด์ ์ค์
- class Point { int x, y; }
void foo() {
Point p = new Point();
p.x = 1; p.y = 2;
}
๋ณดํต new Point()๋ ํ์ ๊ฐ์ฒด ์์ฑ.
๊ทผ๋ฐ JIT์ p๊ฐ ๋ฉ์๋ ์์์๋ง ์ฐ์ด๊ณ ์ธ๋ถ๋ก “ํ์ถ(escape)”ํ์ง ์๋ ๊ฑธ ์๋ฉด,
์์ ํ ๊ฐ์ฒด๋ฅผ ์ ๋ง๋ค๊ณ ๊ทธ๋ฅ ๋ก์ปฌ ๋ณ์ 2๊ฐ(int x, int y)๋ก ์นํ
๐ new์กฐ์ฐจ ์ฌ๋ผ์ง → ๊ฐ์ฒด๋ฅผ ์คํ/๋ ์ง์คํฐ์๋ง ๋๋ ๊ฒฝ์ฐ “ํ์ ์ ๋ง๋ค์ด์ GC ๋ถ๋ด ์ค์ด๋ฆ” - Escape Analysis: ๊ฐ์ฒด๊ฐ ๋ฉ์๋ ์์์๋ง ์ฐ์ด๊ณ ๋ฐ๊นฅ์ผ๋ก ๋๊ฐ์ง ์๋๋ค๋ฉด, ํ์ ์ ๋ง๋ค๊ณ ์คํ/๋ ์ง์คํฐ์์๋ง ์ฒ๋ฆฌ
- Scalar Replacement: ์์ ๊ฐ์ฒด๋ฅผ ์ชผ๊ฐ์ ํ๋๋ฅผ ๊ฐ๊ฐ ๋ ๋ฆฝ์ ์ธ ๋ก์ปฌ ๋ณ์๋ก ์นํ
4) OSR(On-Stack Replacement)
- ๊ธด ๋ฃจํ๋ฅผ ๋๋ค๊ฐ๋ ๋์ค์ ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ์นํํด ์ฑ๋ฅ ํฅ์
- ๋ฐ๋ณต๋ฌธ ๊ฐ์ ๊ฑด ์ฒ์์ ์ธํฐํ๋ฆฌํฐ๋ก ๋๋ค๊ฐ “์ถฉ๋ถํ ๋ง์ด ๋ฐ๋ณต๋๋ฉด” ๋ฃจํ ์ค๊ฐ์ JIT์ด ๋ค์ดํฐ๋ธ๋ก ๋ฐ๊ฟ์น๊ธฐ
๊ธด ๋ฃจํ๋ผ๋ ์คํ ๋์ค์ ๋ค์ดํฐ๋ธ๋ก ์นํํด์ ์๋ ๊ฐ์ .
๐ ์คํ ์์ง์ ์ธํฐํ๋ฆฌํฐ์ JIT์ ๋ณํํ์ฌ “์ฒ์์ ๋๋ฆฌ๊ฒ ์์ → ์ ์ ๋นจ๋ผ์ง๋ค”๋ ๊ฒ ์๋ฐ ์คํ ํน์ฑ
== ๋ฐํ์ ์ต์ ํ ํน์ฑ์ ๊ฐ์ง๋ค.
'F-Lab Mentoring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [F-Lab Mentoring] JVM 2ํ (1) | 2025.09.28 |
|---|
๋๊ธ