JVM(Java Virtual Machine)μ μλ° νλ‘κ·Έλ¨μ μ€ννκΈ° μν κ°μ μ»΄ν¨ν°(μΆμνλ κΈ°κ³)μ΄λ€.
μλ°μλ WORA
λΌλ μ€μν νΉμ§μ΄ μ‘΄μ¬νλ€.
μ΄λ "Write Once Run Anywhere"
μ μ€λ§λ‘, ν λ² μμ±λ μ½λλ μ΄λμμλ μ¬μ© κ°λ₯νλ€λ λ»μ΄λ€.
μ¦, ν λ² μ»΄νμΌμ ν΄ λλ©΄ μ΄λ€ OS μμμλ μ¬μ©ν μ μλ€λ κ²μ΄λ©°, μ΄λ₯Ό OS μ’
μμ μ΄μ§ μλ€
κ³ λ λΆλ₯Ό μ μλ€.
ν΄λΉ νΉμ§μ κΈ°μ‘΄μ μ΄μ λΈλ¦¬μ΄, CμΈμ΄μ λ¨μ μ 보μν΄μ£Όμκ³ , μ΄λ‘ μΈν΄ λ§μ μ¬λλ€μ΄ μλ°λ₯Ό μ μ©νκ² λμλ€.
κ·Έλ¦¬κ³ μ΄λ₯Ό κ°λ₯νκ² ν΄ μ£Όλ κ²μ΄ λ°λ‘
JVM
μ μν μ΄λ€.
Javaλ *.java
, Pythonμ *.py
μ κ°μ μμμ½λλ₯Ό λ§λ€κ² λλ€.
μ΄λ μΈκ°μ΄ μ½μ μ μλ κ³ μμ€ μΈμ΄λ‘, CPUκ° μ½κ² νκΈ° μν΄μλ κΈ°κ³μ΄λ‘ μ»΄νμΌ
μ ν΄ μ£Όλ κ³Όμ μ΄ νμνλ€.
μ¬κΈ°μ μλ°λ JVMμ κ±°μ³μ OSλ‘ λλ¬νκΈ° λλ¬Έμ λ°λ‘ κΈ°κ³μ΄λ‘ μ»΄νμΌ νλ κ²μ΄ μλλΌ, JVMμ΄ μΈμν μ μλ Java Bytecode
λ‘ λ³νλλ€.
μλ° λ°μ΄νΈμ½λλ, JVMμ λͺ λ Ήμ΄ μ§ν©μ΄λ€. ν΄λΉ λ°μ΄νΈμ½λμ JVMμ λμμ μΌκ΄λκΈ° λλ¬Έμ, OSμ κ΅¬λΆ μμ΄ μ€νν μ μκ² λλ€.
μ¬κΈ°μ λ°μ΄νΈμ½λλ κ° λͺ λ Ήμ΄κ° 1λ°μ΄νΈ λ¨μλ‘ κ΅¬μ±λμ΄ μκΈ° λλ¬Έμ μ΄λ° μ΄λ¦μ΄ λΆμλ€.
λ°μ΄νΈμ½λλ₯Ό λ§λ€μ΄ μ£Όλ μν μ λκ° ν κΉ?
μ΄λ Java Compiler
κ° λ§‘μΌλ©°, JDKλ₯Ό μ€μΉνλ©΄ bin λ΄μ μ‘΄μ¬νλ javac.exe
λ₯Ό λ§νλ€.
test.java
λΌλ νμΌμ΄ μ‘΄μ¬νλ€κ³ κ°μ ν΄ λ³΄μ.
μλ λͺ
λ Ήμ΄λ₯Ό μ€ννλ©΄, .java(μμ μ½λ) -> .class(λ°μ΄νΈμ½λ)
λ‘ λ³νν μ μλ€.
javac test.java
κ·ΈλΌ λμΌν λλ ν 리 λ΄μ λ°μ΄νΈμ½λ .class
νμΌμ΄ μκΈ°κ² λλ€.
λ°μ΄νΈμ½λλ JVMμ΄ μ½μ μ μλ λͺ
λ Ήμ΄μ΄λ€.
JVMμ μ΄λ₯Ό μ½κ³ μ»΄ν¨ν°κ° μΈμν μ μλ λ°μ΄λ리 μ½λ
λ‘ λ³ννκ² λλ€.
λ°μ΄λ리 μ½λ
μ΄μ§ μ½λλΌκ³ λ λΆλ₯΄λ©°, 0κ³Ό 1λ‘λ§ κ΅¬μ±λμ΄ μλ€.
CPUκ° μ΄ν΄νλ λͺ λ Ήμ΄ μ§ν©μΈκΈ°κ³μ΄
λ ν΄λΉ μ΄μ§ μ½λλ‘ μ΄λ£¨μ΄μ§λ€.
μ¬κΈ°μ λ°μ΄νΈμ½λ -> λ°μ΄λ리 μ½λ
λ‘ λ³νν΄ μ£Όλ κ²μ΄ JIT μ»΄νμΌλ¬
μ΄λ€.
JIT μ»΄νμΌλ¬λ λμ λ²μμ νλ€κ³ λ λ§νλλ°, νλ‘κ·Έλ¨μ μ€ννλ©° μ€μκ°μΌλ‘ κΈ°κ³μ΄λ‘ λ²μνλ μμ μ μννκΈ° λλ¬Έμ΄λ€.
κ·Έλ κΈ°μ Just-In-Time(JIT) μ»΄νμΌλ¬
μΈ κ²μ΄λ€.
JIT μ»΄νμΌλ¬λ μ²μλΆν° μλ μμλ μλλ€.
μλ°λ WORAλΌλ μ₯μ μ΄ μ‘΄μ¬νμ§λ§, μ΄λ₯Ό μν΄μλ μλμ κ³Όμ μ΄ νμνλ€.
- μμμ½λλ₯Ό μλ° μ»΄νμΌλ¬κ° λ°μ΄νΈμ½λλ‘ μ»΄νμΌνλ€.
- λ°μ΄νΈμ½λλ₯Ό JVMμ΄ ν μ€μ©, μ¦ μΈν°νλ¦¬ν° λ°©μμΌλ‘ μ½μ΄μ μ€ννλ€.
κ·Έλ κΈ°μ λ€λ₯Έ μΈμ΄μ λΉν΄μ μ±λ₯μ΄ λ리λ€λ λ¨μ μ΄ μ‘΄μ¬νκ³ , μ΄λ₯Ό κ°μ νκΈ° μν΄μ νμν κ²μ΄ JIT μ»΄νμΌλ¬μ΄λ€.
μ΄λ¬ν νΉμ§ λλ¬Έμ μλ°λ μ»΄νμΌ μΈμ΄κ° μλ νμ΄λΈλ¦¬λ μΈμ΄λΌ λΆλ₯΄λ κ²μ΄ λ§μΌλ©°, μ΄μ λν΄μλ κΈλ‘ μ 리ν΄λμλ€.
JVMμ μλμ κ°μ΄ ꡬμ±λμ΄ μλ€.
- ν΄λμ€ λ‘λ(Class Loader)
- μ€ν μμ§(Execution Engine)
2-1. μΈν°ν리ν°(Interpreter)
2-2. JIT μ»΄νμΌλ¬(Just-In-Time Compiler)
2-3. κ°λΉμ§ μ½λ ν°(Garbage Collector)- λ°νμ λ°μ΄ν° μμ(Runtime Data Area)
μ΄λ―Έμ§ μΆμ² λ° μμΈν μ€λͺ κΈ
ν΄λμ€ λ‘λ
λ μ΄λ¦ κ·Έλλ‘, JVM λ΄μ .class
νμΌμ λ‘λνκ³ λ§ν¬λ₯Ό ν΅ν΄ λ°°μΉνλ μμ
μ μννλ λͺ¨λμ΄λ€.
μλ°λ μ»΄νμΌ νμμ΄ μλ, λ°νμ μμ μ ν΄λμ€ λ‘λ© λ° λ§ν¬κ° μ΄λ£¨μ΄μ§λ λμ λ‘λ©(Dynamic Loading) λ°©μμ λ°λ₯Έλ€.
μ¬κΈ°μ JVMμ λ©μλ μμμ λμ μΌλ‘ ν΄λμ€ λ‘λλ₯Ό λ΄λΉνλ λΆλΆμ΄ ν΄λμ€ λ‘λμ΄λ€.
ν΄λμ€ λ‘λλ 3λ¨κ³λ‘ λλμ΄μ Έ μλ€.
λ‘λ©
- λ°μ΄νΈμ½λ(.class)λ₯Ό λ©μλ μμμ μ μ₯νλ€.
- κ° λ°μ΄νΈμ½λλ JVMμ μν΄μ λ©μλ μμμ λ€μ μ 보λ€μ μ μ₯νλ€.
1) λ‘λλ ν΄λμ€ + κ·Έμ λΆλͺ¨ ν΄λμ€μ μ 보
2) ν΄λμ€ νμΌκ³Ό Class, Interface, Enumμ κ΄λ ¨ μ¬λΆ
3) λ³μ & λ©μλ λ± μ 보
λ§ν¬
1)κ²μ¦
: μ½μ ν΄λμ€(λ°μ΄νΈμ½λ)κ° μλ° μΈμ΄ λͺ μΈ λ° JVM λͺ μΈμ λͺ μλλλ‘ μ ꡬμ±λμ΄ μλμ§ κ²μ¬νλ€.
2)μ€λΉ
: ν΄λμ€κ° νμλ‘ νλ λ©λͺ¨λ¦¬λ₯Ό ν λΉνκ³ , ν΄λμ€μμ μ μλ νλ & λ©μλ & μΈν°νμ΄μ€λ₯Ό λνλ΄λ λ°μ΄ν° ꡬ쑰λ₯Ό μ€λΉνλ€.
3)λΆμ
: μ¬λ³Όλ¦ λ©λͺ¨λ¦¬ λ νΌλ°μ€λ₯Ό λ©μλ μμμ μλ μ€μ λ νΌλ°μ€λ‘ κ΅μ²΄νλ€.
λ°μ΄νΈμ½λ κ²μ¦κΈ°(Verifier)
κ° μννλ©°, Java Language Specification (JLS, μλ° λͺ
μΈ) & Java Virtual Machine Specification (JVMS, JVM λͺ
μΈ)λ₯Ό μ°Έμ‘°νλ€.μ΄κΈ°ν
- ν΄λμ€ λ³μλ€μ μ μ ν κ°μΌλ‘ μ΄κΈ°ν, μ¦ static νλλ€μ΄ μ€μ λ κ°μΌλ‘ μ΄κΈ°νλλ€.
ν΄λμ€ μ΄κΈ°ν λ¨κ³μμλ static νλμ λν΄μλ§ μ΄κΈ°νλ₯Ό μννλ€.
μλνλ©΄ static
νλλ ν΄λμ€ λ¨μλ‘ κ΄λ¦¬λλ©°, λͺ¨λ μΈμ€ν΄μ€κ° 곡μ νλ μ μμ μΈ μμμ΄κΈ° λλ¬Έμ΄λ€.
λν ν΄λΉ μμμ μΈμ€ν΄μ€ μμ± μ¬λΆμ 무κ΄νκ² μ¬μ©λ μ μκΈ° λλ¬Έμ, JVMμ ν΄λμ€κ° μ²μ λ‘λ©λ λ ν λ²λ§ μ΄κΈ°νλ₯Ό μννκ³ , μ΄νμλ ν΄λΉ νλλ₯Ό λ©λͺ¨λ¦¬μ μ¬λ € λκ³ μ¬μ¬μ©νλ€.
λ°λ©΄, non-static
νλλ κ° μΈμ€ν΄μ€λ§λ€ λ
립μ μΌλ‘ μ‘΄μ¬νλ©°, μΈμ€ν΄μ€κ° μμ±λ λλ§λ€ λ³λλ‘ μ΄κΈ°νλλ―λ‘ ν΄λμ€ μ΄κΈ°ν λ¨κ³μμλ μ²λ¦¬ λμμ΄ μλκ² λλ€.
μ¦, ν΄λμ€ μ΄κΈ°νλ μ μμ μΈ μμμ μΌκ΄μ±κ³Ό ν¨μ¨μ μΈ κ΄λ¦¬λ₯Ό μν΄ static νλμ static λΈλ‘λ§μ λμμΌλ‘ μνλλ€.
μ€μ§μ μΌλ‘ λ°μ΄νΈμ½λλ₯Ό μ€νμν€λ κ³³μ΄λ€.
ν΄λμ€ λ‘λκ° JVM λ°νμ λ°μ΄ν° μμ λ΄μ λ°μ΄νΈμ½λλ₯Ό λ°°μΉμν€κ² λκ³ , μ΄λ₯Ό μ€ν μμ§μ΄ μ€ννλ€.
μ¬κΈ°μλ μλ 3κ°μ§ ꡬμ±μμκ° μ‘΄μ¬νλ€.
- μΈν°ν리ν°
- JIT μ»΄νμΌλ¬
- GC(Garbage Collector)
1, 2λ²μ μ JIT μ»΄νμΌλ¬κ° μκΈ΄ μ΄μ
μμ μ€λͺ
νμΌλ λμ΄κ°κ³ , 3λ² GC
μ λν΄μλ§ κ°λ¨ν μ€λͺ
νκ³ μ νλ€.
κ°λΉμ§ 컬λ ν°
λ JVMμ΄ μ¬μ©νμ§ μλ κ°μ²΄(λ μ΄μ μ°Έμ‘°λμ§ μλ κ°μ²΄)λ₯Ό μλμΌλ‘ νμ§νκ³ ν λ©λͺ¨λ¦¬μμ μ κ±°ν΄μ£Όλ κΈ°λ₯μ΄λ€.
κ°λ°μκ° μ§μ λ©λͺ¨λ¦¬λ₯Ό ν΄μ νμ§ μμλ λλ―λ‘ λ©λͺ¨λ¦¬ λμλ₯Ό λ°©μ§νκ³ μλ°μ μμ μ±μ λμ¬μ£Όλ μν μ νλ€.
GCμ λν΄μλ ν΄λΉ κΈλ‘ μ 리ν΄λμλ€.
λ°νμ λ°μ΄ν° μμ
μ JVMμ΄ μλ° νλ‘κ·Έλ¨μ μ€νν λ μ¬μ©νλ λ©λͺ¨λ¦¬ 곡κ°μ ꡬ쑰λ₯Ό λ»νλ€.
μ΄λ ν΄λμ€ μ 보, κ°μ²΄, λ³μ, μ€λ λ μ€ν μ 보 λ±μ μ μ₯νλ μ¬λ¬ μμμΌλ‘ λλλ€.
κ° μ€λ λλ§λ€ 1κ°μ© μ‘΄μ¬νλ μμ λ©λͺ¨λ¦¬ 곡κ°μΌλ‘, μ€λ λκ° μλ‘ μμ±λ λ ν¨κ» μμ±λλ€.
νμ¬ μ€ν μ€μΈ μλ° λ°μ΄νΈμ½λ λͺ λ Ήμ΄μ μ£Όμλ₯Ό μ μ₯νλ©°, JVMμ΄ μ΄λ€ λͺ λ Ήμ΄λ₯Ό λ€μμ μ€νν μ§λ₯Ό κ²°μ νλ λ° μ¬μ©λλ€.
μ€λ λλ§λ€ λ 립μ μ΄λ―λ‘, μ€λ λ κ° κ°μ μμ΄ λͺ λ Ήμ΄ μ€ν νλ¦μ μΆμ ν μ μλ€.
νλ‘κ·Έλ¨ μ€νκ³Όμ μμ μμλ‘ ν λΉλμλ€κ°, λ©μλλ₯Ό λΉ μ Έλκ°λ©΄ μλ©Έλλ νΉμ±μ λ°μ΄ν°λ₯Ό μ μ₯νκΈ° μν μμμ΄λ€.
λ©μλλ₯Ό νΈμΆν λλ§λ€, ν΄λΉ μμμ κ³ μ ν μ€ν νλ μ
μ΄ μμ±λλ€. λ©μλ μνμ΄ μλ£λλ©΄ νλ μμ΄ μ κ±°λλ€.
μ΄ μμμλ μ§μ λ³μ, λ§€κ° λ³μ, λ¦¬ν΄ κ°, μ°μ° μ€κ° κ²°κ³Ό, κ·Έλ¦¬κ³ ν μμμ κ°μ²΄λ₯Ό κ°λ¦¬ν€λ μ°Έμ‘° κ°(μ£Όμ) λ±μ΄ μ μ₯λλ€.
PC Register μμκ³Ό λμΌνκ² μ€λ λλΉ 1κ°μ© μμ±λλ€. λν μ€λ λ μ’ λ£ μ ν¨κ» μλ©Ένλ€.
Native Method Stackμ μλ° μ½λκ° μλ, C/C++ λ± λ€μ΄ν°λΈ μΈμ΄λ‘ μμ±λ λ©μλ(native method)λ₯Ό μ€νν λ μ¬μ©λλ μ€λ λλ³ μ€ν μμμ΄λ€.
JVMμ JNI(Java Native Interface)
λ₯Ό ν΅ν΄ λ€μ΄ν°λΈ μ½λλ₯Ό νΈμΆν μ μμΌλ©°, μ΄λ μλ° λ°μ΄νΈμ½λκ° μλ κΈ°κ³μ΄ μμ€μ λ€μ΄ν°λΈ μ½λ μ€νμ μν λ³λμ νΈμΆ μ€νμ΄ μ¬μ©λλ€.
μ΄ μμμ μ΄μ체μ μ νΈμΆ κ·μ½μ λ°λΌ, ν¨μ νΈμΆ μ 보(λ¦¬ν΄ μ£Όμ, λ§€κ°λ³μ, μ§μ λ³μ λ±)λ₯Ό μ μ₯νλ©°, μΌλ°μ μΈ C νλ‘κ·Έλ¨μμ μ¬μ©νλ μ€ν λ©λͺ¨λ¦¬ ꡬ쑰μ λ§€μ° μ μ¬νκ² λμνλ€.
μ΄ μ€ν μμ ν¬κΈ°μλ μ νμ΄ μμΌλ©°, κ³Όλν λ€μ΄ν°λΈ νΈμΆμ΄λ μ€λ λ μμ± μ StackOverflowErrorλ OutOfMemoryErrorκ° λ°μν μ μλ€.
ν μ€ SLASH22 - Java Native Memory Leak μμΈμ μ°Ύμμ
Method Areaλ JVMμ΄ ν΄λμ€ μ 보λ₯Ό μ²μ λ©λͺ¨λ¦¬μ λ‘λν λ, ν΄λΉ ν΄λμ€ μμ€μ μ 보λ₯Ό μ μ₯νλ μμμ΄λ€.
μ¬κΈ°μλ ν΄λμ€ μ΄λ¦, λΆλͺ¨ ν΄λμ€ μ 보, static λ³μ, λ©μλ μ 보, μμ ν(Runtime Constant Pool) λ±μ΄ μ μ₯λλ€.
λν ν΄λμ€κ° λ‘λ©λ λ static νλμ κΈ°λ³Έκ° ν λΉ λ° static λΈλ‘ μ€ν μ κΉμ§μ μ λ³΄κ° μ΄ μμμ μ€λΉλλ€.
Runtime Constant Pool(λ°νμ μμ ν)
ν΄λμ€ λλ μΈν°νμ΄μ€κ° μ¬μ©νλ 리ν°λ΄(λ¬Έμμ΄, μ«μ μμ λ±)μ΄λ κΈ°νΈ μ°Έμ‘° μ 보(λ©μλ/νλ μ°Έμ‘°, ν΄λμ€ μ΄λ¦ λ±)λ₯Ό μ μ₯νλ ꡬ쑰λ‘,
JVMμ΄ λ°μ΄νΈμ½λλ₯Ό μ€ννλ λ° νμν λ€μν μμ λ° μ°Έμ‘° μ 보λ₯Ό μ 곡νλ€.
Heapμ μλ°μμ κ°μ²΄μ λ°°μ΄μ μ μ₯νλ λ©λͺ¨λ¦¬ 곡κ°μ΄λ€.
new
μ°μ°μλ₯Ό ν΅ν΄ μμ±λ λͺ¨λ κ°μ²΄λ Heapμ μ μ₯λλ©°, κ°λΉμ§ 컬λ ν°(GC)μ κ΄λ¦¬ λμμ΄ λλ€.
νμ λ€μκ³Ό κ°μ΄ μΈ λΆλΆμΌλ‘ λλλ€.
1. Young Generation
μλ‘κ² μμ±λ κ°μ²΄κ° μ μ₯λλ 곡κ°μΌλ‘,Minor GC
κ° μμ£Ό λ°μνμ¬ μ§§μ μλͺ μ£ΌκΈ°μ κ°μ²΄λ₯Ό λΉ λ₯΄κ² μ κ±°νκ² λλ€.
Eden, Survivor μμ(S0, S1)
μΌλ‘ ꡬμ±λλ€.
2. Old Generation
Young μμμ μ§λ μ΄μλ¨μ μ€λλ κ°μ²΄λ€μ΄ μ μ₯λλ κ³³μ΄λ€.
YGμ λΉν΄μ μλμ μΌλ‘ GCκ° μ κ² λ°μνλ©°,Major GC λλ Full GC
μ λμμ΄ λλ€.
3. Metaspace(Permanent Generation)
ν΄λμ€ λ©νμ λ³΄κ° μ μ₯λλ 곡κ°μΌλ‘, JVMμ΄ μλ OSκ° μ§μ κ΄λ¦¬νλλ€μ΄ν°λΈ λ©λͺ¨λ¦¬ 곡κ°
μ μ¬μ©νλ€.
1. PermGenμ λ¨μ 보μ λͺ©μ
Java 8 μ΄μ μλPermGen
μ΄λΌλ κ³ μ λ ν¬κΈ°μ λ©λͺ¨λ¦¬ μμμ μ¬μ©νλλ°, ν¬κΈ°κ° κ³ μ μ΄λΌOOM
μ΄ μμ£Ό λ°μνμλ€.
2. μ μ°ν λ©λͺ¨λ¦¬ μ¬μ©
Java 8λΆν° λμ λMetaspace
λ JVM λ΄λΆ λ©λͺ¨λ¦¬ λμ , OSκ° κ΄λ¦¬νλλ€μ΄ν°λΈ λ©λͺ¨λ¦¬ μμ
μ μ¬μ©νκ² λμλ€.
λ°λΌμ νμν λ§νΌ λμ μΌλ‘ μ¦κ°ν μ μμ΄, PermGenλ³΄λ€ ν¨μ¬ μμ μ μΈ λ©λͺ¨λ¦¬ κ΄λ¦¬λ₯Ό μ 곡νλ€.
μ°Έκ³ ν λΈλ‘κ·Έ 1
μ°Έκ³ ν λΈλ‘κ·Έ 2
μ°Έκ³ ν λΈλ‘κ·Έ 3