π» [Theory] JVM(Java Virtual Machine)μ ꡬ쑰
π» [Theory] JVM(Java Virtual Machine)μ ꡬ쑰
μλ
νμΈμ. π
μ€λμ JVM(Java Virtual Machine)μ ꡬ쑰μ λν΄ μμλ³΄κ² μ΅λλ€.
JVM(Java Virtual Machine) μ΄λ?
JVM μ΄λ μλ° κ°μ λ¨Έμ μΌλ‘ Java λ°μ΄νΈ μ½λλ₯Ό μ€νν μ μλ 주체μ΄λ€.
νΉνλ CPUλ μ΄μ체μ (νλ«νΌ)μ μ’ λ₯μ 무κ΄νκ² μ€νμ΄ κ°λ₯νλ€. -> μλ°λ₯Ό μ¬μ©νλ μ΄μ μ΄μ μ₯μ μ ν΄λΉνλ€.
μ¦, μ΄μ체μ μμμ λμνλ νλ‘μΈμ€λ‘ μλ° μ½λλ₯Ό μ»΄νμΌν΄μ μ»μ λ°μ΄νΈ μ½λλ₯Ό ν΄λΉ μ΄μ체μ κ° μ΄ν΄ν μ μλ κΈ°κ³μ΄λ‘ λ°κΏ μ€νμμΌμ£Όλ μν μ νλ€.
JVMμ ꡬμ±μ μ΄ν΄λ³΄λ©΄ ν¬κ² 4κ°μ§(Class Loader, Execution Engine, Garbage Collector, Runtime Data Area)λ‘ λλλ€.
- Class Loader (ν΄λμ€ λ‘λ)
μλ°μμ μμ€λ₯Ό μμ±νλ©΄ Person.java μ²λΌ .java νμΌμ΄ μμ±λλ€.
.java μμ€λ₯Ό μλ°μ»΄νμΌλ¬κ° μ»΄νμΌνλ©΄ Person.class κ°μ .classνμΌ(λ°μ΄νΈμ½λ)μ΄ μμ±λλ€.
μ΄λ κ² μμ±λ ν΄λμ€ νμΌλ€μ λΆμν λ€μ JVMμ΄ μ΄μ체μ λ‘λΆν° ν λΉλ°μ λ©λͺ¨λ¦¬μμμΈ
Runtime Data Areaλ‘ μ μ¬νλ μν (λ°νμ μ λμ λ‘λ©)μ Class Loaderκ° νλ€.
β»μλ° μ ν리μΌμ΄μ μ΄ μ€νμ€μΌ λ μ΄λ° μμ μ΄ μνλλ€.
- Execution Engine (μ€ν μμ§)
Class Loaderμ μν΄ λ©λͺ¨λ¦¬μ μ μ¬λ ν΄λμ€(λ°μ΄νΈ μ½λ)λ€μ κΈ°κ³μ΄λ‘ λ³κ²½ν΄ λͺ λ Ήμ΄ λ¨μλ‘ μ€ννλ μν μ νλ€.
λͺ λ Ήμ΄λ₯Ό νλ νλ μ€ννλ μΈν°ν리ν°(Interpreter)λ°©μμ΄ μκ³ JIT(Just-In-Time) μ»΄νμΌλ¬λ₯Ό μ΄μ©νλ λ°©μμ΄ μλ€.
JIT μ»΄νμΌλ¬λ μ μ ν μκ°μ μ 체 λ°μ΄νΈ μ½λλ₯Ό λ€μ΄ν°λΈ μ½λλ‘ λ³κ²½ν΄μ Execution Engineμ΄ λ€μ΄ν°λΈλ‘ μ»΄νμΌλ μ½λλ₯Ό μ€ννλ κ²μΌλ‘ μ±λ₯μ λμ΄λ λ°©μμ΄λ€.
- μΈν°νλ¦¬ν° λ°©μ : λͺ λ Ήμ΄λ₯Ό νλμ© μν(κΈ°λ³Έμ μΈ λ°©μ. μ 체 μνμ λ리λ λͺ λ Ήμ΄ νλμ©μ λμμ λΉ λ¦)
- JIT(Just In Time compiler)λ°©μ : μ 체 λ°μ΄νΈ μ½λλ₯Ό λ€μ΄ν°λΈ μ½λλ‘ λ³ννκ³ κ·Έ μ΄νμλ μΈν°ν리ν νμ§ μκ³ λ€μ΄ν°λΈ μ½λ μνλ‘ μ€ν(μ 체μ μΈ λμμ λΉ λ₯΄λ μ»΄νμΌνλλ° μλΉ μκ° μμ)
μ΅μ΄μ κ°μ λ¨Έμ μ μΈν°νλ¦¬ν° λ°©μλ§ μ¨μ μ€ν μλκ° λλ Έμ§λ§, JIT μ»΄νμΌ λ°©μμ μΆκ°νμ¬ μ΄λ₯Ό 보μνκ³ μ νλ€. κ·Έλ°λ° JIT μ»΄νμΌμ λ°μ΄νΈμ½λλ₯Ό κΈ°κ³μ΄λ‘ λ°κΎΈκΈ° λλ¬Έμ μ€ν μλκ° λΉ λ₯΄μ§λ§ λ³ννλ λ° λΉμ©μ΄ λ°μνκ² λλ€. κ·Έλμ μΈν°νλ¦¬ν° λ°©μμ μ¬μ©νλ€κ° μΌμ ν κΈ°μ€μ΄ λμ΄κ°λ©΄ JIT μ»΄νμΌ λ°©μμΌλ‘ μ€ννλ€.
- Garbage Collector (κ°λΉμ§ 컬λ ν°)
Garbage Collector(GC)λ Heap λ©λͺ¨λ¦¬ μμμ μμ±(μ μ¬)λ κ°μ²΄λ€ μ€μ μ°Έμ‘°λμ§ μλ κ°μ²΄λ€μ νμ ν μ κ±°νλ μν μ νλ€.
GCκ° μν μ νλ μκ°μ μ νν μΈμ μΈμ§λ₯Ό μ μ μλ€. (μ°Έμ‘°κ° μμ΄μ§μλ§μ ν΄μ λλ κ²μ 보μ₯νμ§ μμ)
λ λ€λ₯Έ νΉμ§μ GCκ° μνλλ λμ GCλ₯Ό μννλ μ°λ λκ° μλ λ€λ₯Έ λͺ¨λ μ°λ λκ° μΌμμ μ§λλ€.
νΉν Full GCκ° μΌμ΄λμ μ μ΄κ° λͺ¨λ μ°λ λκ° μ μ§νλ€λ©΄ μ₯μ λ‘ μ΄μ΄μ§λ μΉλͺ μ μΈ λ¬Έμ κ° μκΈΈ μ μλ κ²μ΄λ€.
λ΄μ©μ΄ λ§κ³ μ€μν λΆλΆμ΄λ―λ‘ λ€μ ν¬μ€νΈμμ λ μμΈν λ€λ€λ³΄μ
- Runtime Data Area (λ°νμ λ°μ΄ν° μμ)
JVMμ λ©λͺ¨λ¦¬ μμμΌλ‘ μλ° μ ν리μΌμ΄μ μ μ€νν λ μ¬μ©λλ λ°μ΄ν°λ€μ μ μ¬νλ μμμ΄λ€.
μ΄ μμμ ν¬κ² Method Area, Heap Area, Stack Area, PC Register, Native Method Stackλ‘ λλ μ μλ€.
##μλ° λ°νμ λ©λͺ¨λ¦¬(Runtime Data area) ꡬ쑰
1.Method area (λ©μλ μμ)
ν΄λμ€ λ©€λ² λ³μμ μ΄λ¦, λ°μ΄ν° νμ , μ κ·Ό μ μ΄μ μ 보κ°μ νλ μ 보μ λ©μλμ μ΄λ¦, λ¦¬ν΄ νμ , νλΌλ―Έν°, μ κ·Ό μ μ΄μ μ 보κ°μ λ©μλ μ 보,
Typeμ 보(InterfaceμΈμ§ classμΈμ§), Constant Pool(μμ ν : λ¬Έμ μμ, νμ , νλ, κ°μ²΄ μ°Έμ‘°κ° μ μ₯λ¨), static λ³μ, final class λ³μλ±μ΄ μμ±λλ μμμ΄λ€.
ν΄λμ€μ λν μ 보μ ν¨κ» ν΄λμ€ λ³μ(static variable)κ° μ μ₯λλ μμ.
JVMμ μλ° νλ‘κ·Έλ¨μμ νΉμ ν΄λμ€κ° μ¬μ©λλ©΄ ν΄λΉ ν΄λμ€μ ν΄λμ€ νμΌ(*.class)μ μ½μ΄λ€μ¬, ν΄λμ€μ λν μ 보λ₯Ό λ©μλ μμμ μ μ₯νλ€.
Class area (ν΄λμ€ μμ)μ΄λΌκ³ λ νλ€.
2.Heap area (ν μμ)
λ°νμ μ κ²°μ λλ μ°Έμ‘°ν λ°μ΄ν°νμ μ΄ μ μ₯λλ 곡κ°,
new ν€μλλ‘ μμ±λ κ°μ²΄μ λ°°μ΄μ΄ μμ±λλ μμμ΄λ€.
λ©μλ μμμ λ‘λλ ν΄λμ€λ§ μμ±μ΄ κ°λ₯νκ³ Garbage Collectorκ° μ°Έμ‘°λμ§ μλ λ©λͺ¨λ¦¬λ₯Ό νμΈνκ³ μ κ±°νλ μμμ΄λ€.
3.Stack area (μ€ν μμ)
μ»΄νμΌ μ κ²°μ λλ κΈ°λ³Έν λ°μ΄ν°νμ μ΄ μ μ₯λλ 곡κ°,
μ§μ λ³μ, νλΌλ―Έν°, λ¦¬ν΄ κ°, μ°μ°μ μ¬μ©λλ μμ κ°λ±μ΄ μμ±λλ μμμ΄λ€.
int a = 10; μ΄λΌλ μμ€λ₯Ό μμ±νλ€λ©΄ μ μκ°μ΄ ν λΉλ μ μλ λ©λͺ¨λ¦¬κ³΅κ°μ aλΌκ³ μ‘μλκ³ κ·Έ λ©λͺ¨λ¦¬ μμμ κ°μ΄ 10μ΄ λ€μ΄κ°λ€. μ¦, μ€νμ λ©λͺ¨λ¦¬μ μ΄λ¦μ΄ aλΌκ³ λΆμ¬μ£Όκ³ κ°μ΄ 10μΈ λ©λͺ¨λ¦¬ 곡κ°μ λ§λ λ€.
ν΄λμ€ Person p = new Person(); μ΄λΌλ μμ€λ₯Ό μμ±νλ€λ©΄ Person pλ μ€ν μμμ μμ±λκ³ newλ‘ μμ±λ Person ν΄λμ€μ μΈμ€ν΄μ€λ ν μμμ μμ±λλ€.
κ·Έλ¦¬κ³ μ€νμμμ μμ±λ pμ κ°μΌλ‘ ν μμμ μ£Όμκ°μ κ°μ§κ³ μλ€. μ¦, μ€ν μμμ μμ±λ pκ° ν μμμ μμ±λ κ°μ²΄λ₯Ό κ°λ¦¬ν€κ³ (μ°Έμ‘°νκ³ ) μλ κ²μ΄λ€.
λ©μλλ₯Ό νΈμΆν λλ§λ€ κ°λ³μ μΌλ‘ μ€νμ΄ μμ±λλ€.
4.PC Register (PC λ μ§μ€ν°)
Thread(μ°λ λ)κ° μμ±λ λλ§λ€ μμ±λλ μμμΌλ‘ Program Counter μ¦, νμ¬ μ°λ λκ° μ€νλλ λΆλΆμ μ£Όμμ λͺ λ Ήμ μ μ₯νκ³ μλ μμμ΄λ€. (*CPUμ λ μ§μ€ν°μ λ€λ¦)
μ΄κ²μ μ΄μ©ν΄μ μ°λ λλ₯Ό λμκ°λ©΄μ μνν μ μκ² νλ€.
5.Native method stack
μλ° μΈ μΈμ΄λ‘ μμ±λ λ€μ΄ν°λΈ μ½λλ₯Ό μν λ©λͺ¨λ¦¬ μμμ΄λ€.
λ³΄ν΅ C/C++λ±μ μ½λλ₯Ό μννκΈ° μν μ€νμ΄λ€.
Java Native Interfaceλ₯Ό ν΅ν΄ λ°μ΄νΈμ½λλ‘ λ³νλ¨
μ°λ λκ° μμ±λμμ λ κΈ°μ€μΌλ‘
1,2λ²μΈ λ©μλ μμκ³Ό ν μμμ λͺ¨λ μ°λ λκ° κ³΅μ νκ³ ,
3,4,5λ²μΈ μ€ν μμκ³Ό PC λ μ§μ€ν°, Native method stackμ κ°κ°μ μ°λ λλ§λ€ μμ±λκ³ κ³΅μ λμ§ μλλ€.
λ
μλ°μ ν΅μ¬ JVMμ ꡬ쑰μ λν΄ μμ보μμ΅λλ€.
Reference