๊ฐ์ ๋จธ์ (Virtual Machine)
์์์ ๋์๊ฐ๋ ์ํํธ์จ์ด๊ฐ ๊ฐ์๋จธ์ ์ด ์ ๊ณตํ๋ ํ๊ฒฝ๊ณผ ์์์ ์ ํ์ ๋ฐ์ผ๋ฉฐ ๊ฐ์ ํ๊ฒฝ์ ๋ฒ์ด๋ ์ ์๋ค.
- System Virtual Machine
- ์์ ํ OS ์คํ์ ์ง์.
- ๊ฐ์ ์ปดํจํฐ ๋ด์์ ์ฌ๋ฌ ์ด์์ฒด์ ๋ฅผ ๋๋ฆด ์ ์๋ค.
- Process Virtual Machine
- ๋จ์ผ ํ๋ก์ธ์ค๋ฅผ ์ง์
- ํ๋ซํผ์ ๋ ๋ฆฝ์ ์ธ ์คํํ๊ฒฝ๊ณผ ์ถ์ํ๋ฅผ ์ ๊ณตํ์ฌ ํ๋์ ํ๋ก๊ทธ๋จ์ ์คํํ๋ค.
- JVM์ด ์ด๋ฐ ๊ฒฝ์ฐ๋ค. (C#์ CLR๋ ๋ง์ฐฌ๊ฐ์ง)
JVM?
JVM์ ๋ช ์ธ์ด๋ค. ์ด ๋ช ์ธ๋ฅผ ๋ฐ๋ฅธ ๊ตฌํ์ฒด๋ค์ด ๋ฐ๋ก ์กด์ฌํ๋ค. (HotSpot VM ๋ฑ๋ฑ)
JVM Architecture
Java๋ก ์์ฑ๋ ์ฝ๋๋ Compiler๊ฐ ๋ฐ์ดํธ ์ฝ๋(.class ํ์ผ) ๋ก ๋ณํํ๊ณ , JRE์ ์ํ JVM์ด ์ด ๋ฐ์ดํธ ์ฝ๋๋ฅผ JIT ์ปดํ์ผํ์ฌ ์คํ๋๋ค.
- JDK (Java Development Kit)
- JRE๋ฅผ ํฌํจํ๋ฉฐ, ๊ฐ๋ฐ์ ์ํ ์ปดํ์ผ๋ฌ๋ ๋๋ฒ๊ฑฐ๋ ๊ฐ์ด ์ ๊ณต๋๋ค.
- JRE (Java Runtime Environment)
๊ตฌ์ฑ ์์
Class Loader
Loading
1. ํด๋์ค ์ ๋ณด๋ฅผ ์ฝ์ด์จ๋ค.
- โ.classโ ํ์ผ์ ์ฝ์ผ๋ฉด, ๊ด๋ จ๋ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๊ณ ์ด๋ฅผ method area์ ์ ์ฅํ๋ค.
- method area์ ์ ์ฅ๋๋ ์ ๋ณด๋ค์ ๋ค์๊ณผ ๊ฐ๋ค
- ํจํค์ง ๋ช ์ด ์ ๋ถ ํฌํจ๋ ํด๋์ค ๊ฒฝ๋ก(Fully Qualified Name), ํด๋น ํด๋์ค์ ๋ถ๋ชจ ํด๋์ค
- โ.classโํ์ผ์ด Class์ธ์ง, Interface์ธ์ง Enum์ธ์ง ์ฌ๋ถ
- ์ ๊ทผ ํ์ ์(private, public โฆ)์ ๋ฉ์๋ ์ ๋ณด ๋ฑ
JVM์ด ํด๋์ค๋ฅผ ๋ถ๋ฌ์ฌ ๋ ์ฌ์ฉํ๋ 3๊ฐ์ง ๋ก๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
- Bootstrap ClassLoader
- ์ต์์ ClassLoader์ด๋ค. ์ด ๋ก๋๊ฐ JARํ์ผ์ด๋
$JAVA_HOME/jre/lib
๊ฒฝ๋ก์ ์ฝ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ํจํค์ง๋ฅผ ๋ถ๋ฌ์จ๋ค.
- ์ต์์ ClassLoader์ด๋ค. ์ด ๋ก๋๊ฐ JARํ์ผ์ด๋
- Extension ClassLoader
- Bootstrap ํด๋์ค ๋ก๋์ ํ์ ํด๋์ค์ด๊ณ , Application ClassLoader์ ์์ ํด๋์ค์ด๋ค.
$JAVA_HOME/jre/lib/ext
๊ฒฝ๋ก์์ ํจํค์ง ํ์ผ์ ๋ถ๋ฌ์จ๋ค.
- Application ClassLoader
- ์ด ํด๋์ค๋ก๋๋ classpath์ ํ์ผ๋ค์ ๋ถ๋ฌ์จ๋ค. (๊ธฐ๋ณธ ๊ฒฝ๋ก๊ฐ์ ํ์ฌ ์ดํ๋ฆฌ์ผ์ด์ ๋๋ ํ ๋ฆฌ)
- ํด๋์ค๋ฅผ ๋ชป ์ฐพ์ผ๋ฉด
ClassNotFoundError
๋ฅผ ๋์ง๋ค.
2. ์ ๋ณด๋ฅผ ์ฝ์ด์จ ํ์ ํด๋์ค ํ์ ์ ์ค๋ธ์ ํธ๋ฅผ ์์ฑํ๋ค.
- JVM์ด ํด๋์ค๋ฅผ ์ฒ์ ๋ก๋ฉํด์ค๋ฉด JVM์
java.lang
ํจํค์ง์ ์ ์๋Class
ํด๋์ค์์ ์ค๋ธ์ ํธ๋ฅผ ์์ฑํ๋ค. - ์ด ํด๋์ค ์ค๋ธ์ ํธ๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ํด๋์ค๋ค์ ์ ๋ณด(ํด๋์ค๋ช , ๋ถ๋ชจ ํด๋์ค๋ช , ๋ฉ์๋๋ ๋ณ์ ์ ๋ณด ๋ฑ)๋ฅผ ์ป๊ธฐ ์ํด ์ฌ์ฉํ ์ ์๋ค.
- ํด๋์ค๋ง๋ค ํ๋์ ์ค๋ธ์ ํธ๋ง ์กด์ฌํ๋๋ก ๊ด๋ฆฌ๋๋ค.
- ๊ทธ๋ฆฌ๊ณ ์ด โClassโํ์ ์ค๋ธ์ ํธ๋ ํ์ ์ ์ฅ๋๋ค.
Linking
1. Verification
- .classํ์ผ์ ๋ก๋ฉํด์ฌ ๋, bytecode verifier๋ผ๋ ํ๋ก๊ทธ๋จ์ด .classํ์ผ์ ๊ฒ์ฆํ๋ค.
- ์ ํจํ ์ปดํ์ผ๋ฌ๋ก ์ปดํ์ผ ๋ ๊ฒ์ธ์ง.
- ์ฌ๋ฐ๋ฅธ ๊ตฌ์กฐ, ํฌ๋งท์ธ์ง.
- verification์ค ํ๋๋ผ๋ ์คํจํ๋ฉด JVM์ verifier exception ์๋ฌ๋ฅผ ๋ฐํ์์ ๋์ง๋ค.
2. Preparation
- ๋ง์ฝ ํด๋์ค๊ฐ instance level์ด๊ฑฐ๋ static ๋ณ์๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉด ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ด๊ธฐํ ์ํจ๋ค. (์ค์ ํด๋ ์ด๊ธฐ๊ฐ์ด ์๋)
- ex. boolean โ false, int โ 0, ์ด๋ฐ ์.
3. Resolution
- ์ฐธ์กฐ ๋ณ์๋ค์ ์ค์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ์ผ๋ก ๋ณ๊ฒฝํ๋ค.
Initialization
์ฝ๋๋ก ์ค์ ํ ์ด๊ธฐ๊ฐ๋ค์ด ์ฌ๊ธฐ์ ํ ๋น๋๋ค. ๊ทธ๋ฆฌ๊ณ ํด๋์ค์ ์ ์ ์์ญ๋ค์ด ์คํ๋๋ค.
Memory Area (= Runtime Data Area)
- Method Area
- ๋ชจ๋ ํด๋์ค ์ ๋ณด. (method data, constructor details โฆ)
- JVM๋ง๋ค ํ๋๊ฐ ์กด์ฌํ๋ฉฐ, ๋ค๋ฅธ ์ค๋ ๋๋ค๊ณผ ๊ณต์ ๋๋ ๊ณต๊ฐ์ด๋ค.
- Heap
- ๋ชจ๋ ์ค๋ธ์ ํธ, static ๋ณ์(JAVA 8๋ถํฐ ์ ์ฉ)
- JVM๋ง๋ค ํ๋๊ฐ ์กด์ฌํ๋ฉฐ, ๋ค๋ฅธ ์ค๋ ๋๋ค๊ณผ ๊ณต์ ๋๋ ๊ณต๊ฐ์ด๋ค.
- Stack
- ํจ์ ํธ์ถ๋ง๋ค ์์. ๋ก์ปฌ ๋ณ์๋ค์ด ์ ์ฅ๋๋ค.
- ๊ฐ ์ค๋ ๋๋ง๋ค ์กด์ฌํ๋ฉฐ, ์ค๋ ๋๊ฐ ์ข ๋ฃ๋๋ฉด ํด๋น ์์ญ๋ ์ ๊ฑฐ๋๋ค.
- PC Register
- ๊ฐ ์ค๋ ๋๋ง๋ค ์กด์ฌํ๋ฉฐ, ํ์ฌ ์คํ์ค์ธ ๋ช ๋ น์ด ์์น๋ฅผ ์ ์ฅํ๋ค.
- Native Method Stack
- ๊ฐ ์ค๋ ๋๋ง๋ค ์กด์ฌํ๋ฉฐ, native methods ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค.
Execution Engine
.class
์ฝ๋(bytecode)๋ฅผ ์คํํ๋ค.
Interpreter
- bytecode๋ฅผ ์ฝ์ผ๋ฉด์ machine code๋ก ๋ณํํ๋ค.
JIT compiler
- JVM์ ์ฒ์์ ์ธํฐํ๋ฆฌํฐ๋ฅผ ์ฐ์ง๋ง, ํด์ํด์ผ ํ bytecode๊ฐ ๋ฐ๋ณต์ ์ด๋ฉด, JVM์ JIT๋ฅผ ๋์ ์ฌ์ฉํด์ ์ ์ฒด ์ฝ๋๋ฅผ machine code๋ก ์ปดํ์ผํ๋ค. (๋งค๋ฒ ๊ฐ์ ์ฝ๋์ ๋ํด ์ธํฐํ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ๋ณด๋ค ํ๋ฒ์ ์ปดํ์ผํด์ ์ต์ ํ ํ๋๊ฒ ๋ ๋น ๋ฅด๊ธฐ ๋๋ฌธ)
- JIT compiler๋ ๋ค์๊ณผ ๊ฐ์ 4๊ฐ์ง๋ก ์ด๋ฃจ์ด์ ธ ์๋ค
- Intermediate Code Generator - ์ค๊ฐ ์ฝ๋ ์์ฑ
- Code Optimizer - ์ฝ๋ ์ต์ ํ
- Target Code Generator - ๋จธ์ ์ฝ๋ ์์ฑ
- Profiler - ์ต์ ํ๋ฅผ ์ํด ๋ฐ๋ณต๋๋ ์ฝ๋๋ฅผ ์ฐพ์(hotspot)
GC(Garbage Collector)
- C ๊ฐ์ ์ธ์ด๋ค์ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น/ํด์ ํด์ผ ํ์ง๋ง Java๋ JVM์ด ์์์ ์ฒ๋ฆฌํด์ค๋ค.
- GC๋ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์คํ๋๋ฉด์ ์ฃผ๊ธฐ์ ์ผ๋ก, ๋ ์ด์์ ์ฐธ์กฐ๊ฐ ์๋ Heap ์์ ์ค๋ธ์ ํธ๋ค์ ํด์ ํ๋ค.
- Mark โ ๋ฉ๋ชจ๋ฆฌ์์ ๋ ์ด์ ์ฐ์ง ์๋ ์ค๋ธ์ ํธ๋ค์ ๋งํน.
- Sweep โ ๋งํน๋ ์ค๋ธ์ ํธ๋ค์ ํด์ .
- GC ๋ฐฉ๋ฒ์ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋ค.
- Serial GC โ ์ฑ๊ธ์ค๋ ๋ ํ๊ฒฝ์ผ๋ก ๋์๊ฐ. GC๊ฐ ๋์ํ๋ฉด ์ดํ๋ฆฌ์ผ์ด์ ์ด ๋ฉ์ด๋ฒ๋ฆผ.
- Parallel GC โ ๋ฉํฐ ์ค๋ ๋๋ฅผ ์ด์ฉ. (ํ์ง๋ง ์ฌ์ ํ ์ดํ๋ฆฌ์ผ์ด์ ์ด ๋ฉ์ ๋๊ฐ ์์)
- G1GC
JNI interface
JVM์์ ์คํํ๋ ์๋ฐ ์ฝ๋๊ฐ ๋ค์ดํฐ๋ธ ์์ฉ ํ๋ก๊ทธ๋จ์ด๋ ๋ค๋ฅธ ์ธ์ด๋ก ์์ฑ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํธ์ถ/ํธ์ถ๋๋ ๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ํ๋ ์์ํฌ. .dll ๋๋ .so ํฌ๋งท.