[Java] μλ° κ°μ λ¨Έμ (Java Virtual Machine)
JVM(Java Virtual Machine)
- Javaλ‘ κ°λ°ν νλ‘κ·Έλ¨μ μ€ννκΈ° μν κ°μλ¨Έμ . μλ° κ°μ λ¨Έμ μ λ»νλ λ§λ‘ λ°μ΄νΈμ½λλ₯Ό μ€ννλ 주체μ΄λ€. μ΄μ체μ μμμ λμνλ―λ‘ νλ«νΌμ λ 립μ μΌλ‘ Java νλ‘κ·Έλ¨μ μ€νν μ μλ€.
- νλ‘κ·Έλ¨ λ©λͺ¨λ¦¬λ₯Ό κ΄λ¦¬νκ³ μ΅μ ννλ κ²
물리μ μΈ μ€μ μ κΈ°κ³κ° μλλΌ μΆμμ μΈ μ₯μΉμ΄λ€.
μλ° μ ν리μΌμ΄μ μ ν΄λμ€ λ‘λ(Class Loader)λ₯Ό ν΅ν΄ μ½μ΄ λ€μ¬μ μλ° APIμ ν¨κ» μ€ννλ κ²
μλ° μ½λλ₯Ό μ€ννκΈ° μν΄μλ μλ°μμ javac λͺ λ Ήμ ν΅ν΄ λ°μ΄νΈμ½λ(.class)λ₯Ό λ§λ€κ³ , λ°μ΄νΈμ½λλ₯Ό JVMμ΄ μΈν°νλ¦¬ν° λ°©μμΌλ‘ κΈ°κ³μ΄λ‘ λ²μνλ©° μ€ννλ€.
JVM ꡬμ±μμ
1. Class Loader
JVMμ λ°νμμμ μ²μμΌλ‘ ν΄λμ€λ₯Ό μ°Έμ‘°ν λ ν΄λΉ ν΄λμ€λ₯Ό λ‘λνκ³ λ©λͺ¨λ¦¬ μμμ λ°°μΉμν΄. μ΄ λμ λ‘λλ₯Ό λ΄λΉνλ λΆλΆμ΄ λ°λ‘ ν΄λμ€ λ‘λ
2. GC (Garbage Collector)
μλ° μ΄μ μλ νλ‘κ·Έλλ¨Έκ° λͺ¨λ νλ‘κ·Έλ¨ λ©λͺ¨λ¦¬λ₯Ό κ΄λ¦¬νμ νμ§λ§, μλ°μμλ JVMμ΄ νλ‘κ·Έλ¨ λ©λͺ¨λ¦¬λ₯Ό κ΄λ¦¬ν¨!
JVMμ κ°λΉμ§ 컬λ μ μ΄λΌλ νλ‘μΈμ€λ₯Ό ν΅ν΄ λ©λͺ¨λ¦¬λ₯Ό κ΄λ¦¬ν¨. κ°λΉμ§ 컬λ μ μ μλ° νλ‘κ·Έλ¨μμ μ¬μ©λμ§ μλ λ©λͺ¨λ¦¬λ₯Ό μ§μμ μΌλ‘ μ°Ύμλ΄μ μ κ±°νλ μν μ ν¨.
μ€νμμ : μ°Έμ‘°λμ§ μμ κ°μ²΄λ€μ νμ ν μμ → μμ λ κ°μ²΄μ λ©λͺ¨λ¦¬ λ°ν → ν λ©λͺ¨λ¦¬ μ¬μ¬μ©
3. Execution Engine
ν΄λμ€ λ‘λλ₯Ό ν΅ν΄ JVM λ΄μ λ°νμ λ°μ΄ν° μμμ λ°°μΉλ λ°μ΄νΈμ½λλ μ€ν μμ§μ μν΄ μ€νλλ€. μ€ν μμ§μ μλ° λ°μ΄νΈμ½λλ₯Ό λͺ λ Ήμ΄ λ¨μλ‘ μ½μ΄μ μ€ννλ€.
- μΈν°ν리ν°
- JIT(Just-In-Time) μ»΄νμΌλ¬
JIT μ»΄νμΌλ¬
μΈν°ν리ν°μ λ¨μ μ 보μνκΈ° μν΄ λμ λ κ²μ΄ JIT μ»΄νμΌλ¬μ΄λ€. μΈν°νλ¦¬ν° λ°©μ(μ€νμμ μ λ°μ΄νΈμ½λλ₯Ό κΈ°κ³μ΄λ‘ λ²μνμ¬ μ€ννλ κ²)μΌλ‘ μ€ννλ€κ° μ μ ν μμ μ λ°μ΄νΈμ½λ μ 체λ₯Ό μ»΄νμΌνμ¬ λ€μ΄ν°λΈ μ½λλ‘ λ³κ²½νκ³ , μ΄νμλ ν΄λΉ λ©μλλ₯Ό λ μ΄μ μΈν°ν리ν νμ§ μκ³ λ€μ΄ν°λΈ μ½λλ‘ μ§μ μ€ννλ λ°©μμ΄λ€. λ€μ΄ν°λΈ μ½λλ₯Ό μ€ννλ κ²μ΄ νλμ© μΈν°ν리ν νλ κ²λ³΄λ€ λΉ λ₯΄κ³ , λ€μ΄ν°λΈ μ½λλ μΊμμ 보κ΄νκΈ° λλ¬Έμ ν λ² μ»΄νμΌλ μ½λλ κ³μ λΉ λ₯΄κ² μνλκ² λλ€.
(= μΈν°νλ¦¬ν° λ°©μμ μ€νμ€μ λ°μ΄νΈμ½λλ₯Ό ν μ€μ© μ½μΌλ©΄μ μ½λλ₯Ό μ€ννκΈ° λλ¬Έμ λμΌν λ©μλλ₯Ό μ€ννλ κ²½μ° μ€λ³΅ν΄μ λ²μνλ λΉν¨μ¨μ΄ μλ€. μ΄λ₯Ό λ°©μ§νκΈ° μν΄ λ²μν λ΄μ©μ μΊμ±ν΄ λμλ€κ° λμΌν λ©μλλ₯Ό μ€νν κ²½μ° μΊμ±λ λ΄μ©μ μ€ννλ€.)
∴ μΈν°νλ¦¬ν° λ°©μ(μ€νμ€ ν μ€μ© μ½μΌλ©° μ€ν)κ³Ό μ μ μ»΄νμΌ λ°©μ(μ€ννκΈ° μ νλ‘κ·Έλ¨ μ½λλ₯Ό κΈ°κ³μ΄λ‘ λ²μ - μΊμ±)μ΄ νΌν©λ νν
JIT μ»΄νμΌλ¬κ° μ»΄νμΌνλ κ³Όμ μ λ°μ΄νΈμ½λλ₯Ό νλμ© μΈν°ν리ν νλ κ²λ³΄λ€ ν¨μ¬ μ€λ 걸리λ―λ‘, λ§μ½ ν λ²λ§ μ€νλλ μ½λλΌλ©΄ μ»΄νμΌνμ§ μκ³ μΈν°ν리ν νλ κ²μ΄ ν¨μ¬ μ 리νλ€. λ°λΌμ, JIT μ»΄νμΌλ¬λ₯Ό μ¬μ©νλ JVMλ€μ λ΄λΆμ μΌλ‘ ν΄λΉ λ©μλκ° μΌλ§λ μμ£Ό μνλλμ§ μ²΄ν¬νκ³ , μΌμ μ λλ₯Ό λμ λμλ§ μ»΄νμΌμ μννλ€.
4. Runtime Data Area
JVMμ΄ μ΄μ체μ μμμ μ€νλλ©΄μ ν λΉλ°λ λ©λͺ¨λ¦¬ μμμ
μ΄ 5κ°μ§ μμμΌλ‘ λλμ΄μ§ : PC λ μ§μ€ν°, JVM μ€ν, λ€μ΄ν°λΈ λ©μλ μ€ν, ν, λ©μλ μμ
(μ΄ μ€μ νκ³Ό λ©μλ μμμ λͺ¨λ μ€λ λκ° κ³΅μ ν΄μ μ¬μ©ν¨)
- PC register(PC λ μ§μ€ν°) : μ€λ λκ° μ΄λ€ λͺ λ Ήμ΄λ‘ μ€νλμ΄μΌ ν μ§ κΈ°λ‘νλ λΆλΆ(JVM λͺ λ Ήμ μ£Όμλ₯Ό κ°μ§)
- Stack Area(μ€ν μμ, JVM μ€ν) : μ§μλ³μ, λ§€κ°λ³μ, λ©μλ μ 보, μμ λ°μ΄ν° λ±μ μ μ₯. μ€λ λ λ§λ€ νλμ© μ‘΄μ¬νλ©° μ€λ λκ° μμλ λ μμ±λλ€.
- Native Method Stack(λ€μ΄ν°λΈ λ©μλ μ€ν) : μ€μ μ€νν μ μλ κΈ°κ³μ΄λ‘ μμ±λ νλ‘κ·Έλ¨μ μ€νμν€λ μμ
- Heap(ν) : λ°νμμ λμ μΌλ‘ ν λΉλλ λ°μ΄ν°κ° μ μ₯λλ μμ. κ°μ²΄λ λ°°μ΄ μμ±μ΄ μ¬κΈ°μ ν΄λΉν¨
- (λν νμ ν λΉλ λ°μ΄ν°λ€μ κ°λΉμ§μ»¬λ ν°μ λμμ΄ λ¨. JVM μ±λ₯ μ΄μμμ κ°μ₯ λ§μ΄ μΈκΈλλ 곡κ°μ)
- Class Area(static μμ, λ©μλ μμ, λ°μ΄ν° μμ) : λͺ¨λ μ€λ λκ° κ³΅μ νλ μμμΌλ‘ JVMμ΄ μμλ λ μμ±λλ€. JVMμ΄ μ½μ κ°κ°μ ν΄λμ€μ μΈν°νμ΄μ€μ λν λ°νμ μμ ν, νλ λ° λ©μλ μ½λ, μ μ (static) λ³μ, λ©μλμ λ°μ΄νΈ μ½λ λ±μ 보κ΄ν¨
JVM λ©λͺ¨λ¦¬ κ΄λ¦¬
μ€ν κ³Όμ
- νλ‘κ·Έλ¨μ΄ μ€νλλ©΄ JVMμ OSλ‘λΆν° ν΄λΉ νλ‘κ·Έλ¨μ΄ νμλ‘νλ λ©λͺ¨λ¦¬λ₯Ό ν λΉλ°κ³ , ν λΉ λ°μ λ©λͺ¨λ¦¬λ₯Ό μ©λμ λ°λΌ μ¬λ¬ μμμΌλ‘ λλμ΄ κ΄λ¦¬νλ€.
- μλ° μ»΄νμΌλ¬(javac)κ° μλ° μ½λ(.java)λ₯Ό μ½μ΄ μλ° λ°μ΄νΈμ½λ(.class)λ‘ λ³νμν¨λ€.
- ν΄λμ€ λ‘λλ classνμΌλ€μ JVMμΌλ‘ λ‘λ©νλ€.
- λ‘λ©λ classνμΌλ€μ μ€ν μμ§(Execution engine)μ ν΅ν΄μ ν΄μλλ€.
- ν΄μλ λ°μ΄νΈμ½λλ Runtime Data Areas(λ©λͺ¨λ¦¬ μμ)μ λ°°μΉλμ΄ μ€μ§μ μΈ μνμ΄ μ΄λ£¨μ΄μ§λ€. μ΄λ¬ν μ€νκ³Όμ μμμ JVMμ νμμ λ°λΌ μ€λ λ λκΈ°νλ κ°λΉμ§ 컬λ μ (GC)κ°μ λ©λͺ¨λ¦¬ κ΄λ¦¬ μμ μ μννλ€.
μ»΄νμΌ νλ€ = .java νμΌμ .class(λ°μ΄νΈμ½λ)λ‘ λ§λ λ€λ κ²μ μλ―Ένλ€.