Java Vertual Machine
νλ‘κ·Έλ¨μ μ€ννκΈ° μν΄ λ¬Όλ¦¬μ λ¨Έμ (μ»΄ν¨ν°) κ³Ό μ μ¬νκ² λ§λ λ¨Έμ μ μννΈμ¨μ΄λ‘ ꡬνν κ²μΌλ‘
μ€μ λ‘ Java Byte Code λ₯Ό μ€νν μ μλ νλ‘μΈμ€ κ°μ λ¨Έμ μ΄λ€.
OS λ³λ‘ μ’
λ₯κ° λ€λ₯Έλ° MS Window & Linux λ±μ νκ²½μμλ HotSpot VM
, IBM AIX μ κ²½μ°μλ IBM J9
μ΄ μ¬μ©λλ€.
νΉμ§
- μλ°μ κ°μλ¨Έμ μΌλ‘ OS μ μ’ μμ μ΄μ§ μμ λ 립μ μΌλ‘ μ΄μλλ€.
- GC (Garbage Collection) μ μ¬μ©μμ μν΄ λͺ μλμ§ μμΌλ©° μλμΌλ‘ λ©λͺ¨λ¦¬ κ΄λ¦¬κ° λλ€.
νλ‘κ·Έλ¨μ΄ μ€νλλ©΄ JVM μ OS λ‘λΆν° νλ‘κ·Έλ¨μ΄ νμλ‘νλ λ©λͺ¨λ¦¬λ₯Ό ν λΉ λ°κ³ , JVM μ μ΄ λ©λͺ¨λ¦¬λ₯Ό μ©λμ λ°λΌ μ¬λ¬ μμμΌλ‘ λλμ΄ κ΄λ¦¬ νλ€.
JVM μΈλΆ
Java λ‘ μμ±ν μ½λλ Class Loader κ° μ»΄νμΌλ Java Byte Code λ₯Ό Runtime Data Areas μ λ‘λνκ³ Excution Engine μ΄ Java Byte Code λ₯Ό μ€ν
Compile Running
- μμ€μ½λλ₯Ό μμ±
- Compiler λ JAVA μμ€μ½λλ₯Ό μ΄μ©νμ¬ ν΄λμ€ νμΌμ μμ±
- μ»΄νμΌλ νμΌμ JVM (Java Virtual Machine) μ΄ μΈμ κ°λ₯ν λ°μ΄λ리 νμΌλ‘ λ³ν
- JVM μ ν΄λμ€ νμΌμ λ°μ΄λ리 μ½λλ₯Ό ν΄μνμ¬ νλ‘κ·Έλ¨μ μ€ν
- μν κ²°κ³Όκ° μ»΄ν¨ν°μ λ°μ
Class Loader
μλ°λ Runtime μμ Class λ₯Ό λ‘λνκ³ λ§ν¬νλ Dynamic Loading νΉμ§ μ΄ μλ€.
μ΄ Dynamic Loading νΉμ§μ λ΄λΉνλ λΆλΆμ΄ Class Loader μ΄λ€.
Class Loader λ λ‘λλ ν΄λμ€λ₯Ό 보κ΄νλ Namespace λ₯Ό κ°λλ°,
μ΄λ―Έ λ‘λλ ν΄λμ€ μΈμ§ νμΈνκΈ° μνμ¬ Namespace μ 보κ΄λ FQCN
μ κΈ°μ€μΌλ‘ ν΄λμ€λ₯Ό μ°Ύλλ€.
FQCN (Fully Qualified Class Name) ?
ν΄λμ€κ° μν ν¨ν€μ§λͺ
μ λͺ¨λ ν¬ν¨ν μ΄λ¦μ λ§νλ€.
λ³΄ν΅ java.lang.String s = new java.lang.String();
κ³Ό κ°μ΄ Alias Name (μΆμ½) νμ΄ μλ ν¨ν€μ§λ₯Ό λͺ¨λ ν¬ν¨ν κ²½λ‘
Class Loader μμλ λΉλ‘ FQCN μ΄ κ°λλΌλ Namespace κ° λ€λ₯΄λ©΄ λ€λ₯Έ ν΄λμ€λ‘ κ°μ£Ό
Class Loader μ λνμ μΈ μνμ μ¬μ©μκ° μμ±ν Java Byte Code λ₯Ό JVM λ©λͺ¨λ¦¬μμ μ¬λ €μ£Όλ μνμ νλ€.
νΉμ§
ν΄λμ€ λ‘λλ λ€μκ³Ό κ°μ νΉμ§μ΄ μλ€.
- Hierarchical (κ³μΈ΅ ꡬ쑰)
- ν΄λμ€ λ‘λλΌλ¦¬ λΆλͺ¨ <-> μμ κ΄κ³λ₯Ό μ΄λ£¨μ΄ κ³μΈ΅ κ΅¬μ‘°λ‘ κ΅¬μ±λλ€.
- μ΅ μμ ν΄λμ€ λ‘λλ λΆνΈμ€νΈλ© (Bootstrap Class Loader) ν΄λμ€ λ‘λμ΄λ€.
- Delegate Load Request (μμ λͺ¨λΈ)
- κ³μΈ΅ ꡬ쑰λ₯Ό κΈ°λ°μΌλ‘ ν΄λμ€ λ‘λλΌλ¦¬ λ‘λλ₯Ό μμνλ κ΅¬μ‘°λ‘ λμ νλ€.
- ν΄λμ€λ₯Ό λ‘λν λ λ¨Όμ μμ ν΄λμ€λ‘λλ₯Ό νμΈνμ¬ μ‘΄μ¬νλ©΄ ν΄λΉ ν΄λμ€λ₯Ό μ¬μ©νκ³ μμΌλ©΄ μμ² λ°μ ν΄λμ€ λ‘λκ° ν΄λμ€λ₯Ό λ‘λνλ€.
- Have Visibility Constraint (κ°μμ±)
- νμ (μμ) ν΄λμ€ λ‘λλ μμ (λΆλͺ¨) ν΄λμ€ λ‘λλ₯Ό μ°Ύμμ μμ§λ§ κ·Έ λ°λμ κ²½μ° (λΆλͺ¨ -> μμ) μ μμ μ μλ€.
- Cannot unload Classes (μΈλ‘λ λΆκ°)
- ν΄λμ€ λ‘λλ Unload κΈ°λ₯μ νμ§ μλλ€. (Unload λ GC μλμΌλ‘ ν¨)
μμ² μ²λ¦¬
Class Loader κ° Class Load λ₯Ό μμ² λ°μΌλ©΄, μλ μμλλ‘ κ²μμ νλ€.
Bootstrap Class Loader κΉμ§ νμΈν΄λ μμΌλ©΄ μμ² λ°μ ν΄λμ€ λ‘λκ° νμΌ μμ€ν μμ ν΄λΉ ν΄λμ€λ₯Ό μ°Ύμ
μ°Έκ³ μλ£
Runtime Data Areas
Class Loader
μμ λ‘λν΄μ€ λ°μ΄ν°λ₯Ό 보κ΄νμ¬ μ ν리μΌμ΄μ
μ μννλ€.
μ΄ μν μμ
μμ μ¬μ©λλ μ μ₯ λ° μ°Έμ‘°λ‘ νλ λ©λͺ¨λ¦¬ μμμ΄λ€.
Method Area
- λͺ¨λ Thread κ° κ³΅μ νλ λ©λͺ¨λ¦¬ μμ
class
interface
method
field
static valuable
byte code
λ±μ 보κ΄
- μν¬νΈλ ν΄λμ€κ° λ‘λλλ μμ
Heap Area
- νλ‘κ·Έλ¨ μμμ λ°μ΄ν°λ₯Ό μ μ₯νκΈ° μν΄ λμ μΌλ‘ ν λΉνμ¬ μ¬μ© νλ λ©λͺ¨λ¦¬ μμ
- μ€μ λ‘ Runtime μ λμ μΌλ‘ ν λΉνμ¬ μ¬μ©νλ μμ
- μλ° νλ‘κ·Έλ¨μ
new
μ°μ°μλ₯Ό μ¬μ©νμ¬ κ°μ²΄λ₯Ό λμ μΌλ‘ μμ±- Method Area μ λ‘λλ ν΄λμ€λ§ μμ± κ°λ₯
class
λ₯Ό μ΄μ©νμ¬instance
λ₯Ό μμ±νλ©΄ ν΄λΉ μμμ μ μ₯νμ¬ μ¬μ©
- μ¬λ¬ Thread κ° μ΄ μμμ 곡μ νλ€.
- μ΄ μμμ GC (Garbage Collector) λ₯Ό ν΅ν΄μλ§ λ©λͺ¨λ¦¬ ν΄μ κ° κ°λ₯ νλ€. (GC μ μ€μ μ μΈ λμ)
- Method μμμ΄ ν΄λμ€ μ 보λ₯Ό μ°Έκ³ νμ¬ μΈμ€ν΄μ€λ₯Ό μμ±νλ κ³³ μ΄λ€.
Stack Area
- Method κ° νΈμΆλ λλ§λ€
Stack Frame
μ΄λΌλ λ°μ΄ν° μμμ΄ μμ±νμ¬ κ΅¬μ±- Method μ μ¬μ©λλ Thread μ μν μ 보λ₯Ό
Stack Frame
μ ν΅ν΄μ μ μ₯ - Thread κ° μμλ λ μμ±νλ©°, Thread λ³λ‘ μμ±λκΈ° λλ¬Έμ λ€λ₯Έ Thread λ μ κ·Ό ν μ μλ€.
- Method μ μ¬μ©λλ Thread μ μν μ 보λ₯Ό
- Method μ μ 보, Local Valuable, Argument λ±μ μ°μ° μ€ λ°μλλ μμ λ°μ΄ν° λ±μ΄ μ μ₯ λλ€.
- Method μν λλ λμλ§ μ¬μ©λλ©° λ©μλμ μνμ΄ λλλ©΄ νμ μκ² λλ€.
- Method κ° νΈμΆλ λλ νμλ‘νλ λ³μλ₯Ό Stack μ μ μ₯ νκ³ , Method μ€νμ΄ λλλ©΄ Stack μ λ°ν νλ€.
- μ€νμ€μΈ Thread μ λ°λΌ κ°κ° κ΅¬μ± νκ² λλ€.
PC Register
- μ€νμ€μΈ κ° Thread λ λ³λμ PC Register λ₯Ό κ°μ§λ©°, λͺ λ Ήμ΄ μ€νλλ©΄ νμ¬ μ€νμ€μΈ λͺ λ Ήμ μ£Όμλ₯Ό μ μ§νλ€.
Native Method Stack
- JAVA μΈμ μΈμ΄λ‘ μμ±λ λ€μ΄ν°λΈ μ½λλ€μ μν Stack
- JNI (Java Native Interface) λ₯Ό ν΅νμ¬ νΈμΆλλ C/C++ λ±μ μ½λλ₯Ό μννκΈ° μν Stack
- μ ν리μΌμ΄μ
μμ Native Method λ₯Ό νΈμΆνκ² λλ©΄ λ΄λΆμ
Stack Frame
μ μμ±νμ¬ Push νλ€.- JNI λ₯Ό μ΄μ©νμ¬ JVM λ΄λΆμ μν₯μ μ£Όμ§ μκΈ° μν¨
- Native Method Stack μ μ€νν λλ JVM μ κ±°μΉμ§ μκ³ λ°λ‘ μννλ€.
Thread λ§λ€ νλμ© μμ±
- PC Register
- JVM Stack
- Native Method Stack
Thread λΌλ¦¬ 곡μ
- Heap Area
- Method Area
- Runtime Constant Pool
μ°Έκ³ μλ£
http://limkydev.tistory.com/51
http://postitforhooney.tistory.com/entry/JavaJVM-JVM-μ΄ν΄λ₯Ό-ν΅ν-Java-μλμ리-μ΄ν΄νκΈ°
https://m.blog.naver.com/PostView.nhn?blogId=choigohot&logNo=40192701035&proxyReferer=https%3A%2F%2Fwww.google.com%2F
https://medium.com/@lazysoul/jvm-μ΄λ-c142b01571f2
http://blog.jamesdbloom.com/JVMInternals.html
Excution Engine
Class Loader λ₯Ό ν΅νμ¬ JVM λ©λͺ¨λ¦¬μμ λ°°μΉλμ΄ μλ λ°μ΄νΈ μ½λλ₯Ό Excution Engine μ μν΄ μ€νλλ€.
Excution Engine λ Java Byte Code λ₯Ό λͺ λ Ήμ΄ λ¨μλ‘ μ½μ΄μ μ€ννλ€. (CPU κ° κΈ°κ³μ΄ & λͺ λ Ήμ΄ λ₯Ό νλμ© μ½μ΄μ μ€ννλ κ² κ³Ό λΉμ·νλ€ )
Java Byte Code μ κ° λͺ
λ Ήμ΄λ 1 Byte μ OpCode
μ μΆκ° νΌ μ°μ°μλ‘ μ΄λ£¨μ΄μ Έ μμΌλ©°, μ€ν μμ§μ νλμ OpCode
λ₯Ό κ°μ Έμμ νΌ μ°μ°μμ ν¨κ» μμ
μ μνν λ€μ, OpCode
λ₯Ό μννλ μμΌλ‘ λμ
Java Byte Code λ κΈ°κ³μ΄μ κ°κΉκΈ° 보λ€λ λΉκ΅μ μΈκ°μ΄ 보기 νΈν ννλ‘ κΈ°μ νλ€.
Excution Engine λ μ΄μ κ°μ΄ λ°μ΄νΈ μ½λκ° μ€μ λ‘ JVM λ΄λΆμμ κΈ°κ³κ° μ€νν μ μλ ννλ‘ λ³κ²½
μ΅μ΄μ JVM μ Interpreter
λ°©μμΌλ‘ μνλμλ€.
Interpreter (μΈν°ν리ν°)
Byte Code
λͺ
λ Ήμ΄λ₯Ό νλμ© μ½μ΄μ ν΄μνλ€.
μ΄λ‘ μΈν΄ μ€νμ΄ λ리λ€λ λ¨μ μ κ°μ§κ³ μλ€.
μ΄λ₯Ό κ°μ νκΈ° μν΄ JIT Compiler
λ₯Ό λμ
νμ¬ κ°μ μ νλ€.
JIT (Just In Time) Compiler
Interpreter
λ°©μμΌλ‘ μ€ννλ€ μ μ ν(?) μμ μ Byte Code
μ 체λ₯Ό Compile
νμ¬ Native Code
λ‘ λ³κ²½νλ©° μ΄νμλ ν΄λΉ λ©μλλ₯Ό λ μ΄μ Interpreting νμ§ μκ³ Native Code
λ‘ μ§μ μ€ννλ λ°©μ
Native Code
λ₯Ό μ€ννλ κ²μ΄ λͺ
λ Ήμ΄ λ¨μλ‘ Interpreting
νλκ²λ³΄λ€ λΉ λ₯΄λ©°, Native Code
λ λ΄λΆ μΊμμ 보κ΄νκΈ° λλ¬Έμ νλ² Compile
ν μ½λλ κ³μ λΉ λ₯΄κ² μν
JIT Compile κ³Όμ μ Byte Code
λ₯Ό Interpreting νλκ²λ³΄λ€ λ§μ λΉμ©μ΄ λ°μνμ¬, λ§μ½ νλ²λ§ μ€νλλ μ½λλΌλ©΄ Compile
νμ§ μκ³ Interpreting νλκ²μ΄ ν¨μ¬ μ 리νλ€.
λ΄λΆμ μΌλ‘ ν΄λΉ Method κ° μΌλ§λ μμ£Ό μνλκ³ μ²΄ν¬νμ¬ μΌμ μ λμ μμ€μ΄ λμλλ§ Compile
μν
finalize Method
κ°μ²΄κ° μλ©Έλ λ νΈμΆλλ λ©μλ
μΌλ°μ μΌλ‘ GC μμ κ°μ²΄ λ©λͺ¨λ¦¬λ₯Ό ν΄μ§ν λ νΈμΆλλ―λ‘ μ¬μ©μ΄ κΆμ₯ λμ§ μλλ€.