
Java Virtual Machine μ μ€μλ§
π‘ JVMμ μλ° κ°μ λ¨Έμ μΌλ‘ OSμ JAVA μ ν리μΌμ΄μ
μ€κ°μ μν μ νμ¬ νλμ λ°μ΄νΈ μ½λ(.class)λ‘ λͺ¨λ νλ«νΌμμ λμνλλ‘ ν μ μλ€.
Cμ Javaλ₯Ό λΉκ΅ν΄λ³΄μ.
C μΈμ΄μ κ²½μ° Test.c μ½λλ₯Ό κ° OSμ μ€νμν€κΈ° μν΄μλ μ»΄νμΌμ κ° OS λ§κ² λ°λ‘ ν΄μ£Όμ΄μΌ νλ€.
μ€μ λ‘ μ»΄νμΌ & μ€νμ νκΈ° μν΄μλ μ΄λ»κ² ν΄μΌνλμ§ μμ보μ. ( β» μ»΄νμΌκ³Ό μ€νμ ν΄λΉ javaνμΌμ΄ μλ μμΉμμ μ§νν΄μΌ νλ€. )
$javac Test.java$java Testπ‘ Java bytecodeλ JVMμ΄ μ΄ν΄ν μ μλ μΈμ΄λ‘ λ³νλ Java Source codeλ₯Ό λ§νλ€. μλ° μ»΄νμΌλ¬μ μν΄ λ³νλλ μ½λμ λͺ λ Ήμ΄ ν¬κΈ°κ° 1 byteλΌμ λ°μ΄νΈμ½λλΌκ³ λΆλ¦¬κ³ μλ€.
π‘ JVMμ ν¬κ² 3κ°μ§ (ν΄λμ€ λ‘λ, λ©λͺ¨λ¦¬, μ€ν μμ§)λ‘ κ΅¬μ±λλ€.
JVM λ΄λ‘ Test.class νμΌμ λ‘λνμ¬ λ§ν¬λ₯Ό ν΅ν΄ λ°°μΉνλ μμ μ μννλ€.
μλ°λ λμ λ‘λ©μ μ§μνκΈ° λλ¬Έμ νλ²μ λ©λͺ¨λ¦¬μ λͺ¨λ ν΄λμ€λ₯Ό λ‘λνμ§ μκ³ , νμν μκ°μ νμν ν΄λμ€λ₯Ό μ°Ύμ λ©λͺ¨λ¦¬μ λ‘λ©ν΄μ£Όκ² λλλ° μ΄ μν μ Class Loaderκ° νκ² λλ€.
- ν
μΈμ€ν΄μ€ν λ λͺ¨λ ν΄λμ€μ μΈμ€ν΄μ€μ λ°°μ΄, κ°μ²΄λ₯Ό μ μ₯νλ€.
λͺ¨λ JVM μ€λ λμ 곡μ λλ 곡μ μμμΌλ‘ Garbage Collectorλ§ νμ λ©λͺ¨λ¦¬μ λν νμ κΆνμ΄ μλ€.
Garbage Collector : ν λ©λͺ¨λ¦¬ μμμ μμ±λ κ°μ²΄λ€ μ€μμ μ°Έμ‘°λμ§ μμ κ°μ²΄λ€μ νμν ν μ κ±°νλ μν μ νλ€. λ©λͺ¨λ¦¬ κ΄λ¦¬λ₯Ό μλμΌλ‘ ν΄μ£Όκ³ μΈμ μΌμ μννλμ§λ μ μ μλ€.
- λ©μλ
λͺ¨λ μ€λ λκ° κ³΅μ νλ μμμΌλ‘ ν΄λμ€, μΈν°νμ΄μ€, λ©μλ, νλ, Static λ³μ λ±μ λ°μ΄νΈ μ½λλ₯Ό 보κ΄νλ€.
- PC λ μ§μ€ν°
μ€λ λκ° μμλ λ μμ±λλ 곡κ°μΌλ‘ μ€λ λλ§λ€ νλμ© μ‘΄μ¬νλ€. μ°μ°μ μν΄ νμν νΌμ°μ°μλ₯Ό μμλ‘ μ μ₯νκΈ°μν μ©λλ‘ μ¬μ©νλ€.
- μ€ν (JVM Stack)
λ©μλλ₯Ό νΈμΆν λ κ°κ°μ μ€ν νλ μμ΄ μμ±λκ³ λ©μλ μμμ μ¬μ©λλ κ°, λ§€κ°λ³μ, μ§μλ³μ, λ¦¬ν΄ κ°, μ°μ°μ μΌμ΄λλ κ°λ€μ΄ μμλ‘ μ μ₯λλ€. λ©μλ μνμ΄ λλλ©΄ νλ μλ³λ‘ μμ λκ² λλ€.
- λ€μ΄ν°λΈ λ©μλ μ€ν (Native Method stack)
JVMμ μ€νμ΄ μλ C μ€νμ κ°λ₯΄ν€λ©° μλ°κ° μλ λ€λ₯Έ μΈμ΄λ‘ μμ±λ λ€μ΄ν°λΈ λ©μλλ₯Ό μ§μνκΈ° μν΄ μ¬μ©λλ μ€νμ΄λ€.
- μλ° μΈν°νλ¦¬ν° (interpreter)
μ»΄νμΌλ¬μ μν΄ λ³νλ λ°μ΄νΈ μ½λ(Test.class)λ₯Ό νμ€μ© κΈ°κ³μ΄λ‘ ν΄μνλ μν μ νλ€.
μλλ JVMμμ μΈν°νλ¦¬ν° λ°©μλ§ μ¬μ©νμ§λ§ μ±λ₯ μ΄μλ‘ μΈν΄ JIT μ»΄νμΌλ¬λ₯Ό μΆκ°νμλ€. μμ€μ½λλ₯Ό λΉλν λλ μ무κ²λ νμ§ μλ€κ° λ°νμμμ νμ€μ© μ½μΌλ©° λ³ννλ€.
- JIT μ»΄νμΌλ¬
μ΄λ λ€μμΌλ‘ λμ΄κ° μμΈν μ΄ν΄λ³΄κ² λ€.
Just In Time
π‘ JIT μ»΄νμΌλ¬λ μ€ν μμ μμ μΈν°νλ¦¬ν° λ°©μμΌλ‘ κΈ°κ³μ΄ μ½λλ₯Ό μμ±ν λ μ»΄νμΌ μκ³μΉλ₯Ό λμ΄κ° λ©μλκ° μκΈ°λ©΄ μ΄λ₯Ό κΈ°κ³μ΄λ‘ μΊμ±νμ¬ λκ³ μΆν λ€μ νΈμΆλμμλ μ΄λ₯Ό μ°Έμ‘°νλ€.
μ»΄νμΌ μκ³μΉ (Compile Threshold)
μκ³μΉλ λ©μλκ° νΈμΆλ νμμ λ©μλμ 루νλ₯Ό λΉ μ Έ λμ€κΈ°κΉμ§ λ νμλ₯Ό κΈ°λ°μΌλ‘ νλ€. μΌλ§λ μμ£Ό μ½λκ° μ€νλμλκ° μ΄λ€.
μΌμ νμλ§νΌ μ€νλλ©΄ μ»΄νμΌ μκ³μΉμ λλ¬νκ² λκ³ λλ¬ν μ½λλ₯Ό λμμΌλ‘ JIT μ»΄νμΌλ¬λ₯Ό ν΅ν΄ μΊμ±μ μννκ² λλ€.
μ»΄νμΌλ¬λ§ μ¬μ©νλ CμΈμ΄μ μΈν°ν리ν°λ§ μ¬μ©νλ Pythonμ λΉν΄ μκ·Έλλ λλ¦°λ° JVMμμκΉμ§ λ°μ΄νΈμ½λλ₯Ό μΈν°ν리ν°λ‘ νμ€μ© λ³ννλ JIT μ»΄νμΌλ¬λ₯Ό λμ νμ¬ JVMμ μλλ₯Ό κ°μ ν κ²μ΄λ€.
JDKλ λ§κ·Έλλ‘ Java κ°λ°μ μν΄ νμν λꡬλ€μ΄λ€. JDKμ κ°λ°λκ΅¬λ€ μ€ νλκ° JREμ΄κ³ , μ΄ JREκ° JVMμ κ°μ§κ³ μλ νμμ΄λ€.
JREλ μλ° νλ‘κ·Έλ¨μ μ€νμν¬ μ μλ μλ° νκ²½μ λ§νλ€. μλ° νλ‘κ·Έλ¨μ μ€νμν€κΈ° μν΄ λ°λμ μμ΄μΌ νλ κ²μ΄λ€.
π‘ μμ μ¬μ§μ 보면 JDK μ€ JAVACκ° μκ³ JRE μ€ JAVAκ° μλ€. μ΄ κΈμ 2λ²μμ Test.javaλ₯Ό μ»΄νμΌνμμλ μ¬μ©νλ $javacμ μ΄λ₯Ό μ€νν λ μ¬μ©νλ $javaκ° λ°λ‘ μ΄κ²μ΄λ€. JDKμ κ°λ°λꡬλ€λ‘ Test.javaλ₯Ό μμ±νκ³ μ΄λ₯Ό javacλ₯Ό μ¬μ©ν΄ λ°μ΄νΈμ½λλ‘ λ³ννλ€. μ΄ λ°μ΄νΈμ½λλ₯Ό JREμ javaμ JVMμ μ¬μ©ν΄ μ½κ³ κ²μ¦ν ν νλ‘κ·Έλ¨μ μ€νμν€λ κ²μ΄λ€.
Q1. JVMμ JAVAμΈμ΄μμλ§ μ¬μ©νλ€?
π
ββοΈ JVMμ μ¬μ©νλ λνμ μΈ μΈμ΄λ μ€μΉΌλΌ, JRUBY, μ½νλ¦°, JAVAκ° μλ€. ( JAVAμ μ½νλ¦°μ νΌμ©ν΄μ μ¬μ©ν μ μλ μ΄μ κ° μ΄ λλ¬ΈμΈ κ² κ°λ€. )
Q2. μΈν°ν리ν°λ JIT μ»΄νμΌλ¬λ₯Ό μ ꡬλΆν΄μ μ¨?
μμ€ μ½λ νμ€μ λ³νν΄ λ°λ‘ μ€ννλ μΈν°ν리ν°κ° μ€νμμ μκ°μ μ»΄νμΌλ¬λ³΄λ€ λΉ λ₯΄λ€. νμ§λ§ μ 체 μ€ν μλλ μ»΄νμΌλ¬κ° ν¨μ¬ λΉ λ₯΄λ€. κ·Έλμ μμ£Όμ°μ§μλ μ½λλ line-by-line μ€νμ΄ λΉ λ₯΄κ³ μμ£Όμ°λ λ©μλλ μ 체λ₯Ό μ€νν΄ λλ JIT μ»΄νμΌλ¬λ₯Ό μ¬μ©ν΄ μ μ₯ν΄λλ κ²μ΄λ€.
Q3. κΈ°κ³μ΄ vs λ°μ΄νΈ μ½λ vs λ°μ΄λ리 μ½λ
λ³Έ μ€ν°λλ 2020 λ°±κΈ°μ λμ μλ°μ€ν°λμ 컀리νλΌμ μ°Έκ³ νμ¬ μ§ννκ³ μμ΅λλ€.