πToday...
μμνκΈ°μ μ μκ³ μΆμ΄μ μκΈ΄μ§€ μ°Ύλ€κ° κ°μ Έμλλ° μμ§μ§ μΉ΄νμμ μ리λ΄μ μμλ€γ γ γ μ·¨ν₯μ 격 κ°κ·Έ
βμ€λμ TIL(Today I Learn)
JVM
JVMμ μλ° νλ‘κ·Έλ¨μ μ€νμν€λ λꡬμ΄λ€. .java μ½λλ₯Ό μ»΄νμΌ νμ¬ .class λ°μ΄νΈ μ½λλ‘ λ§λ€λ©΄ μ΄μ½λκ° JVMνκ²½μμ μ€νλλ€. JVMμ JRE(Java Runtime Environment)μ ν¬ν¨λμ΄μλ€. μ¦, μλ°λ‘ μμ±ν μμ€μ½λλ₯Ό ν΄μνμ¬ μ€ννλ λ³λμ νλ‘κ·Έλ¨μ΄λ€.
μλ°λ "μ΄μ체μ λ‘ λΆν° λ 립μ "μ΄λΌκ³ λ§νλλ° μ΄κ²μ΄ JVMμ ν΅ν΄ ꡬνλλκ²μ΄λ€. νλμ λ°μ΄νΈμ½λλ‘ λͺ¨λ νλ«νΌμμ λμμ΄ κ°λ₯ν΄μ§λ€. μ¦, μ κ·Έλ¦Όμμ λ³Όμμλ―μ΄ μλ°λ νλ«νΌμλ μ’ μμ μ΄μ§ μμ§λ§, JVMμ νλ«νΌμ μ’ μμ μ΄λ€. 리λ μ€μ JVMκ³Ό μλμ°μ JVMμ λ€λ₯΄κ³ μλ°λ₯Ό μ€ννκΈ° μν΄μλ λ°λμ JVMμ΄ μ€μΉλμ΄μμ΄μΌ νλ€.
λ°μ΄νΈ μ½λ : μΈκ°μΉνμ JAVAμ½λ => μ»΄ν¨ν°κ° ν΄μνλ κΈ°κ³μ΄μ μ€κ° λ¨κ³
JVMμ ꡬ쑰
μ§κΈκΉμ§ λ²νΌλ§ λλ₯΄λ©΄ μλμΌλ‘ μ§νλλ μλ°μ½λμ μ€νμμλ₯Ό κ°λ¨νκ² μμ보μ!
1. μλ° μμ€μ½λ μμ±(.java) νμ μ€ν
2. μ»΄νμΌλ¬κ° μ€νλμ΄ μ»΄νμΌμ μ§ν
3. μ»΄νμΌμ κ²°κ³Όλ‘ μλ°μ½λ(.java) => λ°μ΄νΈμ½λ(.class) νμΌλ‘ λ³ν
4. JVMμ΄ μ΄μ체μ λ‘ λΆν° μμ€μ½λ μ€νμ νμν λ©λͺ¨λ¦¬λ₯Ό ν λΉλ°μ(Runtime Data Area)
5. ν΄λμ€λ‘λκ° λ°μ΄νΈ μ½λνμΌμ JVMμ Runtime Data Areaμ μ μ¬(μμ€μ½λλ₯Ό λ©λͺ¨λ¦¬μ λ‘λ)
6. λ‘λκ° μλ£λλ©΄ μ€νμμ§(Excution Engine)μ΄ Runtime Data Areaμ μ μ¬λ λ°μ΄νΈμ½λλ₯Ό μ€ν
7. μΈν°ν리ν°λ₯Ό ν΅ν΄ μ½λλ₯Ό νμ€μ© κΈ°κ³μ΄λ‘ λ²μνμ¬ μ€νμν΄
8. νΉμ λ°μ΄νΈμ½λκ° μμ£Ό μ€νλ μμ JIT Compiler(Just-In-Time)λ₯Ό ν΅ν΄ λ°μ΄νΈμ½λ μ 체λ₯Ό κΈ°κ³μ΄λ‘ λ²μνκ³ μ€ν
# JIT μ»΄νμΌλ¬
JIT μ»΄νμΌλ¬λ κ°μ μ½λλ₯Ό λ§€λ² ν΄μνμ§ μκ³ , μ€νν λ μ»΄νμΌμ νλ©΄μ ν΄λΉ μ½λλ₯Ό μΊμ±ν΄λ²λ¦°λ€. μ΄νμ λ°λ λΆλΆλ§ μ»΄νμΌνκ³ , λλ¨Έμ§λ μΊμ±λ μ½λλ₯Ό μ¬μ©νμ¬ μ»΄νμΌνλ€. μ΄λ κ² JIT μ»΄νμΌλ¬λ μ΄μ체μ μ λ§κ² λ°μ΄νΈ μ€ν μ½λλ‘ ν λ²μ λ³ννμ¬ μ€ννκΈ° λλ¬Έμ μΈν°νλ¦¬ν° λ°©μλ³΄λ€ μ±λ₯μ΄ 10λ°° ~ 20λ°° μ λ λ λλ€.
JVMλ©λͺ¨λ¦¬ ꡬ쑰
# Stack Area / Heap Area
λ©μλκ° νΈμΆλλ©΄ λ©μλλ₯Ό μν 곡κ°μΈ Method Frameμ΄ μμ±λλ€, μ΄λ λ©μλ λ΄λΆμ μ¬μ©λλ μ°Έμ‘°λ³μ, λ§€κ°λ³μ, μ§μλ³μ, 리ν΄κ°, μ°μ°μ μΌμ΄λλ κ°λ€μ΄ μμλ‘ μ μ₯λλ€. μ΄λ¬ν Method Frameμ΄ Stackμ νΈμΆλλ μμλλ‘ μμ΄κ³ λμμλ£μμ μμμΌλ‘ μ κ±°λλ€.
JVMμμλ λ¨ νλμ Heap areaκ° μ‘΄μ¬νλ€. JVMμ΄ λμνλ©΄ μ΄μμμ μλμ μΌλ‘ μμ±λλ©°, κ°μ²΄, μΈμ€ν΄μ€ λ³μ, λ°°μ΄ λ±μ μ μ₯νλ€. μλ₯Όλ€μ΄
Fruit apple = new Fruit();
new Fruit()κ° μ€νλλ©΄ Heapμμμ μΈμ€ν΄μ€κ° μμ±λκ³ , μΈμ€ν΄μ€κ° μμ±λ μ£Όμκ°μ appleμ ν λΉν΄μ€λ€. μ΄λ appleμ΄ Stackμ μ μΈλ λ³μμ΄κ³ , κ°μ²΄λ₯Ό μ κ·Όνλ©΄ Stackμ μ μ₯λ μ°Έμ‘°λ³μλ₯Ό ν΅ν΄μ Heapμμμ μ‘΄μ¬νλ κ°μ²΄λ₯Ό λ€λ£¨λ κ²μ΄λ€. μ΄λ¬ν Heapμμμ μ€μ κ°μ²΄μ κ°μ΄ μ μ₯λλ 곡κ°μ΄λ€.
Garbage Collection
κ°λΉμ§ 컬λ μ μ GCλΌκ³ μ€μ¬μλ λΆλ₯΄λ©°, JVMμ Heap μμμμ λμ μΌλ‘ ν λΉνλ λ©λͺ¨λ¦¬ μμμ€ νμ μκ²λ λ©λͺ¨λ¦¬ μμ(Unreachable) μ μ£ΌκΈ°μ μΌλ‘ μμ νλ νλ‘μΈμ€μ΄λ€. Cλ C++μ κ²½μ°μ κ°λ°μκ° μλμΌλ‘ λ©λͺ¨λ¦¬λ₯Ό ν λΉνκ³ ν΄μ ν΄μ€μΌ νμ§λ§, μλ°μμλ λ©λͺ¨λ¦¬ κ΄λ¦¬λ₯Ό μλμ μΌλ‘ ν΄μ£ΌκΈ° λλ¬Έμ, λ©λͺ¨λ¦¬ λμλ±μ λ¬Έμ μ λν΄ ν¬κ² κ΄μ¬νμ§ μμλ λλ€.
# GCμ λ¨μ
1. λ©λͺ¨λ¦¬μ ν΄μ μμ (GCμ λμ μμ )μ μ ννκ² μμμλ€.
2. GCκ° λμνλ λμ λ€λ₯Έ λμμ λ©μΆκΈ° λλ¬Έμ μ€λ²ν€λκ° λ°μνλ€.
# GCμ λμλ°©μ
GCλ Heapμ ν λΉνλ λ©λͺ¨λ¦¬λ₯Ό μ£ΌκΈ°μ μΌλ‘ μμ ν΄μ€λ€κ³ νλ€. Heapμ μμμ κ°μ²΄κ° μμ±λκ³ μ΄μμλ κΈ°κ°μ λ°λΌμ Youngκ³Ό Old μμμΌλ‘ λλλ€.
λ¨Όμ , Young μμμλ μλ‘κ² μμ±λ κ°μ²΄κ° ν λΉλκ³ , μ¬κΈ°μ λ§μ κ°μ²΄κ° μμ±λκ³ μ¬λΌμ§λ κ²μ λ°λ³΅νλ€. μ΄κ³³μμ νλνλ κ°λΉμ§ 컬λ ν°λ₯Ό Minor GCλΌκ³ λΆλ₯Έλ€.
κ·Έλ¦¬κ³ Oldμμμ Youngμμμμ μνλ₯Ό μ μ§νκ³ μ΄μλ¨μ κ°μ²΄λ€μ΄ 볡μ¬λλ κ³³μ΄λ€. μ΄κ³³μ Youngμμλ³΄λ€ ν¬κ² ν λΉλκ³ , ν¬κΈ°κ° ν° λ§νΌ GCλ μ κ² λ°μνλ€. μ΄κ³³μμ νλνλ κ°λΉμ§μ»¬λ ν°λ₯Ό Major GCλΌκ³ λΆλ₯Έλ€.