JVMμ΄λ?
JVM(Java Virtual Machine)μ΄λ μλ° κ°μ λ¨Έμ , μ¦ Java νλ‘κ·Έλ¨μ μ±ννλ κ°μμ μ»΄ν¨ν°μ΄λ€.
(κ°μλ¨Έμ μ΄λ νλ‘κ·Έλ¨μ μ€ννκΈ° μν 물리μ λ¨Έμ κ³Ό μ μ¬ν λ¨Έμ μ μννΈμ¨μ΄λ‘ ꡬνν κ²μ΄λ€.)
JVMμ μν μ μλ° μ ν리μΌμ΄μ μ ν΄λμ€ λ‘λλ₯Ό ν΅ν΄ μ½μ΄λ€μ¬ μ€ννλ κ²μ΄λ€.
λν JVMμ Javaμ OS μ¬μ΄μμ μ€κ°μ μν μ μννμ¬ νΉμ ν νλμ¨μ΄λ OSμ μμ‘΄νμ§ μκ³ Java μ½λλ₯Ό μ€νν μ μκ² ν΄μ€λ€. κ·Έλ¦¬κ³ κ°μ₯ μ€μν, λ©λͺ¨λ¦¬ κ΄λ¦¬(GC)λ₯Ό μννλ€.
μ JVMμ μμμΌ νλκ°
νμ λ μμ€ν 리μμ€ μ€μμ κ°μ₯ μ€μν κ²μ λ©λͺ¨λ¦¬μ΄λ€.
λμΌν κΈ°λ₯μ νλ‘κ·Έλ¨μ΄λλΌλ λ©λͺ¨λ¦¬ κ΄λ¦¬μ λ°λΌ μ±λ₯μ΄ μ’μ°λλ€. (νλ‘κ·Έλ¨μ΄ λ©λͺ¨λ¦¬λ₯Ό ν¨μ¨μ μΌλ‘ μ¬μ©νμ§ μμΌλ©΄ μ±λ₯ μ νμ λ©λͺ¨λ¦¬ λΆμ‘± λ¬Έμ κ° λ°μν μ μλ€.)
JVMμ μ΄ν΄νκ³ JVMμ΄ κ΄λ¦¬νλ λ©λͺ¨λ¦¬ ꡬ쑰λ₯Ό νμ νλ©΄ μμμ μ΅μ ννμ¬ λ©λͺ¨λ¦¬ κ΄λ¦¬μ ν¨μ¨μ±μ λμΌ μ μλ€.
κ·Έλμ μμλλ©΄ μ’λ€λ₯Ό λμ΄μ μμμΌ νλ κ²μ΄λ€.
Java νλ‘κ·Έλ¨ μ€ν κ³Όμ
- μλ° νλ‘κ·Έλ¨μ΄ μ€νλλ©΄ JVMμ OSλ‘λΆν° μ΄ νλ‘κ·Έλ¨μ΄ νμλ‘ νλ λ©λͺ¨λ¦¬(= Runtime Data Area)λ₯Ό ν λΉ λ°λλ€. (JVMμ μ΄ λ©λͺ¨λ¦¬λ₯Ό μ©λμ λ°λΌ λ©μλ μμ, μ€ν μμ, ν μμμΌλ‘ λλμ΄ κ΄λ¦¬νλ€.)
- μλ° μ»΄νμΌλ¬(javac)κ° μμ€μ½λ(.java)λ₯Ό μ½μ΄λ€μ¬ λ°μ΄νΈμ½λ(=ν΄λμ€ νμΌ(.class))λ‘ λ³ννλ€.
- ν΄λμ€λ‘λ(Class Loader)λ₯Ό ν΅ν΄ ν΄λμ€ νμΌλ€μ JVMμΌλ‘ λ‘λ©νλ€.
- λ‘λ©λ ν΄λμ€ νμΌμ μ€ν(Execution) μμ§μ ν΅ν΄ ν΄μλλ€.
- ν΄μλ λ°μ΄νΈμ½λ(=ν΄λμ€ νμΌ)λ λ°νμ λ°μ΄ν° μμμ λ°°μΉλμ΄ μ€μ§μ μΌλ‘ μ€νλλ€.
ν΄λμ€ νμΌ: JVMμμ μ€νλ μ μλ ννλ‘ μμ€μ½λκ° μ»΄νμΌ λ νν
μ΄λ¬ν κ³Όμ μμμ JVMμ νμμ λ°λΌ μ°λ λ λκΈ°νλ GCκ°μ κ΄λ¦¬ μμ μ μννλ€.
μ°μ JVMμ ꡬ쑰μ λν΄ μ΄ν΄λ³΄μ.
JVMμ ꡬ쑰
JVMμ ν΄λμ€λ‘λ, μ€ν μμ§, λ°νμ λ°μ΄ν° μμμΌλ‘ ꡬμ±λμ΄ μλ€.
1) Class Loader (ν΄λμ€ λ‘λ)
μλ° μ»΄νμΌλ¬(javac)μ μν΄ λ³νλ ν΄λμ€(.class) νμΌμ JVM λ΄λ‘ λ‘λνλ λͺ¨λμ΄λ€. (λ°νμ μμ λμ μΌλ‘ ν΄λμ€ νμΌμ λ‘λνλ€.)
ν΄λμ€ λ‘λμ λν΄μλ μ΄ κΈμμ μμΈν μ€λͺ νλ€.
μ»΄νμΌ νμ: μμ€μ½λκ° κΈ°κ³μ΄λ‘ λ³νλμ΄ μ€νκ°λ₯ν νλ‘κ·Έλ¨μ΄ λλ κ³Όμ
λ°νμ: μ»΄νμΌ νμ μ΄ν νλ‘κ·Έλ¨μ΄ μ€νλλ λ (= λ°μ΄νΈ μ½λλ₯Ό μ€νν λ)
μ»΄νμΌλ ν΄λμ€ νμΌμ λ‘λ©(Loading), λ§νΉ(Linking), μ΄κΈ°ν(Initialization)μ λ¨κ³λ₯Ό κ±°μ³ JVMμμ μ¬μ©ν μ μκ² λλ€.
1-1. Loading (λ‘λ©)
μ°μ ν΄λμ€ λ‘λλ μλ° λ°μ΄νΈ μ½λ(.class)λ₯Ό μ½κ³ , κ·Έ λ΄μ©μ λ°λΌ μ μ ν λ°μ΄λ리 λ°μ΄ν°λ₯Ό λ§λ€κ³ λ©μλ μμμ μ μ₯νλ€.
μ΄ κ³Όμ μμ .class νμΌμ΄ JVM μ€νμ λ§λμ§ νμΈνκ³ , Java Versionμ νμΈνλ€.
1-2. Linking (λ§νΉ)
Verifying(κ²μ¦): μ½μ΄ λ€μΈ ν΄λμ€ νμΌμ΄ μ ν¨ν κ²μΈμ§ νμΈνλ€. ν΄λμ€ νμΌ νμμ΄ μ ν¨νμ§(= μλ° μΈμ΄ λͺ μΈ & JVM λͺ μΈμ λͺ μλ λλ‘ μ ꡬμ±λμ΄ μλμ§) κ²μ¦νλ€.
Preparing(μ€λΉ): ν΄λμ€κ° νμλ‘ νλ λ©λͺ¨λ¦¬ 곡κ°μ ν λΉνλ€. ν΄λμ€μ μ μλ νλ, λ©μλ, μΈν°νμ΄μ€λ₯Ό λνλ΄λ λ°μ΄ν° ꡬ쑰λ₯Ό μ€λΉνλ€.
Resolving(λΆμ): μ νμ μΌλ‘ μ§νλλ κ³Όμ μΌλ‘ μ¬μ©νλ νκ²½μ λ°λΌ λμ μ λ¬΄κ° μ ν΄μ§λ€. μ¬λ³Όλ¦ λ©λͺ¨λ¦¬ λ νΌλ°μ€λ₯Ό λ©μλ μμμ μλ μ€μ λ νΌλ°μ€λ‘ κ΅μ²΄νλ€.
1-3. Initialization (μ΄κΈ°ν)
λ§νΉ λ¨κ³μ Prepare λ¨κ³μμ ν보ν λ©λͺ¨λ¦¬ μμμ ν΄λμ€μ static κ°λ€μ ν λΉνλ€.
2) Execution (μ€ν μμ§)
ν΄λμ€(=λ°μ΄νΈ μ½λ)λ₯Ό μ€νμν€λ μν μ νλ€.
ν΄λμ€λ‘λκ° JVM λ΄μ λ°νμ λ°μ΄ν° μμμ λ°μ΄νΈ μ½λλ₯Ό λ°°μΉμν€κ³ , μ΄κ²μ μ€ν μμ§μ μν΄ μ€νλλ€.
μλ° λ°μ΄νΈ μ½λλ κΈ°κ³κ° λ°λ‘ μνν μ μλ μΈμ΄λ³΄λ€λ λΉκ΅μ μΈκ°μ΄ 보기 νΈν ννλ‘ κΈ°μ λ κ²μ΄λ€.
λ°λΌμ μ€ν μμ§μ μ΄μ κ°μ λ°μ΄νΈ μ½λλ₯Ό μ€μ λ‘ JVM λ΄λΆμμ κΈ°κ³κ° μ€νν μ μλ ννλ‘ λ³κ²½νλλ°, μ΄ λ μΈν°νλ¦¬ν° λ°©μ λλ JIT λ°©μμ μ¬μ©νλ€.
2-1. Interpreter (μΈν°ν리ν°)
μ€ν μμ§μ μλ° λ°μ΄νΈ μ½λλ₯Ό λͺ λ Ήμ΄ λ¨μλ‘ μ½μ΄μ μ€ννλ€.
νμ§λ§ μ΄ λ°©μμ μΈν°νλ¦¬ν° μΈμ΄μ λ¨μ μ κ·Έλλ‘ κ°μ§κ³ μλ€. ν μ€μ© μννκΈ° λλ¬Έμ λ리λ€λ κ²μ΄λ€.
2-2. JIT(Just-In-Time) Compiler
μΈν°νλ¦¬ν° λ°©μμ λ¨μ μ 보μνκΈ° μν΄ λμ
λ μ»΄νμΌλ¬μ΄λ€. μ΅κ·Όμ JIT μ»΄νμΌ λ°©μμΌλ‘ μλ° μ»΄νμΌλ¬λ₯Ό κ°μ νμ¬ Java νλ‘κ·Έλ¨ μ€ν μλκ° λ§μ΄ λΉ¨λΌμ‘λ€.
μΈν°νλ¦¬ν° λ°©μμΌλ‘ μ€ννλ€κ° μ μ ν μμ μ λ°μ΄νΈ μ½λ μ 체λ₯Ό μ»΄νμΌνμ¬ λ€μ΄ν°λΈ μ½λλ‘ λ³κ²½νκ³ , μ΄νμλ λμ΄μ μΈν°ν리ν νμ§ μκ³ λ€μ΄ν°λΈ μ½λλ‘ μ§μ μ€ννλ λ°©μμ΄λ€.
λ€μ΄ν°λΈ μ½λλ μΊμμ 보κ΄νκΈ° λλ¬Έμ ν λ² μ»΄νμΌ λ μ½λλ λΉ λ₯΄κ² μννκ² λλ€.
λ€λ§, JIT μ»΄νμΌλ¬κ° μ»΄νμΌ νλ κ³Όμ μ΄ λ°μ΄νΈ μ½λλ₯Ό μΈν°ν리ν νλ κ³Όμ λ³΄λ€ ν¨μ¬ μ€λ 걸리λ―λ‘, ν λ²λ§ μ€νλλ μ½λλΌλ©΄ μ»΄νμΌ νμ§ μκ³ μΈν°ν리ν νλ κ²μ΄ μ 리νλ€.
λ°λΌμ JIT μ»΄νμΌλ¬λ₯Ό μ¬μ©νλ JVMλ€μ λ΄λΆμ μΌλ‘ ν΄λΉ λ©μλκ° μΌλ§λ μμ£Ό μνλλμ§ μ²΄ν¬νκ³ , μΌμ μ λλ₯Ό λμ λμλ§ μ»΄νμΌμ μννλ€.
2-3. GC (Garbage Collector)
JVMμ λ©λͺ¨λ¦¬ κ΄λ¦¬ κΈ°λ² μ€ νλλ‘ ν μμμμ λΆνμν λ©λͺ¨λ¦¬λ₯Ό ν΄μ νμ¬ μμ€ν μ κ°μ© λ©λͺ¨λ¦¬λ₯Ό μ μ§νκ³ λ©λͺ¨λ¦¬ λμλ₯Ό λ°©μ§νλ€.
κ°λΉμ§ 컬λ μ μ λν΄μλ μ΄ κΈμμ μμΈν μ€λͺ νλ€.
3) Runtime Data Area
μλ° μ ν리μΌμ΄μ μ΄ μ€νλλ©΄ JVMμ OSλ‘ λΆν° λ©λͺ¨λ¦¬λ₯Ό ν λΉ λ°λλ°, μ΄ λ©λͺ¨λ¦¬ 곡κ°μ λ°νμ λ°μ΄ν° μμμ΄λΌκ³ νλ€.
JVMμ μ΄ λ©λͺ¨λ¦¬λ₯Ό μ©λμ λ°λΌ λ©μλ μμ, μ€ν μμ, ν μμμΌλ‘ λλμ΄ κ΄λ¦¬νλ€.
3-1. λ©μλ μμ
λ©μλ μμμ νλ‘κ·Έλ¨μ μ€ν μ½λμ static λ³μλ₯Ό μ μ₯νλ€.
μ€νλ§ λΆνΈ μ ν리μΌμ΄μ μ κ²½μ°, Java λ°μ΄νΈ μ½λκ° μ΄ μμμ μμΉνλ€. 컨νΈλ‘€λ¬, μλΉμ€, λ ν¬μ§ν 리μ κ°μ ν΄λμ€μ λ©μλλ€, Java νμ€ λΌμ΄λΈλ¬λ¦¬μ ν¨μλ€, μ€νλ§ νλ μμν¬ μ½λ λ±μ΄ ν¬ν¨λλ€.
Javaμμλ static ν€μλλ₯Ό μ¬μ©νμ¬ μ μλ λ³μλ κ°μ²΄ λ±μ΄ μ΄ μμμ ν λΉλλ€.
μλ₯Ό λ€μ΄, μ€νλ§ μ ν리μΌμ΄μ μμ Singleton Scopeμ Beanμ΄λ μ μ μΌλ‘ μ μΈλ μ€μ κ°λ€μ΄ μ΄ μμμ μμΉν μ μλ€.
λ©μλ μμμ JVMμ΄ λμν΄μ ν΄λμ€κ° λ‘λ©λ λ ν λΉλλ©°,
νλ‘κ·Έλ¨ μμ μ μ λ‘λλμ΄ μ’ λ£κΉμ§ λ©λͺ¨λ¦¬μ λ¨μμλ€.
3-2. μ€ν μμ
μ€ν μμμ λ©μλμ μ§μλ³μμ λ§€κ°λ³μλ₯Ό νλ μ(frame) ννλ‘ μ μ₯νλ€.
μλ₯Ό λ€μ΄, HTTP μμ²μ΄ λ€μ΄μ€λ©΄ ν΄λΉ μμ²μ μ²λ¦¬νλ 컨νΈλ‘€λ¬ λ©μλκ° νΈμΆλ λ, ν΄λΉ λ©μλμ λ§€κ°λ³μ, μ§μλ³μ, λ¦¬ν΄ μ£Όμ λ±μ΄ μ€νμ push λλ€. μ΄ν λ©μλ μ€νμ΄ μλ£λλ©΄ ν΄λΉ μ 보λ μ€νμμ pop λμ΄ μ κ±°λλ€.
μ€ν μμμ μ»΄νμΌ νμμ ν λΉλλ€.
3-3. ν μμ
ν μμμ λμ μΌλ‘ μμ±λ κ°μ²΄λ€μ μ μ₯νλ€.
μ€νλ§ λΆνΈ μ ν리μΌμ΄μ μμ new ν€μλλ‘ μμ±λ κ°μ²΄λ λ°°μ΄, Sprign Bean, JPA μν°ν° κ°μ²΄ λ± λ€μν κ°μ²΄λ€μ΄ μ΄ μμμ ν λΉλλ€. GC(κ°λΉμ§ 컬λ ν°)μ κ΄λ¦¬ λμμ΄κΈ° λλ¬Έμ, λμ΄μ μ°Έμ‘°λμ§ μλ κ°μ²΄μ λ©λͺ¨λ¦¬ μμμ GCμ μν΄ νμλλ€.
ν μμμ λ°νμμ ν λΉλλ€.
ν μμμ GCμ κ΄λ¦¬ λμμ΄λΌκ³ νλ€.
κ·Έλ λ€λ©΄ ν μμμ΄ μ΄λ»κ² ꡬμ±λμ΄ μκ³ GCλ μ΄λ₯Ό μ΄λ»κ² κ΄λ¦¬νλμ§ κΆκΈνλ€λ©΄ μ΄ κΈμ μ°Έκ³ νμ.
μ°Έκ³ μλ£
μλ°κ°μλ¨Έμ , JVMμ΄λ 무μμΈκ°?
μλ° μ½λμ λ©μλ, μ€νν± λ³μ λ±μ λ©λͺ¨λ¦¬μ μ΄λμ μμΉν κΉ?
[Java] μλ° ν΄λμ€λ‘λ(Class Loader)
[java] μλ° λ©λͺ¨λ¦¬ ꡬ쑰(static, stack, heap)
'π± JAVA & SPRING > Java (JVM)' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Java μ ν리μΌμ΄μ μ΄ μ€νλ λ CPUκ° λ©λͺ¨λ¦¬λ₯Ό μ΄λ»κ² μ¬μ©ν κΉ? (0) | 2023.08.28 |
---|---|
JVM GCμ μ²λ¦¬ κ³Όμ (0) | 2023.08.24 |