JVM μ λν΄μ
β’
μλ° νλ‘κ·Έλ¨ μ€ννκ²½μ λ§λ€μ΄ μ£Όλ μννΈμ¨μ΄
β’
μλ° μ½λλ₯Ό μ»΄νμΌνμ¬ .class λ°μ΄νΈ μ½λλ‘ λ§λ€λ©΄ μ΄ μ½λκ° μλ° κ°μ λ¨Έμ νκ²½μμ μ€ν
β’
Javaλ νλ«νΌμ μ’
μμ μ΄μ§ μμ§λ§ JVMμ νλ«νΌμ μ’
μμ
β’
interpreter λ°©μ JIT λ°©μ νΌμ©
β¦
interpreter λ°©μ: ν μ€μ© ν΄μ, μ€ν
β¦
JIT λ°©μ:
βͺ
λ°μ΄νΈμ½λλ₯Ό JIT μ»΄νμΌλ¬λ₯Ό μ΄μ©ν΄ νλ‘κ·Έλ¨μ μ€μ μ€ννλ μμ (λ°μ΄νΈμ½λλ₯Ό μ€ννλ μμ )μ κ° OSμ λ§λ Native Codeλ‘ λ³ν
βͺ
JIT μ»΄νμΌλ¬λ κ°μ μ½λλ₯Ό λ§€λ² ν΄μνμ§ μκ³ , μ€νν λ μ»΄νμΌμ νλ©΄μ ν΄λΉ μ½λλ₯Ό μΊμ±ν΄λ²λ¦½λλ€. μ΄νμλ λ°λ λΆλΆλ§ μ»΄νμΌνκ³ , λλ¨Έμ§λ μΊμ±λ μ½λλ₯Ό μ¬μ©
JVM λμ λ°©μ
1.
μλ°λ‘ κ°λ°λ νλ‘κ·Έλ¨μ μ€ννλ©΄ JVMμ OSλ‘λΆν° λ©λͺ¨λ¦¬λ₯Ό ν λΉν©λλ€.
2.
μλ° μ»΄νμΌλ¬(javac)κ° μλ° μμ€μ½λ(.java)λ₯Ό μλ° λ°μ΄νΈμ½λ(.class)λ‘ μ»΄νμΌν©λλ€.
3.
Class Loaderλ₯Ό ν΅ν΄ JVM Runtime Data Areaλ‘ λ‘λ©ν©λλ€.
4.
Runtime Data Areaμ λ‘λ© λ .classλ€μ Execution Engineμ ν΅ν΄ ν΄μν©λλ€.
5.
ν΄μλ λ°μ΄νΈ μ½λλ Runtime Data Areaμ κ° μμμ λ°°μΉλμ΄ μννλ©° μ΄ κ³Όμ μμ Execution Engineμ μν΄ GCμ μλκ³Ό μ€λ λ λκΈ°νκ° μ΄λ£¨μ΄μ§λλ€.
JVM λ΄λΆ ꡬ쑰
β’
ν΄λμ€ λ‘λ(Class Loader)
β¦
νλ‘κ·Έλ¨μ΄ μ€ν μ€μΈ λ°νμμμμΌ λͺ¨λ μ½λκ° μλ° κ°μ λ¨Έμ κ³Ό μ°κ²°
β¦
λμ μΌλ‘ ν΄λμ€λ₯Ό λ‘λ©ν΄μ£Όλ μν μ νλ κ²μ΄ λ°λ‘ ν΄λμ€ λ‘λ(class loader)
β¦
JVMμ΄ μ΄μ체μ λ‘λΆν° ν λΉλ°μ λ©λͺ¨λ¦¬ μμμΈ Runtime Data Areasμ Method Areaμ λ°°μΉ
β’
μ€ν μμ§(Execution Engine)
β¦
λ‘λλ λ°μ΄νΈμ½λλ₯Ό μ€ννλ λ°νμ λͺ¨λμ΄ μ€ν μμ§
β’
λ°νμ λ°μ΄ν° μμ (Runtime Data Area)
β¦
JVMμ λ©λͺ¨λ¦¬ μμμΌλ‘ μλ° μ ν리μΌμ΄μ
μ μ€νν λ μ¬μ©λλ λ°μ΄ν°λ€μ μ μ¬νλ μμ
β’
κ°λΉμ§ 컬λ ν°(Garbage Collector)
β¦
λλ μ¬μ©νμ§ μλ λ©λͺ¨λ¦¬λ₯Ό μλμΌλ‘ νμ
β¦
λ°λΌμ κ°λ°μκ° λ°λ‘ λ©λͺ¨λ¦¬λ₯Ό κ΄λ¦¬νμ§ μμλ λλ―λ‘, λμ± μμ½κ² νλ‘κ·Έλλ°μ ν μ μλλ‘ λλλ€.
β¦
Heap λ©λͺ¨λ¦¬ μμμ μμ±(μ μ¬)λ κ°μ²΄λ€ μ€μ μ°Έμ‘°λμ§ μμ κ°μ²΄λ€μ νμ ν μ κ±°νλ μν μ νλ©° ν΄λΉ μν μ νλ μκ°μ μ νν μΈμ μΈμ§λ₯Ό μ μ μμ΅λλ€.
β¦
GCμν μ μννλ μ€λ λλ₯Ό μ μΈν λλ¨Έμ§ λͺ¨λ μ€λ λλ€μ μΌμμ μ§μν
JVM λ©λͺ¨λ¦¬ ꡬ쑰
β’
ν μμ, λ©μλ μμμ λͺ¨λ μ€λ λκ° κ³΅μ ν΄μ μ¬μ©
λ©μλ μμ(Method Area)
β’
ν΄λμ€ λ©€λ² λ³μμ μ΄λ¦, λ°μ΄ν° νμ
, μ κ·Ό μ μ΄μ μ 보μ κ°μ κ°μ’
νλ μ 보
β’
λ©μλ μ 보, λ°μ΄ν° Type μ 보, Constant Pool, staticλ³μ, final class λ±μ΄ μμ±λλ μμ
ν μμ (Heap Area)
β’
new ν€μλλ‘ μμ±λ κ°μ²΄μ λ°°μ΄μ΄ μμ±λλ μμ
β’
μ£ΌκΈ°μ μΌλ‘ GCκ° μ κ±°νλ μμ
β’
μ€ν μμ, PC λ μ§μ€ν°, λ€μ΄ν°λΈ λ©μλ μ€ν λͺ¨λ μ€λ λκ° κ³΅μ ν΄μ μ¬μ© (GCμ λμ)
μ€ν μμ(Stack Area)
β’
μ§μλ³μ, νλΌλ―Έν°, λ¦¬ν΄ κ°, μ°μ°μ μ¬μ©λλ μμ κ° λ±μ΄ μμ±λλ μμ
PC λ μ§μ€ν° (PC Register)
β’
Threadκ° μμ±λ λλ§λ€ μμ±λλ μμμΌλ‘ νλ‘κ·Έλ¨ μΉ΄μ΄ν°, μ¦ νμ¬ μ€λ λκ° μ€νλλ λΆλΆμ μ£Όμμ λͺ
λ Ήμ μ μ₯νκ³ μλ μμ
λ€μ΄ν°λΈ λ©μλ μ€ν(Native Method Stack)
1.
μλ° μ΄μΈμ μΈμ΄(C, C++, μ΄μ
λΈλ¦¬ λ±)λ‘ μμ±λ λ€μ΄ν°λΈ μ½λλ₯Ό μ€νν λ μ¬μ©λλ λ©λͺ¨λ¦¬ μμμΌλ‘ μΌλ°μ μΈ C μ€νμ μ¬μ©ν©λλ€.
2.
λ³΄ν΅ C/C++ λ±μ μ½λλ₯Ό μννκΈ° μν μ€νμ λ§νλ©° (JNI) μλ° μ»΄νμΌλ¬μ μν΄ λ³νλ μλ° λ°μ΄νΈ μ½λλ₯Ό μ½κ³ ν΄μνλ μν μ νλ κ²μ΄ μλ° μΈν°ν리ν°(interpreter)
κ°λΉμ§ 컬λ ν°
β’
μλ°μ λ©λͺ¨λ¦¬ κ΄λ¦¬ λ°©λ² μ€μ νλλ‘ JVMμ Heap μμμμ λμ μΌλ‘ ν λΉνλ λ©λͺ¨λ¦¬ μμ μ€ νμ μκ² λ λ©λͺ¨λ¦¬ μμμ μ£ΌκΈ°μ μΌλ‘ μμ νλ νλ‘μΈμ€
β’
μ°Έμ‘°κ° ν΄μ λ κ°μ²΄(unreachable)κ° GC λμ
μ₯μ
β’
κ°λ°μ μ
μ₯μμ λ©λͺ¨λ¦¬ κ΄λ¦¬, λ©λͺ¨λ¦¬ λμ(Memory Leak) λ¬Έμ μμ λν΄ μλ²½νκ² κ΄λ¦¬νμ§ μμλ λμ΄ μ€λ‘―μ΄ κ°λ°μλ§ μ§μ€ν μ μλ€λ μ₯μ
λ¨μ
β’
κ°λ°μκ° λ©λͺ¨λ¦¬κ° μΈμ ν΄μ λλμ§ μ ννκ² μ μ μλ€.
β’
κ°λΉμ§ 컬λ μ
(GC)μ΄ λμνλ λμμλ λ€λ₯Έ λμμ λ©μΆκΈ° λλ¬Έμ μ€λ²ν€λκ° λ°μνλ€.
Mark and Sweep μκ³ λ¦¬μ¦
β’
Mark κ³Όμ : λ¨Όμ Rootλ‘λΆν° κ·Έλν μνλ₯Ό ν΅ν΄ μ°κ²°λ κ°μ²΄λ€μ μ°Ύμλ΄μ΄ κ°κ° μ΄λ€ κ°μ²΄λ₯Ό μ μ‘°νκ³ μλμ§ μ°Ύμμ λ§νΉν©λλ€.
β’
Sweep κ³Όμ : μ°Έμ‘°νκ³ μμ§ μμ κ°μ²΄ μ¦ Unreachable κ°μ²΄λ€μ Heapμμ μ κ±°ν©λλ€.
β’
Compact κ³Όμ : Sweep νμ λΆμ°λ κ°μ²΄λ€μ Heapμ μμ μ£Όμλ‘ λͺ¨μ λ©λͺ¨λ¦¬κ° ν λΉλ λΆλΆκ³Ό κ·Έλ μ§ μμ λΆλΆμΌλ‘ μμΆν©λλ€. (κ°λΉμ§ 컬λ ν° μ’
λ₯μ λ°λΌ νμ§ μλ κ²½μ°λ μμ)
GC λμ κ³Όμ
1.
κ°μ²΄κ° μ²μ μμ±λκ³ Heapμμμ Edenμ age-bit 0μΌλ‘ ν λΉλ©λλ€. μ΄ age-bitλ Minor GCμμ μ΄μλ¨μ λλ§λ€ 1μ© μ¦κ°
2.
μκ°μ΄ μ§λ Heap Areaμ Eden μμμ κ°μ²΄κ° λ€ μμ΄κ² λλ©΄ Minor GCκ° νλ² μΌμ΄λκ² λκ³ μ°Έμ‘° μ λμ λ°λΌ Servivor0 μμμΌλ‘ μ΄λνκ±°λ νμ
3.
κ³μν΄μ Edenμμμλ μ κ· κ°μ²΄λ€μ΄ μμ±λ©λλ€. μ΄λ κ² λ Edenμμμ κ°μ²΄κ° λ€ μμ΄κ² λλ©΄ Young Generation(Eden+Servivor) μμμ μλ κ°μ²΄λ€μ λΉμ΄μλ SurvivalμΈ Survival1 μμμ μ΄λνκ³ μ΄μλ¨μ λͺ¨λ κ°μ²΄λ€μ ageκ° 1μ© μ¦κ°
4.
λλ€μ Eden μμμ μ κ· κ°μ²΄λ€λ‘ κ°λ μ°¨κ² λλ©΄ λ€μνλ² minor GCκ° μΌμ΄λκ³ Young Generation(Eden+Servivor) μμμ μλ κ°μ²΄λ€μ λΉμ΄μλ SurvivalμΈ Survival0μΌλ‘ μ΄λμν¨ λ€ ageλ₯Ό 1 μ¦κ°μν΅λλ€. μ΄ κ³Όμ μ κ³μ λ°λ³΅
5.
μ κ³Όμ μ λ°λ³΅νλ€ λ³΄λ©΄ age bitκ° νΉμ μ«μ μ΄μμΌλ‘ λλ κ²½μ°κ° λ°μν©λλ€. μ΄λ JVMμμ μ€μ ν΄λμ age bitμ λλ¬νκ² λλ©΄ μ€λ«λμ μ°μΌ κ°μ²΄λΌκ³ νλ¨νκ³ Old generation μμμΌλ‘ μ΄λμν΅λλ€. μ΄ κ³Όμ μ νλ‘λͺ¨μ
(Promotion)
6.
μκ°μ΄ μ§λ Oldμμμ ν λΉλ λ©λͺ¨λ¦¬κ° νμ©μΉλ₯Ό λκ² λλ©΄, Old μμμ μλ λͺ¨λ κ°μ²΄λ€μ κ²μ¬νμ¬ μ°Έμ‘°λμ§ μλ κ°μ²΄λ€μ νκΊΌλ²μ μμ νλ GCκ° μ€νλ©λλ€. μ΄λ κ² Old generationμμμ λ©λͺ¨λ¦¬λ₯Ό νμνλ GCλ₯Ό Major GCλΌκ³ ν©λλ€. Major GCλ μκ°μ΄ μ€λ 걸리λ μμ
μ΄κ³ μ΄λ GCλ₯Ό μ€ννλ μ€λ λλ₯Ό μ μΈν λͺ¨λ μ€λ λλ μμ
μ λ©μΆκ² λ©λλ€. μ΄λ₯Ό 'Stop-the-World'
Heap Area
Young Generation μμ
β’
μλ° κ°μ²΄κ° μμ±λμλ§μ μ μ₯λκ³ , μκΈ΄μ§ μΌλ§ μλλ κ°μ²΄κ° μ μ₯λλ 곡κ°
β’
Heap μμμ κ°μ²΄κ° μμ±λλ©΄ μ΅μ΄λ‘ Eden μμμ ν λΉ
β’
μ΄ μμμ λ°μ΄ν°κ° μ΄λμ λ μμ΄κ² λλ©΄ μ°Έμ‘°μ λμ λ°λΌ Servivorμ λΉ κ³΅κ°μΌλ‘ μ΄λλκ±°λ νμ
β’
Young Generation(Eden+Servivor) μμμ΄ μ°¨κ² λλ©΄ λ μ°Έμ‘°μ λμ λ°λΌ OldμμμΌλ‘ μ΄λ λκ² λκ±°λ νμ
β’
μ΄λ κ² Young Generationκ³Ό Tenured Generation μμμ GCλ₯Ό Minor GC
β’
Oldμμμ ν λΉλ λ©λͺ¨λ¦¬κ° νμ©μΉλ₯Ό λκ² λλ©΄, Old μμμ μλ λͺ¨λ κ°μ²΄λ€μ κ²μ¬νμ¬ μ°Έμ‘°λμ§ μλ κ°μ²΄λ€μ νκΊΌλ²μ μμ νλ GCκ° μ€ν
β’
μκ°μ΄ μ€λ 걸리λ μμ
μ΄κ³ μ΄ λ GCλ₯Ό μ€ννλ μ°λ λλ₯Ό μ μΈν λͺ¨λ μ€λ λλ μμ
μ λ©μΆ€. μ΄λ₯Ό 'Stop-the-World'
β’
κ·Έλ¦¬κ³ μ΄λ κ² 'Stop-the-World'κ° λ°μνκ³ Oldμμμ λ©λͺ¨λ¦¬λ₯Ό νμνλ GCλ₯Ό Major GC