๐ฆ JVM ์ ๋ฆฌ ๐ฆ
JVM
Java Virtual Machine
Java๋ฅผ ์คํํ๊ธฐ ์ํ ๊ฐ์ ๋จธ์ , Java API์ ํจ๊ป ์คํ
- Java application์ JVM ์์์ ๋์ํ์ง ์์ > OS ์ข
์์ X
- Garbage Collection์ ํตํ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ > ์๋ ๋ฉ๋ชจ๋ฆฌ ์ต์ ํ
- Stack ๊ธฐ๋ฐ ๊ฐ์ ๋จธ์
- Class Loader, Execution Engine, Runtime Data Area์ผ๋ก ์ด๋ฃจ์ด์ง
๋์ ๊ณผ์
- ํ๋ก๊ทธ๋จ ์คํ ์ JVM์ OS๋ก๋ถํฐ ๋ฉ๋ชจ๋ฆฌ ํ ๋น
- Java Compiler(Javac)๊ฐ Java Source code(.java)๋ฅผ Java byte code(.class)๋ก Compile
- Class Loader๋ ๋์ ๋ก๋ฉ์ ํตํด ํ์ํ ํด๋์ค๋ค์ Loading, Linkingํด Runtime Data Area์ ์ฌ๋ฆผ
- Runtime Data Area์ Loading๋ byte code๋ Execution Engine์ ํตํด ํด์
- ์ด ๊ณผ์ ์์ Execution Engine์ ์ํด Garbage Collector์ ์๋๊ณผ Thread ๋๊ธฐํ๊ฐ ์ด๋ฃจ์ด์ง
๊ตฌ์ฑ
- Class Loader
- Execution Engine
- Interpreter
- JIT Compiler
- Garbage collector
- Runtime Data Area
- Method Area
- Heap Area
- PC Register
- Stack Area
- Native Method
- JNI - Native Method Interface
- Native Method Library

Class Loader
jar ํ์ผ ๋ด ์ ์ฅ๋ ํด๋์ค๋ฅผ ๋์ ์ผ๋ก JVM์ Heap์ ํ์ฌํ๋ ์ญํ
.class ํ์ผ์ ๋ก๋ - ํ๋ก๊ทธ๋จ์ด ์คํ ์ค์ธ Runtime์์ ๋ชจ๋ ์ฝ๋๊ฐ JVM๊ณผ ์ฐ๊ฒฐ
- Loading ์ ํ๋ฒ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆฌ์ง ์๊ณ , ์ดํ๋ฆฌ์ผ์ด์
์์ ํ์ํ ๊ฒฝ์ฐ ๋์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ์ ์ฌ
Loading ์์
- Loading : ํด๋์ค ํ์ผ์ ๊ฐ์ ธ์ JVM์ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋
- Linking : ํด๋์ค ํ์ผ์ ์ฌ์ฉํ๊ธฐ ์ํด ๊ฒ์ฆ
- Verifying(๊ฒ์ฆ) : ์ฝ์ด๋ค์ธ ํด๋์ค๊ฐ JVM ๋ช
์ธ์ ๋ง๋์ง ๊ฒ์ฌ
- Preparing(์ค๋น) : ํด๋์ค๊ฐ ํ์๋ก ํ๋ ๋ฉ๋ชจ๋ฆฌ ํ ๋น
- Resolving(๋ถ์) : ํด๋์ค์ ์์ ํ ๋ด ๋ชจ๋ ์ฌ๋ณผ๋ฆญ ๋ ํผ๋ฐ์ค๋ฅผ ๋ค์ด๋ ํธ ๋ ํผ๋ฐ์ค๋ก ๋ณ๊ฒฝ
- Initialization : ํด๋์ค ๋ณ์๋ค์ ์ ์ ํ ๊ฐ์ผ๋ก ์ด๊ธฐํ
ex) static ํ๋๋ค์ ์ค์ ๋ ๊ฐ์ผ๋ก ์ด๊ธฐํ
Compile
์ปดํจํฐ์ ๊ณ ๊ธ ์ธ์ด๋ก ์์ฑํ ์ฝ๋๋ฅผ ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญํ๋ ๊ณผ์
Compiler
ํ๋ก๊ทธ๋จ ์ ์ฒด๋ฅผ ์ค์บํด ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญ
- ์ ์ฒด๋ฅผ ์ค์บํด ์ด๊ธฐ ์ค์บ์ด ์ค๋ ๊ฑธ๋ฆผ
- ์ด์ ์ ๋ง๋ค์ด ๋์๋ ์คํํ์ผ์ ์คํํ๊ธฐ ๋๋ฌธ์ ์ ์ฒด ์คํ ์๊ฐ์์๋ Interpreter๋ณด๋ค ๋น ๋ฆ
- ํ์ง๋ง ๊ธฐ๊ณ์ด ๋ฒ์ญ ๊ณผ์ ์์ Object Code ํ์ผ์ ๋ง๋๋๋ฐ, ์ด๋ฅผ ๋ฌถ์ด ํ๋์ ์คํ ํ์ผ๋ก ๋ค์ ๋ง๋๋ Linking ์์
๋๋ฌธ์ Interpreter๋ณด๋ค ๋ง์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ
- ์ค๋ฅ ๋ฉ์์ง ์์ฑ ์ ์ ์ฒด ์ฝ๋ ๊ฒ์ฌ ํ ์์ฑ => ์คํ ์ ์ค๋ฅ ๋ฐ๊ฒฌ ๊ฐ๋ฅ
ex) C, C++, Java ๋ฑ
Interpreter
Compiler์๋ ๋ฐ๋๋ก ํ๋ก๊ทธ๋จ ์คํ ์ ํ ๋ฒ์ ํ ๋ฌธ์ฅ์ฉ ๋ฒ์ญ
- Compiler๋ณด๋ค ์คํ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆผ
- Compiler์ ๋ฌ๋ฆฌ Object Code ํ์ผ์ ์์ฑํ๊ฑฐ๋ Linking ์์
์ ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ํจ์จ ๋ ์ข์
- ํ๋ก๊ทธ๋จ์ ํ ๋ฌธ์ฅ์ฉ ์คํ์ํค๋ฉด์ ์ค๋ฅ๋ฅผ ๋ง๋๋ฉด ๋ฐ๋ก ํ๋ก๊ทธ๋จ์ ์ค์ง => ํ๋ก๊ทธ๋จ์ ์คํํด์ผ๋ง ์ค๋ฅ ๋ฐ๊ฒฌ ๊ฐ๋ฅ
ex) Python, Ruby, JavaScript ๋ฑ
Compiler vs Interpreter
| ์ค๋ช
| Compriler | Interpreter |
|---|
| ์ค์บ ์์ญ | ์ ์ฒด | ํ ๋ฒ์ ํ ๋ฌธ์ฅ |
| ์คํ ์๊ฐ | ์ธํฐํ๋ฆฌํฐ๋ณด๋ค ๋น ๋ฆ | ์ปดํ์ผ๋ฌ๋ณด๋ค ๋๋ฆผ |
| ๋ฉ๋ชจ๋ฆฌ ํจ์จ | ์ธํฐํ๋ฆฌํฐ๋ณด๋ค ์์ข์ | ์ปดํ์ผ๋ฌ๋ณด๋ค ์ข์ |
| ์ค๋ฅ ๋ฉ์์ง | ์ ์ฒด ์ฝ๋ ๊ฒ์ฌ ํ ์์ฑ | ์ค๋ฅ ๋ง๋๋ฉด ์ค์ง |
Execution Engine
Class Loader๋ฅผ ํตํด Runtime Data Area์ ๋ฐฐ์น๋ byte code๋ฅผ ๋ช
๋ น์ด ๋จ์๋ก ์ฝ์ด์ ์คํ
- Interpreter์ JIT(Just In Time)์ผ๋ก ํด๋์ค ์คํ
- Garbage Collector๋ก ์ฌ์ฉํ์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐพ์ ์ญ์
JIT(Just In Time)
์ธํฐํ๋ฆฌํฐ ๋ฐฉ์์ผ๋ก ์คํํ๋ค๊ฐ ์ ์ ํ ์์ ์ ๋ฐ์ดํธ ์ฝ๋ ์ ์ฒด๋ฅผ ์ปดํ์ผ -> Native code๋ก ๋ณ๊ฒฝํ๊ณ , ์ดํ์๋ ๋ ์ด์ ์ธํฐํ๋ฆฌํ
ํ์ง ์๊ณ Native Code๋ก ์ง์ ์คํ
- ์ธํฐํ๋ฆฌํฐ์ ๋จ์ (์๋ ๋๋ฆผ) ๋ณด์์ ์ํด ๋์
- Native Code
- Java์์ ๋ถ๋ชจ๊ฐ ๋๋ C์ธ์ด, C++, ์ด์
๋ธ๋ฆฌ์ด๋ก ๊ตฌ์ฑ๋ ์ฝ๋
- ์บ์์ ๋ณด๊ด๋จ
- ์ปดํ์ผ ์ ๋ฐ๋ ๋ถ๋ถ๋ง ์ปดํ์ผํ๊ณ ๋๋จธ์ง๋ ์บ์ฑ๋ ์ฝ๋๋ฅผ ์ํ
=> ํ ๋ฒ ์ปดํ์ผ๋ ์ฝ๋๋ ๋น ๋ฅด๊ฒ ์ํ
RunTime Data Area
ํ๋ก๊ทธ๋จ ์ํ์ ์ํด ์ด์์ฒด์ ๋ก๋ถํฐ ํ ๋น๋ฐ์ ๋ฉ๋ชจ๋ฆฌ ์์ญ
Heap Area
๊ฐ์ฒด ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ๊ฐ์์ ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์์ญ
- ๋ชจ๋ Thread์์ ์ ๊ทผ ๊ฐ๋ฅํ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์์ญ
new ์ฐ์ฐ์๋ฅผ ํตํด ๊ฐ์ฒด๋ฅผ Heap ๋ฉ๋ชจ๋ฆฌ์ ์ ๋ฌ
- ํ ๋น๋ ๊ฐ์ฒด๋ ์ง์ ํด์ ๊ฐ ๋ถ๊ฐ๋ฅํ๋ฉฐ, ์ฃผ๊ธฐ์ ์ผ๋ก GC๊ฐ ์ ๊ฑฐ
Garbage Collector(GC)
JVM์ Heap ์์ญ์์ ๋์ ์ผ๋ก ํ ๋นํ๋ ๋ฉ๋ชจ๋ฆฌ ์ค ํ์ ์๊ฒ ๋ ๋ฉ๋ชจ๋ฆฌ ๊ฐ์ฒด(Garbage)๋ฅผ ๋ชจ์ ์ฃผ๊ธฐ์ ์ผ๋ก ์ ๊ฑฐํ๋ ํ๋ก์ธ์ค
- GC๊ฐ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์๋์ผ๋ก ํด์ค์ผ๋ก์จ ๊ฐ๋ฐ์๊ฐ ๊ฐ๋ฐ์๋ง ์ง์คํ ์ ์๊ฒ ๋จ
- ์คํ์ด ๋๋ ๋ค ๋ฒ๋ ค์ง๋ ๊ฐ์ฒด๋ค์ ์ฃผ๊ธฐ์ ์ผ๋ก ๋น์์ค์ผ๋ก์จ ํ์ ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๊ฒ ํด์ค
- ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ธ์ ํด์ ๋๋์ง ์ ํํ ์ ์ ์์ด ์ ์ดํ๊ธฐ ํ๋ฆ
- GC๊ฐ ๋์ํ๋ ๋์ JVM์ด ๋ค๋ฅธ ๋์์ ๋ฉ์ถ๊ธฐ ๋๋ฌธ์ Overhead ๋ฐ์(Stop-The-World) > ์ํํธ์จ์ด ์ฑ๋ฅ ํ๋ฝ ์์ธ
- ์ดํ๋ฆฌ์ผ์ด์
์ ์ฌ์ฉ์ฑ์ ์ ์งํ๋ฉด์ ํจ์จ์ ์ด๊ฒ GC๋ฅผ ์คํํ๋ ์ต์ ํ ์์
์ด ํ์ > GC ํ๋
Stack Area
- ๋ฉ์๋ ํธ์ถ ์ ์์ฑ๋๋ ์ค๋ ๋ ์ํ์ ๋ณด๋ฅผ ๊ธฐ๋กํ๋ Frame ์ ์ฅ
- ๋ฉ์๋ ์ ๋ณด, ์ง์ญ ๋ณ์, ๋งค๊ฐ๋ณ์, ์ฐ์ฐ ์ค ๋ฐ์ํ๋ ์์ ๋ฐ์ดํฐ ์ ์ฅ
Method Area
JVM์์ ์ฝ์ด๋ค์ธ ํด๋์ค์ ์ธํฐํ์ด์ค์ ๋ํ ์์ ํ, ๋ฉ์๋์ ํ๋, static ๋ณ์, ๋ฉ์๋ ๋ฐ์ดํธ ์ฝ๋ ๋ฑ์ ๋ณด๊ด
PC Register
- ์ฐ์ฐ ๋ฐ ๊ฒฐ๊ณผ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ๋ฌํ๊ธฐ ์ CPU ๋ด ๊ธฐ์ต์ฅ์น
- ํ์ฌ ์คํ ์ค์ธ JVM ์ฃผ์๋ฅผ ๊ฐ์ง๋ฉฐ, CPU ๋ช
๋ น์ด(=Instruction) ์ํ
- CPU Instruction ์ํ ๋์ ํ์ํ ์ ๋ณด๋ฅผ CPU ๋ด ๊ธฐ์ต ์ฅ์น์ธ Register์ ์ ์ฅ
Native Method Stack
์๋ฐ ์ธ์ ์ธ์ด๋ก ์์ฑ๋ Native code๋ฅผ ์ํ ๋ฉ๋ชจ๋ฆฌ
- C, C++ ๋ฑ์ ์ฝ๋๋ฅผ ์ํํ๊ธฐ ์ํ ์คํ
- Native ๋ฉ์๋์ ๋งค๊ฐ๋ณ์, ์ง์ญ๋ณ์ ๋ฑ์ ๋ฐ์ดํธ์ฝ๋๋ก ์ ์ฅ
Heap Area์ Method Area๋ JVM ์์ ์ ์์ฑ๋๊ณ , ์ข
๋ฃ ์ ํด์ ๋จ
๋๋จธ์ง Area๋ Thead ์์ฑ ์ ์์ฑ, ์ข
๋ฃ ์ ํด์
์ด๋ฏธ์ง ์ถ์ฒ ๋ฐ ์ฐธ๊ณ -JVM
์ฐธ๊ณ -Compile, Compiler์ Interpreter
์ฐธ๊ณ -JVM ๋ด๋ถ ๊ตฌ์กฐ
์ฐธ๊ณ -Garbage Collection