Java Virtual Machine
μλ° κ°μ λ¨Έμ (JVM)μ μλ° μ ν리μΌμ΄μ μ μ€ννκΈ° μν λ°νμ μμ§μ΄λ€.
JVM(Windows/Mac/Linux)
OS(Windows/Mac/Linux)
Computer(Hardware)
μλ° μ½λλ μ΄ JVM μμμ λμνλ©°, μ 체 μ€ν νκ²½μ 'νλμ¨μ΄ - μ΄μ체μ (OS) - JVM - μλ° μ ν리μΌμ΄μ ' μμμ κ³μΈ΅ ꡬ쑰λ₯Ό κ°μ§λ€.
JVMμ μ£Όμ νΉμ§
JVMμ μ‘΄μ¬λ μλ° μΈμ΄μ λ€μκ³Ό κ°μ νΉμ§μ κ²°μ νλ€.
νλ«νΌ λ 립μ±
μλ° μμ€ μ½λλ νΉμ OSλ₯Ό λμμΌλ‘ μ»΄νμΌλμ§ μκ³ , JVMμ λͺ©μ μ§λ‘ νλ 'μλ° λ°μ΄νΈ μ½λ(*.class)'λ‘ λ³ν
μ΄ λ°μ΄νΈ μ½λλ ν΄λΉ OSμ λ§λ JVMμ΄ μ€μΉλμ΄ μκΈ°λ§ νλ©΄, μ΄λ€ νλ«νΌ(Windows, Mac, Linux λ±)μμλ μμ μμ΄ λμΌνκ² μ€ν κ°λ₯
JVM μ€ν νμ
νλ«νΌ λ 립μ±μ μ»λ λμ , μλ° μ½λλ₯Ό μ€ννκΈ° μν΄μλ λ°λμ λμ νλ«νΌμ JVM μ€μΉ νμ
μ±λ₯ μ΅μ ν
κ³Όκ±°μλ OS μμμ κ°μ λ¨Έμ μ ν λ¨κ³ λ κ±°μΉκΈ° λλ¬Έμ λ€μ΄ν°λΈ μ½λ(C/C++) λλΉ μ€ν μλκ° λ리λ€λ λ¨μ μ‘΄μ¬
νμ¬λ JIT(Just-In-Time) μ»΄νμΌλ¬μ κ°μ μ΅μ ν κΈ°μ μ λ°μ μΌλ‘, λ°νμ μ€μ μμ£Ό μ¬μ©λλ μ½λλ₯Ό λ€μ΄ν°λΈ κΈ°κ³μ΄λ‘ λ³ννμ¬ μ€ν μλ ν₯μ
Java μ€ν κ³Όμ

Java Compiler: Java Source Codeλ₯Ό Java Byte Codeλ‘ λ³ν
Class Loader: λ°μ΄νΈ μ½λ λ‘λ© / κ²μ¦ / λ§νΉ λ± μν
Runtime Data Area: μ± μ€νμ μν΄ μ¬μ©λλ JVM λ©λͺ¨λ¦¬ μμ
Execution Engine: λ©λͺ¨λ¦¬ μμμ μλ λ°μ΄ν°λ₯Ό κ°μ Έμ ν΄λΉνλ μμ μν
μμ±λ Java Sourceλ₯Ό Java Compilerλ₯Ό ν΅ν΄ Java Byte Codeλ‘ λ³ν
μ»΄νμΌ λ Byte Codeλ₯Ό JVMμ Class Loaderμ μ λ¬
Class Loaderλ Dynamic Loadingμ ν΅ν΄ νμν ν΄λμ€λ€μ λ‘λ© λ° λ§ν¬νμ¬ Runtime Data Area(JVM Memory)λ‘ μ λ¬
Execution Engineμ΄ μ¬λΌμ¨ Byte Codeλ€μ λͺ λ Ήμ΄ λ¨μλ‘ νλμ© κ°μ Έμμ μ€ν
Class Loader
ν΄λμ€ λ‘λλ μ»΄νμΌλ μλ° ν΄λμ€ νμΌ(*.class)μ λ©λͺ¨λ¦¬λ‘ λ‘λνκ³ , Runtime Data Areaμ λ°°μΉνλ μν μ νλ€.
λ‘λ© λ¨κ³
λ‘λ©(Loading): ν΄λμ€ νμΌμ μ°Ύμ λ°μ΄νΈ μ½λλ₯Ό λ©λͺ¨λ¦¬μ λ‘λ
ν λ²μ λͺ¨λ ν΄λμ€λ₯Ό λ‘λνλ κ²μ΄ μλλΌ, νμν λ λμ μΌλ‘ λ‘λ
static λ©€λ²λ€ λν μ λΆ λ©λͺ¨λ¦¬μ μ¬λΌκ°λ κ²μ΄ μλλΌ, ν΄λμ€ λ΄μ static λ©€λ²λ₯Ό νΈμΆνκ² λλ©΄ ν΄λμ€κ° λμ μΌλ‘ λ©λͺ¨λ¦¬μ λ‘λ
λ§ν¬(Linking): μ½μ΄μ¨ μ½λλ₯Ό μ€ν κ°λ₯νλλ‘ μ€λΉ
κ²μ¦(Verify): λ°μ΄νΈ μ½λκ° μλ° μΈμ΄ λͺ μΈ λ° JVM λͺ μΈλ₯Ό μ€μνλμ§ νμΈ(보μ)
μ€λΉ(Prepare): ν΄λμ€μ μ μ (static) λ³μλ€μ μν λ©λͺ¨λ¦¬λ₯Ό ν λΉνκ³ κΈ°λ³Έκ°(0, false, null λ±)μΌλ‘ μ΄κΈ°ν
λΆμ(Resolve): μ½λ λ΄μ κΈ°νΈ μ°Έμ‘°(Symbolic Reference)λ₯Ό μ€μ λ©λͺ¨λ¦¬ μ£Όμ(Direct Reference)λ‘ λ³κ²½
μ΄κΈ°ν(Initialization): 'μ€λΉ' λ¨κ³μμ κΈ°λ³Έκ°μΌλ‘ μ΄κΈ°ννλ μ μ λ³μλ€μ μ€μ μ½λμ λͺ μλ κ°(static λΈλ‘ ν¬ν¨)μΌλ‘ μ΄κΈ°ν
ν΄λμ€ λ‘λ μμ λͺ¨λΈ(Delegation Model): ν΄λμ€ λ‘λλ κ³μΈ΅ ꡬ쑰λ₯Ό κ°μ§λ©°, ν΄λμ€ λ‘λ μμ² μ νμ λ‘λκ° μμ λ‘λμκ² μ± μμ μμνλ λ°©μμΌλ‘ λμ
λΆνΈμ€νΈλ©(Bootstrap) λ‘λ: μ΅μμ λ‘λ. JVM ν΅μ¬ λΌμ΄λΈλ¬λ¦¬(JAVA_HOME/libμ rt.jar λ±)λ₯Ό λ‘λ
νμ₯(Extension) λ‘λ:
lib/extν΄λμ ν΄λμ€ λ‘λμ ν리μΌμ΄μ (Application/System) λ‘λ: μ¬μ©μκ° μ§μ ν ν΄λμ€ν¨μ€(Classpath)μ ν΄λμ€ λ‘λ
μ΄ κ΅¬μ‘°λ μ΄λ―Έ λ‘λλ ν΄λμ€μ μ€λ³΅ λ‘λλ₯Ό λ°©μ§νκ³ , ν΅μ¬ λΌμ΄λΈλ¬λ¦¬μ 보μμ μ μ§νλ μν
Execution Engine
ν΄λμ€ λ‘λκ° λ©λͺ¨λ¦¬μ μ μ¬ν λ°μ΄νΈ μ½λλ₯Ό μ€μ κΈ°κ³μ΄λ‘ λ³ννκ³ μ€ννλ μν μ νλ€.
μΈν°νλ¦¬ν° (Interpreter)
λ°μ΄νΈ μ½λλ₯Ό ν μ€μ© μ½μ΄μ ν΄μνκ³ (interpret) λ°λ‘ μ€ν
μ΄κΈ° μ€ν μλλ λΉ λ₯΄μ§λ§, λμΌν μ½λκ° λ°λ³΅ νΈμΆλ λλ λ§€λ² ν΄μν΄μΌ νλ―λ‘ λΉν¨μ¨μ μΌ μ μμ
JIT μ»΄νμΌλ¬ (Just-In-Time Compiler)
μΈν°ν리ν°μ λ¨μ μ 보μνκΈ° μν΄ λμ
μ ν리μΌμ΄μ μ€ν μ€μ(Just-In-Time) λ°λ³΅μ μΌλ‘ μ€νλλ 'ν«μ€ν(hotspot)' μ½λ κ°μ§
'ν«μ€ν' μ½λλ₯Ό λ€μ΄ν°λΈ κΈ°κ³μ΄λ‘ μ»΄νμΌνμ¬ μΊμμ μ μ₯
μ΄ν ν΄λΉ μ½λκ° νΈμΆλλ©΄, μΈν°νλ¦¬νΈ λ°©μμ΄ μλ μΊμλ λ€μ΄ν°λΈ μ½λλ₯Ό μ§μ μ€ννμ¬ μ±λ₯ ν₯μ
κ°λΉμ§ 컬λ ν° (Garbage Collector, GC)
μ€ν μμ§μ μΌλΆλ‘ λμνλ©°, ν(Heap) λ©λͺ¨λ¦¬ μμμμ λ μ΄μ μ°Έμ‘°λμ§ μλ κ°μ²΄(κ°λΉμ§)λ₯Ό μ°Ύμ μ κ±°νκ³ λ©λͺ¨λ¦¬ νμ
JDK & JRE & JVM

JVM(Java Virtual Machine): μλ° λ°μ΄νΈ μ½λλ₯Ό μ€νμν€κΈ° μν κ°μ λ¨Έμ
JRE(Java Runtime Environment): μλ° μ ν리μΌμ΄μ μ μ€ννκΈ° μν λꡬ(νμν λΌμ΄λΈλ¬λ¦¬ λ° νμ νμΌ)κ° ν¬ν¨λ μ€ν νκ²½(JRE = JVM + Standard Libraries)
JDK(Java Development Kit): μλ°λ‘ κ°λ°νκΈ° μν νμ μμ(javac λ±)λ₯Ό ν¬ν¨ν κ°λ° ν€νΈ(JDK = JRE + Development Tools)
μμ κ°μ κ΅¬μ‘°λ‘ μΈν΄ μλ° μ ν리μΌμ΄μ μ λ°°ν¬νμ¬ μ€νλ§ ν μλ²μλ JREλ§ μ€μΉνκ³ , κ°λ°μμ λ‘컬 μ₯λΉμλ JDKλ₯Ό μ€μΉνλ€.
JVM λ©λͺ¨λ¦¬ ꡬ쑰
JVMμ OSλ‘λΆν° μ€νμ νμν λ©λͺ¨λ¦¬λ₯Ό ν λΉλ°μΌλ©°, μ΄ μμμ Runtime Data AreaλΌκ³ λΆλ₯Έλ€.
Method
ν΄λμ€ μ 보, ν΄λμ€(static) λ³μ, μμ, λ©μλ μ½λ
JVM μμ ~ μ’ λ£
O
Heap
κ°μ²΄ μΈμ€ν΄μ€, μΈμ€ν΄μ€ λ³μ
Gabage Collectionμ μν΄ κ΄λ¦¬
O
Stack
μ€λ λ λ³λ‘ λ°νμμ νΈμΆ λ λ©μλ, μ§μ λ³μ, λ§€κ° λ³μ, λ¦¬ν΄ κ°
λ©μλ μ’ λ£ μ
X
μ€λ λ 곡μ μμ (λͺ¨λ μ€λ λκ° κ³΅μ )
ν (Heap Area)
newν€μλλ‘ μμ±λ κ°μ²΄ μΈμ€ν΄μ€μ λ°°μ΄μ΄ μ μ₯λλ 곡κ°κ°λΉμ§ 컬λ μ (GC)μ μ£Όλ λμ
μ±λ₯ μ΅μ νλ₯Ό μν΄ λ΄λΆμ μΌλ‘ Young Generation(Eden, Survivor 0/1)κ³Ό Old Generation μμμΌλ‘ λλμ΄ κ΄λ¦¬
μ΄ μμμ λ©λͺ¨λ¦¬κ° λΆμ‘±νλ©΄
OutOfMemoryErrorκ° λ°μ
λ©μλ μμ (Method Area)
ν΄λμ€μ λ©νλ°μ΄ν°(ꡬ쑰, νλ, λ©μλ μ 보), μ μ (static) λ³μ, μμ ν(Runtime Constant Pool), λ©μλ μ½λ λ± μ μ₯
μλ° 8 μ΄μ μλ μ΄ μμμ νμ μΌλΆλ‘ μ·¨κΈ
μλ° 8λΆν°λ νμ΄ μλ λ€μ΄ν°λΈ λ©λͺ¨λ¦¬ μμ(OSκ° μ§μ κ΄λ¦¬)μ μ¬μ©νλλ‘ λ³κ²½(
OutOfMemoryErrorλ¬Έμ κ° ν¬κ² κ°μ )
μ€λ λ λ
립 μμ (μ€λ λλ³ κ°λ³ μμ±)
κ° μ€λ λλ μμ±λ λλ§λ€ μ΄ μμλ€μ κ°λ³μ μΌλ‘ ν λΉλ°λλ€.
μ€ν (Stack Area)
λ©μλ νΈμΆ μ 보λ₯Ό μ μ₯νλ μμ
λ©μλκ° νΈμΆλ λλ§λ€ ν΄λΉ λ©μλμ μ 보(μ§μ λ³μ, λ§€κ° λ³μ, λ¦¬ν΄ μ£Όμ λ±)λ₯Ό λ΄μ μ€ν νλ μ(Stack Frame)μ΄ μμ±λμ΄ μ€νμ μμ΄κ³ , λ©μλ μ€νμ΄ μλ£λλ©΄ μ κ±°
μ€ν μμμ νκ³λ₯Ό μ΄κ³Όνλ©΄
StackOverflowErrorκ° λ°μ
PC λ μ§μ€ν° (PC Register)
νμ¬ μ€λ λκ° μ€ν μ€μΈ JVM λͺ λ Ήμ΄μ μ£Όμ μ μ₯
μ€λ λκ° μ»¨ν μ€νΈ μ€μμΉμ ν λ, λ€μμ μ€νν λͺ λ Ήμ΄λ₯Ό κΈ°μ΅νκΈ° μν΄ μ¬μ©
λ€μ΄ν°λΈ λ©μλ μ€ν (Native Method Stack)
μλ° μ½λ(λ°μ΄νΈ μ½λ)κ° μλ C/C++ λ± λ€μ΄ν°λΈ μ½λλ‘ μμ±λ JNI(Java Native Interface) λ©μλλ₯Ό νΈμΆν λ μ¬μ©λλ μ€ν μμ
Last updated
Was this helpful?