[Java] JVMμ λνμ¬.
0. πΆλ€μ΄κ°λ©°
μλ° νλ‘κ·Έλ¨μ΄ μ΄λ€ λ°©μμΌλ‘ μ€νλλμ§μ λν΄ κΆκΈν΄μ Έ κ²μ μ€ JVMμ΄λΌλ ν€μλλ₯Ό λ°κ²¬νκ³ μ΄μ λν΄ μ 리ν΄λ³΄κ³ μ κΈμ μ°κ² λμμ΅λλ€.
1. π»JVMμ΄λ 무μμΈκ°?
Write Once, Run Anywhere.
JVMμ Java Virtual Machineμ μ½μλ‘ μλ° κ°μ λ¨Έμ μ΄λΌκ³ λΆλ¦ λλ€. μλ°λ νλ² μμ±νλ©΄ νλ«νΌμ ꡬμ λ°μ§ μκ³ μλλμ΄μΌ νλ€λ νμ΄λ₯Ό λ΄μΈμ°κ³ μμ΅λλ€. JVMμ μλ°μ μ΄μ체μ μ¬μ΄μμ μ€κ°μ μν μ νμ¬ μ΄μ체μ μ μκ΄μμ΄ νλ‘κ·Έλ¨μ μ€νν μ μλλ‘ λμμ€λλ€.
λν JVMμ μ€μν μν μ€ νλλ λ©λͺ¨λ¦¬ κ΄λ¦¬μ λλ€. μλ°μμλ λ©λͺ¨λ¦¬ κ΄λ¦¬λ₯Ό κ°λΉμ§ 컬λ ν°(GC)λ₯Ό μ¬μ©ν΄ μλμΌλ‘ μνν©λλ€. μ΄μ λν λ΄μ© μμ λ€λ£° κ²μ΄ λ§μ κ΄μ¬μ΄ μμΌμλ€λ©΄ μλ κΈμ μ°Έκ³ ν΄μ£ΌμΈμ!
κ°μλ¨Έμ μ μ€ν μ€ν κΈ°λ°, λ μ§μ€ν° κΈ°λ° λ κ°μ§ λ°©μμΌλ‘ ꡬνμ΄ κ°λ₯ν©λλ€. μ΄λ νΌμ°μ°μλ₯Ό μ μ₯νκ³ λ€μ κ°μ Έμ€λ λ©μ»€λμ¦ μ°¨μ΄μΈλ°μ. JVMμ μ€ν κΈ°λ°μΌλ‘ λμν©λλ€. κ°λ¨νκ² μ€ν κΈ°λ°μ΄λ 무μμΈμ§μ λν΄ μμλ³΄κ² μ΅λλ€.
μ κ·Έλ¦Όκ³Ό κ°μ΄ μ€ν κΈ°λ° κ°μ λ¨Έμ μ νΌμ°μ°μλ₯Ό μ€νμμ κ΄λ¦¬νλ κ²μ λ§ν©λλ€. μ€νμμ POPκ³Ό PUSHλ§ ν΄λ νΌμ°μ°μλ€μ μ°Ύκ³ μ μ₯ν μ μκΈ° λλ¬Έμ λ°λ‘ νΌμ°μ°μμ λ©λͺ¨λ¦¬λ₯Ό κΈ°μ΅ν νμκ° μλ€λ μ₯μ μ΄ μμ΅λλ€.
2. πμλ° νλ‘κ·Έλ¨ μ€ν κ³Όμ
μ°μ μ°λ¦¬κ° μμ±ν. java νμΌμ΄ κΈ°κ³μ΄λ‘ λ³κ²½λμ΄ μ€νλ λκΉμ§μ κ³Όμ μ κ°λ¨ν μ΄ν΄λ³΄κ² μ΅λλ€.
μ κ·Έλ¦Όμ .java νμΌμ΄ μ»΄νμΌλ¬λ₯Ό ν΅ν΄ .classλΌλ λ°μ΄νΈμ½λλ‘ λ³νλκ³ JVMμ μν΄ κΈ°κ³μ΄λ‘ λ³νλμ΄ μ€νλλ κ³Όμ μ κ°λ΅νκ² λ³΄μ¬μ£Όκ³ μμ΅λλ€. μ΄μ μ‘°κΈ λ μμΈν μμλ³΄κ² μ΅λλ€.
μ΄ κ·Έλ¦Όμ΄ μμ λ³Έ κ·Έλ¦Όλ³΄λ€ μ‘°κΈ λ μ€ν κ³Όμ μ μμΈν ννν κ·Έλ¦Όμ λλ€. 볡μ‘ν΄ λ³΄μ΄μ§λ§ μλ° νλ‘κ·Έλ¨ μ€ν κ³Όμ μ μ°¨κ·Όμ°¨κ·Ό μ΄ν΄λ³΄κ³ κ·Έ ν κ° κ΅¬μ± μμκ° μ΄λ€ κΈ°λ₯μ νλμ§μ λν΄ μ€λͺ λλ¦¬κ² μ΅λλ€.
1) μλ° νλ‘κ·Έλ¨ μ€ν κ³Όμ
1. μλ° νλ‘κ·Έλ¨μ μ€ννλ©΄ JVMμ OSλ‘λΆν° νλ‘κ·Έλ¨μ΄ νμλ‘ νλ λ©λͺ¨λ¦¬λ₯Ό ν λΉλ°μ΅λλ€. JVMμ μ΄ λ©λͺ¨λ¦¬λ₯Ό μ©λμ λ°λΌ μ¬λ¬ μμμΌλ‘ λλμ΄ κ΄λ¦¬ν©λλ€. (λ€μ μμ ν Runtime Data Area)
2. μλ° μ»΄νμΌλ¬(javac)κ° μλ° μμ€μ½λ(.java)λ₯Ό μ½μ΄ λ€μ¬ μλ° λ°μ΄νΈμ½λ(.class)λ‘ λ³νμν΅λλ€. κ·Έλ¦Ό μΌμͺ½ μλ¨ λΆμ μμ μ΄ λκ² μ΅λλ€.
# μλ° λ°μ΄νΈμ½λλ?
- JVMμ΄ μ΄ν΄ν μ μλ μΈμ΄λ‘ λ³νλ μλ° μμ€ μ½λμ λλ€.
- μλ° μ»΄νμΌλ¬μ μν΄ λ³νλλ μ½λμ λͺ λ Ήμ΄ ν¬κΈ°κ° 1λ°μ΄νΈλΌμ μλ° λ°μ΄νΈμ½λλΌκ³ λΆλ¦½λλ€.
- μλ° λ°μ΄νΈμ½λλ JVMλ§ μ€μΉλμ΄ μμΌλ©΄, μ΄λ€ μ΄μ체μ μμλΌλ μ€νλ μ μμ΅λλ€.
3. Class Loaderλ₯Ό ν΅ν΄ class νμΌλ€μ JVMμΌλ‘ λ‘λ©ν©λλ€.
3. πJVMμ κ΅¬μ± μμ
1) Class Loader (ν΄λμ€ λ‘λ)
JVMλ΄λ‘ ν΄λμ€(.classνμΌ)λ₯Ό λ‘λνκ³ , λ§ν¬λ₯Ό ν΅ν΄ λ°°μΉνλ μμ μ μννλ λͺ¨λμ λλ€. jarνμΌ λ΄ μ μ₯λ ν΄λμ€λ€μ JVMμμ νμ¬νκ³ μ¬μ©νμ§ μλ ν΄λμ€λ€μ λ©λͺ¨λ¦¬μμ μμ ν©λλ€.
μλ°λ λ°νμμ ν΄λμ€λ₯Ό μ°Έμ‘°ν©λλ€. μ¦, ν΄λμ€λ₯Ό μ²μμΌλ‘ μ°Έμ‘°ν λ ν΄λΉ ν΄λμ€λ₯Ό λ‘λνκ³ λ§ν¬νλ κ²μ΄κ³ κ·Έ μν μ ν΄λμ€ λ‘λκ° μνν©λλ€.
2) Execution Engine (μ€ν μμ§)
ν΄λμ€λ₯Ό μ€νμν€λ μν μ ν©λλ€. ν΄λμ€ λ‘λκ° JVMλ΄μ λ°νμ λ°μ΄ν° μμ(Runtime Data Area)μ λ°μ΄νΈμ½λλ₯Ό λ°°μΉμν€κ³ , μ΄κ²μ μ€ν μμ§μ μν΄ μ€νλ©λλ€.
μλ° λ°μ΄νΈμ½λλ κΈ°κ³κ° λ°λ‘ μνν μ μλ μΈμ΄κ° μλκ³ λΉκ΅μ μΈκ°μ΄ 보기 νΈν ννλ‘ κΈ°μ λ κ²μ λλ€. κ·Έλμ μ€ν μμ§μ μ΄μ κ°μ λ°μ΄νΈμ½λλ₯Ό μ€μ JVMλ΄λΆμμ κΈ°κ³κ° μ€νν μ μλ ννλ‘ λ³κ²½νλ€.
μ΄ λ μλ λ κ°μ§ λ°©μμ κ°μ΄ μ¬μ©ν©λλ€.
(1) Interpreter (μΈν°ν리ν°)
μ€ν μμ§μ μλ° λ°μ΄νΈμ½λλ₯Ό λͺ λ Ήμ΄ λ¨μλ‘ μ½μ΄μ μ€νν©λλ€. νμ§λ§ μ΄ λ°©μμ μΈν°νλ¦¬ν° μΈμ΄μ λ¨μ μΈ λλ¦° μν μλλ₯Ό κ°μ§κ³ μμ΅λλ€.
μ΄ λΆλΆμ 보면 μλ°κ° μ»΄νμΌ μΈμ΄μ΄μ μΈν°νλ¦¬ν° μΈμ΄μ΄λ€ λΌλ λ§μ μ΄ν΄ν μ μκ² λ©λλ€.
(2) JIT(Just In Time)
λλ¦° μλλ₯Ό κ°μ§ μΈν°νλ¦¬ν° λ°©μμ λ¨μ μ 보μνκΈ° μν΄ λμ λ κ²μ΄ λ°λ‘ JIT μ»΄νμΌλ¬μ λλ€. μΈν°νλ¦¬ν° λ°©μμΌλ‘ μ€ννλ€ μ μ ν μμ μ λ°μ΄νΈμ½λ μ 체λ₯Ό μ»΄νμΌνμ¬ λ€μ΄ν°λΈ μ½λλ‘ λ³κ²½ν©λλ€. μ΄ν ν΄λΉ μ½λλ λμ΄μ μΈν°ν리ν νμ§ μκ³ λ€μ΄ν°λΈ μ½λλ‘ μ§μ μ€ννλ λ°©μμ λλ€. μ΄λ κ² λ³κ²½λ λ€μ΄ν°λΈ μ½λλ μΊμμ 보κ΄νκΈ° λλ¬Έμ ν λ² μ»΄νμΌλ μ½λλ λΉ λ₯΄κ² μνλ©λλ€.
JIT μ»΄νμΌλ¬κ° μ»΄νμΌ νλ κ³Όμ μ λΉμ©μ΄ λ°μνλ μμ μ λλ€. λ°λΌμ JVMμ λͺ¨λ μ½λλ₯Ό JIT μ»΄νμΌλ¬ λ°©μμΌλ‘ μ€ννμ§ μκ³ , μΈν°νλ¦¬ν° λ°©μμ μ¬μ©νλ€κ° μΌμ ν κΈ°μ€(ν΄λΉ λ©μλκ° μΌλ§λ μμ£Ό μνλλμ§ λ±)μ λκΈΈ λλ§ μ»΄νμΌμ μνν©λλ€.
3) Runtime Data Area
Runtime Data Areaλ JVMμ΄ νλ‘κ·Έλ¨μ μννκΈ° μν΄ OSμκ² ν λΉλ°μ λ©λͺ¨λ¦¬ 곡κ°μ λλ€.
μλ κ·Έλ¦Όμ μ΄ν΄λ³΄κ³ νλνλ μμλ΄ μλ€.
1) Method Area (Static Area)
Method Areaλ λͺ¨λ μ€λ λκ° κ³΅μ νλ λ©λͺ¨λ¦¬ μμμ λλ€. μ΄κ³³μλ ν΄λμ€ μ 보λ₯Ό μ²μ λ©λͺ¨λ¦¬ 곡κ°μ μ¬λ¦΄ λ μ΄κΈ°νλλ λμμ μ μ₯νκΈ° μν λ©λͺ¨λ¦¬ 곡κ°μ λλ€. λνμ μΌλ‘ ν΄λμ€, μΈν°νμ΄μ€, λ©μλ, νλ, Static λ³μ λ±μ λ°μ΄νΈμ½λλ₯Ό 보κ΄ν©λλ€.
2) Heap Area
κ°μ²΄λ₯Ό μ μ₯νλ κ°μ λ©λͺ¨λ¦¬ 곡κ°μ λλ€. new μ°μ°μλ‘ μμ±λ κ°μ²΄λ λ°°μ΄μ μ μ₯νκ² λμ£ . Method Areaμ μλ ν΄λμ€ μ 보λ₯Ό μ¬μ©νμ¬ κ°μ²΄λ₯Ό λ§λ€κ² λλ©΄ Heap Areaμ μμ±μ΄ λ©λλ€.
ν μμμ GCμλ λ°μ ν κ΄κ³κ° μλλ° μ΄λ λ€μ κΈμμ μμΈν λ€λ€λ³΄κ² μ΅λλ€.
3) Stack Area
νλ‘κ·Έλ¨ μ€ν κ³Όμ μμ μμλ‘ ν λΉλμλ€κ° λ©μλλ₯Ό λΉ μ Έλκ°λ©΄ λ°λ‘ μλ©Έλλ νΉμ±μ λ°μ΄ν°λ₯Ό μ μ₯νκΈ° μν μμμ λλ€. κ°μ’ ννμ λ³μλ μμ λ°μ΄ν° λ±μ μ μ₯ν©λλ€. λ©μλ νΈμΆ μ κ°κ°μ μ€ν νλ μμ΄ λκ³ λ©μλ μνμ΄ λλλ©΄ νλ μ λ³λ‘ μμ λ₯Ό νκ² λ©λλ€. νΈμΆν λ©μλμ λ§€κ° λ³μ, μ§μ λ³μ, λ¦¬ν΄ κ° λ±μ μμ μ μ₯νλ 곡κ°μ λλ€.
4) PC Register
Threadκ° μμλ λ μμ±λλ 곡κ°μΌλ‘ μ€λ λλ§λ€ νλμ© μ‘΄μ¬ν©λλ€. Threadκ° μ΄λ€ λΆλΆμ μλ λͺ λ Ήμ μ€νν΄μΌ νλμ§μ λν κΈ°λ‘μ νλ λΆλΆμΌλ‘ νμ¬ μν μ€μΈ JVM λͺ λ Ήμ μ£Όμλ₯Ό κ°μ΅λλ€.
5) Native Method stack
4. π¨λκ°λ©°
μ΄λ² κΈμμλ μλ°νλ‘κ·Έλ¨μ΄ μ€νλλ κ³Όμ κ³Ό JVMμ λνμ¬ μμ보μμ΅λλ€.
μ΄λ² μ£Όμ μ λ΄μ©μ΄ μ½μ§ μμμ§λ§ μλ° νλ‘κ·Έλ¨μ΄ μ€νλλ λ©μ»€λμ¦μ νμ΄λ³Ό μ μμ΄μ λμμ΄ λ§μ΄ λμλ κ² κ°μ΅λλ€.
ν΄λμ€ λ‘λλ Runtime Data Areaμ κ²½μ° μλ°λ₯Ό λ°°μ°λλ° κΉμ μ΄ν΄λ₯Ό μ€ μ μμ κ² κ°μμ μ΄μ λν΄ κΈ°νκ° λλ©΄ λ€μ νλ² κΈμ μμ±ν΄λ³΄λλ‘ νκ² μ΅λλ€.
Reference)