[Java] JVM μ΄μ 리 (Class Loader, Execution Engine, Runtime Data Area)
π€ JVM(Java Virtual Machine) μ΄λ?
JVM μ΄λ Java κ°μ λ¨Έμ μ΄λΌκ³ λΆλ¦¬λ μννΈμ¨μ΄λ‘ Java μ ν리μΌμ΄μ
μ΄ λμν μ μλ νκ²½μ μ 곡ν©λλ€. JVM μ μ ν리μΌμ΄μ
κ³Ό μ΄μ체μ μ¬μ΄μμ μ€μ¬μ μν μ μνν©λλ€. λλΆμ Java λ μ΄λ μ΄μ체μ νκ²½μμλ μ€νλ μ μκ³ , ‘write once and run anywhere’
μ΄λΌλ ννμ΄ λΆκ² λμμ΅λλ€.
π« JVM κ΅¬μ± μμ
JVM κ΅¬μ± μμλ μμ κ°μ΄ ν¬κ² μΈ κ°μ§λ‘ λΆλ₯λ©λλ€.
- Class Loader
- Execution Engine
- Runtime Data Area
ν΄λμ€ λ‘λ(Class Loader)κ° μ»΄νμΌλ μλ° λ°μ΄νΈμ½λλ₯Ό λ°νμ λ°μ΄ν° μμ(Runtime Data Area)μ λ‘λνκ³ , μ€ν μμ§(Execution Engine)μ΄ μλ° λ°μ΄νΈμ½λλ₯Ό μ€νν©λλ€.
βοΈ μ»΄νμΌ
JVM κ΅¬μ± μμμ λν΄ μ΄ν΄λ³΄κΈ° μ μ λ¨Όμ μ»΄νμΌ κ³Όμ μ λν΄ μμλ³΄κ² μ΅λλ€.
βοΈ .class
νμΌ
κ°λ°μλ .java
νμ₯μλ₯Ό κ°μ§ νμΌμ μμ€ μ½λλ₯Ό μμ±ν©λλ€. μμ€ μ½λλ μ¬λμ΄ μμ보기 μ½κ² μμ±λμ΄ μμ§λ§, κΈ°κ³λ μ΄λ₯Ό ν΄μν μ μμ΅λλ€. μ΄λ₯Ό JVM μ΄ ν΄μν μ μλ λ΄μ©μΌλ‘ μμ€ μ½λλ₯Ό λ³ννλ κ³Όμ μ μ»΄νμΌ(compile) μ΄λΌκ³ ν©λλ€. μ»΄νμΌμ JDK λ₯Ό μ€μΉν λ ν¬ν¨λμ΄ μλ javac
μ μν΄ μνλ©λλ€.
μ»΄νμΌμ΄ μλ£λλ©΄ JVM μ΄ ν΄μν μ μλ λ°μ΄νΈ μ½λλ‘ μμ±λ .class
νμ₯μλ₯Ό κ°μ§λ νμΌμ΄ μμ±λ©λλ€.
π Class Loader
μ΄μ JVM μ κ΅¬μ± μμμ λν΄ μμλ³΄κ² μ΅λλ€.
ν΄λμ€ λ‘λλ JVM λ΄μμ μ»΄νμΌ λ ν΄λμ€ νμΌμ λ‘λνλ μν μ μννλ μ»΄ν¬λνΈμ λλ€. ν΄λμ€ λ‘λλ ν¬κ² Loading, Linking, Initialization 3κ°μ§ μ£Όμ κΈ°λ₯μ μνν©λλ€.
π Loading
ν΄λμ€ λ‘λλ ν΄λμ€ νμΌμ νμΌ μμ€ν νΉμ λ€νΈμν¬μμ μ°Ύμ JVM μΌλ‘ λ‘λν©λλ€. κ°κ°μ ν΄λμ€ νμΌλ€μ΄ κΈ°λ³ΈμΌλ‘ μ 곡λλ ν΄λμ€ νμΌμΈμ§ νΉμ κ°λ°μκ° μ μν ν΄λμ€ νμΌμΈμ§μ κ°μ κΈ°μ€μ λ°λΌ ν΄λμ€ λ‘λ λν Bootstrap Class Loader, Extension Class Loader, Application Class Loader λ‘ λλκ² λ©λλ€.
1. Bootstrap Class Loader
μ΅μμ ν΄λμ€ λ‘λμ
λλ€. rt.jar
λ₯Ό ν¬ν¨νμ¬, JVM μ ꡬλμν€κΈ° μν κ°μ₯ νμμ μΈ λΌμ΄λΈλ¬λ¦¬μ ν΄λμ€λ€μ JVM μ λ‘λν©λλ€.
2. Extension Class Loader
Bootstrap Class Loader λ€μμΌλ‘ μ°μ μμλ₯Ό κ°μ§λ©°, JDK νμ₯ λΌμ΄λΈλ¬λ¦¬μμ ν΅μ¬ μλ° ν΄λμ€λ€μ λ‘λν©λλ€. λ³΄ν΅ /jre/lib/ext λλ ν 리 λλ java.ext.dirs νκ²½λ³μλ‘ μ§μ λ λλ ν 리μ νμΌμ λ‘λν©λλ€.
3. Application ClassLoader
JVM ν΄λμ€ λ‘λ κ³μΈ΅ ꡬ쑰μμ μ΅νμμ μμΉνλ©°, μ¬μ©μκ° μμ±ν μ ν리μΌμ΄μ μ½λμ κ΄λ ¨λ ν΄λμ€λ€μ λ‘λν©λλ€.
π Linking
ν΄λμ€ νμΌμ΄ λ‘λ λ νμλ λ§ν¬ κ³Όμ μ κ±°μΉ©λλ€. λ§ν¬ κ³Όμ μ λ‘λλ ν΄λμ€ νμΌλ€μ κ²μ¦νκ³ , μ¬μ©ν μ μκ² μ€λΉνλ κ³Όμ μ μλ―Έν©λλ€. μ΄ κ³Όμ μ Verification, Preparation, Resolution μ΄λΌλ μΈ κ°μ§ λ¨κ³λ‘ μ΄λ£¨μ΄μ Έ μμ΅λλ€.
1. Verification
ν΄λμ€ νμΌμ΄ μ ν¨νμ§ κ²μ¬νκ³ , JVM μ΄ μμ νκ² μ€νλ μ μλμ§ νμΈνλ κ³Όμ μ λλ€. ν΄λμ€μ ꡬ쑰μ μΈ μ ν¨μ±, μμ κ΄κ³, νλ λ° λ©μλμ μ κ·Ό κΆν λ±μ κ²μ¬ν©λλ€.
2. Preparation
ν΄λμ€μ μ μ νλλ₯Ό ν λΉνκ³ κΈ°λ³Έκ°μΌλ‘ μ΄κΈ°νν©λλ€. μ΄ λ¨κ³μμλ λ©λͺ¨λ¦¬ 곡κ°λ§ ν λΉλκ³ , μ€μ μ΄κΈ°νλ Initialization λ¨κ³μμ μ΄λ£¨μ΄μ§λλ€.
3. Resolution
Symbolic Reference(λ€λ₯Έ ν΄λμ€λ₯Ό κ°λ¦¬ν€λ λ Όλ¦¬ μ°Έμ‘°)κ° μ‘΄μ¬νλ κ²½μ° JVM μ Method Area μ λ°νμ νκ²½ νμ μ΄μ©νμ¬ Direct Reference λΌλ μ€μ λ©λͺ¨λ¦¬ μμΉλ‘ κ΅μ²΄ν©λλ€.
π Initialization
Linking κ³Όμ μ΄ λλ ν Initialization λ¨κ³μμλ ν΄λμ€μ μΈν°νμ΄μ€μ κ°λ€μ μ§μ ν κ°λ€λ‘ μ΄κΈ°ν λ° μ΄κΈ°ν λ©μλλ₯Ό μ€νμμΌμ€λλ€. ν΄λμ€ λ‘λλ₯Ό ν΅ν ν΄λμ€ νμ¬ κ³Όμ μ΄ λλλ©΄ JVM μμ ν΄λμ€ νμΌμ ꡬλμν¬ μ€λΉκ° λλκ² λ©λλ€.
βΆοΈ Execution Engine
μ€ν μμ§μ μλ° λ°μ΄νΈ μ½λλ₯Ό μ€μ λ‘ μ€ν κ°λ₯ν κΈ°κ³ μ½λλ‘ λ³ννκ³ μ€ννλ μν μ μνν©λλ€.
Execution Engine μ ν¬κ² λ κ°μ§λ‘ ꡬλΆλ©λλ€.
- Interpreter
- JIT Compiler
βΆοΈ Interpreter
μΈν°ν리ν°λ μ»΄νμΌλ .class
νμΌμ λ°μ΄νΈμ½λλ₯Ό ν μ€μ© μ½κ³ ν΄μνμ¬ μ€ννλ μν μ μνν©λλ€. νμ§λ§ μΈν°ν리ν°μ μ€ν λ°©μμ λ°λ³΅μ μΈ ν΄μ κ³Όμ μ΄ νμνκΈ° λλ¬Έμ μ€ν μλκ° C, C++ μ²λΌ μ»΄νμΌμ ν΅ν΄ 미리 κΈ°κ³μ΄λ‘ λ²μλλ μΈμ΄μ λΉν΄ μλμ μΌλ‘ μλκ° λ리λ€λ λ¨μ μ΄ μμ΅λλ€. μ΄λ¬ν λ¨μ μ 보μνκΈ° μν΄ JIT μ»΄νμΌλ¬μ ν¨κ» μ¬μ©λ©λλ€.
βΆοΈ JIT μ»΄νμΌλ¬
JIT(Just In Time) μ»΄νμΌλ¬λ Interpreter μ μ±λ₯μ ν₯μμν€κΈ° μν΄ λμ λ κΈ°μ μ λλ€. JIT μ»΄νμΌλ¬λ μΈν°ν리ν°κ° λ°λ³΅μ μΌλ‘ μ€ννλ λΆλΆμ λμ μΌλ‘ κΈ°κ³μ΄λ‘ λ³ννμ¬ μ€ν μλλ₯Ό ν₯μμν΅λλ€. μΈν°νλ¦¬ν° λ°©μμΌλ‘ μ€ννλ€κ° μ μ ν μμ μ νΉμ λ©μλλ₯Ό μ»΄νμΌνμ¬ κΈ°κ³μ΄λ‘ λ³ννκ³ , μ΄νμλ λ μ΄μ μΈν°ν리ν νμ§ μκ³ κΈ°κ³μ΄λ‘ μ§μ μ€ννλ λ°©μμ λλ€. κΈ°κ³μ΄λ₯Ό μ€ννλ κ²μ΄ μΈν°ν리ν νλ κ²λ³΄λ€ λΉ λ₯΄κ³ , λ³νλ κΈ°κ³μ΄λ μΊμμ 보κ΄λκΈ° λλ¬Έμ νλ² λ³νλ μ½λλ κ³μν΄μ λΉ λ₯΄κ² μ€νλ μ μμ΅λλ€.
JIT μ»΄νμΌλ¬κ° μ»΄νμΌνλ κ³Όμ μ λ°μ΄νΈμ½λλ₯Ό μΈν°ν리ν νλ κ²λ³΄λ€ λ μ€λ걸리λ μμ μ λλ€. λ°λΌμ, JIT μ»΄νμΌλ¬λ λ©μλκ° μΌλ§λ μμ£Ό μνλλμ§ μ²΄ν¬νκ³ μΌμ μκ³μΉλ₯Ό λμ κ²½μ°μλ§ μ»΄νμΌμ μνν©λλ€.
ποΈ Runtime Data Area
λ°νμ λ°μ΄ν° μμμ JVM μ΄ μ΄μ체μ μμμ μ€νλλ©΄μ ν λΉλ°λ λ©λͺ¨λ¦¬ μμμ λλ€. μ κ·Έλ¦Όκ³Ό κ°μ΄ 6κ°μ μμμΌλ‘ λλκ² λ©λλ€. PC λ μ§μ€ν°, JVM μ€ν, λ€μ΄ν°λΈ λ©μλ μ€νμ μ€λ λλ³λ‘ νλμ© μμ±λλ©° ν, λ©μλ μμ, λ°νμ μμ νμ λͺ¨λ μ€λ λμμ 곡μ λ©λλ€.
ποΈ PC Register
- PC(Program Counter) λ μ§μ€ν°λ κ° μ€λ λλ§λ€ νλμ© μ‘΄μ¬νλ©° μ€λ λκ° μμλ λ μμ±λ©λλ€.
- νμ¬ μνμ€μΈ JVM λͺ λ Ήμ μ£Όμλ₯Ό κ°μ§λλ€.
ποΈ JVM Stack
- κ° μ€λ λλ§λ€ νλμ© μ‘΄μ¬νλ©° μ€λ λκ° μμλ λ μμ±λ©λλ€.
- μ€ν νλ μμ΄λΌλ ꡬ쑰체λ₯Ό μ μ₯νλ μ€νμ λλ€. κ° μ€ν νλ μμ μ§μ λ³μ λ°°μ΄, νΌμ°μ°μ μ€ν, νμ¬ μ€νμ€μΈ λ©μλκ° μν ν΄λμ€μ λ°νμ μμ νμ λν λ νΌλ°μ€λ₯Ό κ°μ§λλ€.
- JVM λ΄μμ λ©μλκ° μνλ λλ§λ€ νλμ μ€ν νλ μμ΄ μμ±λμ΄ ν΄λΉ μ€λ λμ JVM μ€νμ μΆκ°λκ³ λ©μλκ° μ’ λ£λλ©΄ μ€ν νλ μμ΄ μ κ±°λ©λλ€.
ποΈ Native Method Stack
- κ° μ€λ λλ³λ‘ μμ ν©λλ€.
- Java μΈμ μΈμ΄λ‘ μμ±λ λ€μ΄ν°λΈ μ½λλ₯Ό μν μ€νμ λλ€.
- JNI(Java Native Interface)λ₯Ό ν΅ν΄ νΈμΆνλ C/C++ λ±μ μ½λλ₯Ό μννκΈ° μν μ€νμ λλ€.
ποΈ Heap
- λͺ¨λ μ€λ λμμ 곡μ ν©λλ€.
- μΈμ€ν΄μ€ λλ κ°μ²΄λ₯Ό μ μ₯νλ 곡κ°μΌλ‘ Garbage Collection λμμ λλ€.
ποΈ Method Area
- λͺ¨λ μ€λ λμμ 곡μ νλ μμμΌλ‘ JVM μ΄ μμλ λ μμ±λ©λλ€.
- JVM μ΄ μ½μ ν΄λμ€μ μΈν°νμ΄μ€μ λν λ°νμ μμ ν, νλμ λ©μλ μ 보, static λ³μ, λ©μλμ λ°μ΄νΈμ½λ λ±μ 보κ΄ν©λλ€.
ποΈ Runtime Constant Pool
- λ©μλ μμμ ν¬ν¨λλ μμμ λλ€.
- κ° ν΄λμ€μ μΈν°νμ΄μ€μ μμλΏλ§ μλλΌ, λ©μλμ νλμ λν λͺ¨λ λ νΌλ°μ€κΉμ§ λ΄κ³ μλ ν μ΄λΈμ λλ€.
- μ΄λ€ λ©μλλ νλλ₯Ό μ°Έμ‘°ν λ JVM μ λ°νμ μμ νμ ν΅ν΄ ν΄λΉ λ©μλλ νλμ μ€μ λ©λͺ¨λ¦¬μ μ£Όμλ₯Ό μ°Ύμμ μ°Έμ‘°ν©λλ€.
π μ°Έκ³
https://tecoble.techcourse.co.kr/post/2021-07-15-jvm-classloader/
https://d2.naver.com/helloworld/1230