2 λΆ„ μ†Œμš”

JVM (Java Virtual Machine)μ΄λž€ πŸ™„ ??

JVM (Java Virtual Machine)은 μ§μ—­ν•˜λ©΄ μžλ°”λ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•œ 가상 기계(컴퓨터)인데, μ‰½κ²Œ 말해 OS에 쒅속받지 μ•Šκ³  μžλ°” ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ν™˜κ²½μ„ λ§Œλ“€μ–΄ μ£ΌλŠ” μ†Œν”„νŠΈμ›¨μ–΄ 이닀. JVM은 μžλ°” μ‹€ν–‰ ν™˜κ²½ JRE (Java Runtime Environment)에 ν¬ν•¨λ˜μ–΄ μžˆλ‹€.


JavaλŠ” μ–΄λ– ν•œ ν”Œλž«νΌμ— 영ν–₯을 λ°›μ§€ μ•ŠλŠ”λ‹€

JVM을 μ‚¬μš©ν•˜λ©΄ ν•˜λ‚˜μ˜ λ°”μ΄νŠΈ μ½”λ“œ(.class)둜 λͺ¨λ“  ν”Œλž«νΌμ—μ„œ λ™μž‘ν•˜λ„λ‘ ν•  수 μžˆλ‹€.


image

예λ₯Ό λ“€μ–΄ Cμ–Έμ–΄λ‘œ μž‘μ„±λœ Test.cκ°€ μžˆλ‹€λ©΄ 이 Test.cλ₯Ό μœˆλ„μš° 컴파일러λ₯Ό μ‚¬μš©ν•΄μ„œ μ»΄νŒŒμΌν•˜λ©΄ Test.exeκ°€ λ§Œλ“€μ–΄μ§€κ³ , μœˆλ„μš° 컴파일러둜 μ»΄νŒŒμΌλ˜μ—ˆκΈ°μ— Test.exeλŠ” μœˆλ„μš°μ—μ„œλ§Œ μ‹€ν–‰λ˜λŠ” μ‹€ν–‰ νŒŒμΌμ΄λ‹€. 즉 λ¦¬λˆ…μŠ€ μš΄μ˜μ²΄μ œμ—μ„œλŠ” μ‹€ν–‰ν•  수 μ—†μŠ΅λ‹ˆλ‹€. 즉 C / C++ μ—μ„œλŠ” 컴파일 ν”Œλž«νΌκ³Ό νƒ€κ²Ÿ ν”Œλž«νΌμ΄ λ‹€λ₯Ό κ²½μš°μ—λŠ” ν”„λ‘œκ·Έλž¨μ΄ λ™μž‘ν•˜μ§€ μ•ŠλŠ”λ‹€. λ§Œμ•½μ΄ Test.ext νŒŒμΌμ„ λ¦¬λˆ…μŠ€ μš΄μ˜μ²΄μ œμ—μ„œ μ‹€ν–‰ν•˜λ €λ©΄ λ¦¬λˆ…μŠ€ ν™˜κ²½μ„ νƒ€κ²ŸμœΌλ‘œ 크둜슀 μ»΄νŒŒμΌμ„ ν•΄μ„œ λ¦¬λˆ…μŠ€ μš΄μ˜μ²΄μ œμ— λ§žλŠ” μ‹€ν–‰ νŒŒμΌμ„ μƒˆλ‘œ λ§Œλ“€μ–΄μ•Ό ν•œλ‹€.

image

Java의 κ²½μš°μ—λŠ” Java μ–Έμ–΄λ‘œ μž‘μ„±λœ Test.javaλŠ” μ»΄νŒŒμΌν•˜λ©΄ Test.class 파일이 μƒμ„±λœλ‹€. 그리고 μ΄λ ‡κ²Œ μƒμ„±λœ λ°”μ΄νŠΈ μ½”λ“œλŠ” 각자의 ν”Œλž«νΌμ— μ„€μΉ˜λ˜μ–΄ μžˆλŠ” μžλ°” 가상 λ¨Έμ‹ (JVM)이 μš΄μ˜μ²΄μ œμ— λ§žλŠ” μ‹€ν–‰ 파일둜 λ°”κΏ”μ€€λ‹€. 즉 Javaμ—μ„œλŠ” Cμ–Έμ–΄μ™€λŠ” 달리 JVM을 μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— 각자의 ν”Œλž«νΌμ— λ§žκ²Œλ” μ»΄νŒŒμΌμ„ λ”°λ‘œλ”°λ‘œ ν•΄μ€˜μ•Ό ν•  ν•„μš”κ°€ μ—†λ‹€. ν•˜λ‚˜μ˜ λ°”μ΄νŠΈ μ½”λ“œλ‘œ JVM이 μ„€μΉ˜λ˜μ–΄ μžˆλŠ” λͺ¨λ“  ν”Œλž«νΌμ—μ„œ λ™μž‘μ΄ κ°€λŠ₯ν•˜λ‹€.

λ°”μ΄νŠΈμ½”λ“œ??

image

JVM이 이해할 수 μžˆλŠ” μ–Έμ–΄λ‘œ λ³€ν™˜λœ μžλ°” μ†ŒμŠ€μ½”λ“œ Java μ†ŒμŠ€μ½”λ“œ, 즉 μ›μ‹œμ½”λ“œ(*.java)λŠ” CPUκ°€ 인식을 ν•˜μ§€ λͺ»ν•˜λ―€λ‘œ κΈ°κ³„μ–΄λ‘œ μ»΄νŒŒμΌμ„ ν•΄μ€˜μ•Όν•œλ‹€. ν•˜μ§€λ§Œ JavaλŠ” 이 JVM μ΄λΌλŠ” 가상머신을 κ±°μ³μ„œ OS에 λ„λ‹¬ν•˜κΈ° λ•Œλ¬Έμ— OSκ°€ 인식할 수 μžˆλŠ” κΈ°κ³„μ–΄λ‘œ λ°”λ‘œ 컴파일 λ˜λŠ”κ²Œ μ•„λ‹ˆλΌ JVM이 인식할 수 μžˆλŠ” Java bytecode(*.class)둜 λ³€ν™˜λœλ‹€. 즉, CPUκ°€ μ΄ν•΄ν•˜λŠ” μ–Έμ–΄λŠ” λ°”μ΄λ„ˆλ¦¬ μ½”λ“œ, 가상 머신이 μ΄ν•΄ν•˜λŠ” μ½”λ“œλŠ” λ°”μ΄νŠΈ μ½”λ“œ

JVM ꡬ성 ✨

image

1️⃣ Class Loader(클래슀 λ‘œλ”)

JVM λ‚΄λ‘œ 클래슀파일(.class)λ₯Ό λ‘œλ“œν•˜κ³ , 링크λ₯Ό 톡해 λ°°μΉ˜ν•˜λŠ” μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” λͺ¨λ“ˆμ΄λ‹€. Runtime μ‹œμ μ— 클래슀λ₯Ό λ‘œλ”©ν•˜κ²Œ ν•΄ μ£Όλ©° 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λ©΄ 클래슀 λ‘œλ”λ₯Ό 톡해 λ©”λͺ¨λ¦¬μ— λ‘œλ“œν•˜κ²Œ λœλ‹€.

2️⃣ Execution Engine(μ‹€ν–‰ μ—”μ§„)

λ‘œλ“œλœ 클래슀의 λ°”μ΄νŠΈμ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” λŸ°νƒ€μž„ λͺ¨λ“ˆμ΄ λ°”λ‘œ μ‹€ν–‰ 엔진이닀. 클래슀 λ‘œλ”λ₯Ό 톡해 JVMλ‚΄μ˜ Runtime Data Areas에 배치된 λ°”μ΄νŠΈμ½”λ“œλŠ” μ‹€ν–‰ 엔진에 μ˜ν•΄ μ‹€ν–‰λ˜λ©°, μ‹€ν–‰ 엔진은 μžλ°” λ°”μ΄νŠΈ μ½”λ“œλ₯Ό λͺ…λ Ήμ–΄ λ‹¨μœ„λ‘œ μ½μ–΄μ„œ μ‹€ν–‰ν•œλ‹€. μ—¬κΈ°μ„œ Interpreter(인터프리터) 방식과 JIT compiler 방식을 μ‚¬μš©ν•˜κ²Œ λœλ‹€.

3️⃣ Interpreter(인터프리터)

μΈν„°ν”„λ¦¬ν„°λŠ” ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ˜ μ†ŒμŠ€ μ½”λ“œλ₯Ό λ°”λ‘œ μ‹€ν–‰ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ λ§ν•œλ‹€. μ›μ‹œ μ½”λ“œλ₯Ό κΈ°κ³„μ–΄λ‘œ λ²ˆμ—­ν•˜λŠ” μ»΄νŒŒμΌλŸ¬μ™€ λŒ€λΉ„λœλ‹€. μžλ°”λŠ” 인터프리터 방식을 μ‚¬μš©ν•˜μ—¬ μžλ°” λ°”μ΄νŠΈ μ½”λ“œλ₯Ό λͺ…λ Ήμ–΄ λ‹¨μœ„λ‘œ μ½μ–΄μ„œ μ‹€ν–‰ν•œλ‹€. ν•˜μ§€λ§Œ ν•œ 쀄씩 μˆ˜ν–‰ν•˜κΈ° λ•Œλ¬Έμ— μˆ˜ν–‰ 속도가 λŠλ¦¬λ‹€λŠ” 단점이 μžˆλ‹€.

4️⃣ JIT Compiler(Just In Time Compiler)

인터프리터 λ°©μ‹μ˜ 단점을 λ³΄μ™„ν•˜κΈ° μœ„ν•΄ JIT μ»΄νŒŒμΌλŸ¬κ°€ λ„μž…λ˜μ—ˆλ‹€. JIT μ»΄νŒŒμΌλŸ¬λŠ” λ°”μ΄νŠΈμ½”λ“œλ₯Ό μ»΄νŒŒμΌν•˜μ—¬ native code(λ„€μ΄ν‹°λΈŒ μ½”λ“œ)둜 λ³€ν™˜ν•˜μ—¬ μ‚¬μš©ν•œλ‹€. 즉 ν•œ 번 컴파일된 μ½”λ“œλŠ” λΉ λ₯΄κ²Œ μˆ˜ν–‰ν•˜κ²Œ λ˜μ–΄ μˆ˜ν–‰ 속도가 λΉ λ₯΄κ²Œ λœλ‹€. ν•˜μ§€λ§Œ μ»΄νŒŒμΌν•˜λŠ” 과정에 λΉ„μš©μ΄ λ“€κ²Œ λœλ‹€. λ”°λΌμ„œ ν•œ 번만 μˆ˜ν–‰ν•  μ½”λ“œλΌλ©΄ μ»΄νŒŒμΌν•˜μ§€ μ•Šκ³  μΈν„°ν”„λ¦¬νŒ… ν•˜λŠ” 것이 μœ λ¦¬ν•˜λ‹€. λ”°λΌμ„œ JVM은 인터프리터 방식을 μ‚¬μš©ν•˜λ‹€κ°€ μΌμ •ν•œ 기쀀이 λ„˜μ–΄κ°€λ©΄ JIT 컴파일러λ₯Ό μ‚¬μš©ν•˜λŠ” ν˜Όν•© 방식을 μ‚¬μš©ν•œλ‹€.

5️⃣ Garbage Collector(κ°€λΉ„μ§€ μ½œλ ‰ν„°)

κ°€λΉ„μ§€ μ»¬λ ‰ν„°λŠ” μœ νš¨ν•˜μ§€ μ•Šμ€ λ©”λͺ¨λ¦¬μΈ κ°€λΉ„μ§€(Garbage)λ₯Ό μ •λ¦¬ν•΄μ£ΌλŠ” 역할을 ν•œλ‹€. 즉 Garbage Collection(GC)λ₯Ό λ‹΄λ‹Ήν•œλ‹€.

6️⃣ Runtime Data Area

image

Runtime Data AreaλŠ” JVM이 ν”„λ‘œκ·Έλž¨μ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ OSλ‘œλΆ€ν„° λ³„λ„λ‘œ 할당받은 λ©”λͺ¨λ¦¬ 곡간을 λ§ν•œλ‹€.

1.PC Register

각 μ“°λ ˆλ“œκ°€ μ–΄λ–€ λͺ…령을 μ‹€ν–‰ν•  μ§€ κΈ°λ‘ν•˜λŠ” λΆ€λΆ„

2.JVM Stack

λ©”μ„œλ“œ(method)κ°€ 호좜될 λ•Œ λ©”μ„œλ“œμ™€ λ©”μ„œλ“œμ˜ μ •λ³΄λŠ” JVM Stack에 μŒ“μ΄κ²Œ λœλ‹€. 즉 λ©”μ„œλ“œμ˜ λ§€κ°œλ³€μˆ˜, μ§€μ—­ λ³€μˆ˜, return μ£Όμ†Œ, μž„μ‹œ λ³€μˆ˜ λ“±μ˜ 정보λ₯Ό κΈ°λ‘ν•˜λŠ” μŠ€νƒ, 각 μŠ€λ ˆλ“œ λ³„λ‘œ μƒμ„±λ˜κΈ° λ•Œλ¬Έμ— λ‹€λ₯Έ μŠ€λ ˆλ“œλŠ” μ ‘κ·Όν•  수 μ—†λ‹€. λ©”μ„œλ“œ 호좜이 μ’…λ£Œλ˜λ©΄ μŠ€νƒμ—μ„œ 정보듀이 μ œκ±°λœλ‹€.

3.Native Method Stack

μžλ°” μ™Έμ˜ μ–Έμ–΄λ‘œ μž‘μ„±λœ λ„€μ΄ν‹°λΈŒ μ½”λ“œλ“€μ„ μœ„ν•œ μŠ€νƒμ΄λ‹€. Java Native Interfaceλ₯Ό 톡해 ν˜ΈμΆœλ˜λŠ” C/C++ λ“±μ˜ μ½”λ“œλ₯Ό μˆ˜ν–‰ν•œλ‹€.

4.Method Area

λͺ¨λ“  μ“°λ ˆλ“œκ°€ κ³΅μœ ν•˜λŠ” λ©”λͺ¨λ¦¬ μ˜μ—­μœΌλ‘œ 클래슀, μΈν„°νŽ˜μ΄μŠ€, λ©”μ„œλ“œ, ν•„λ“œ ,Static λ³€μˆ˜ λ“±μ˜ λ°”μ΄νŠΈ μ½”λ“œλ₯Ό λ³΄κ΄€ν•œλ‹€. Method Areaμ—λŠ” Runtime Constant Poolμ΄λΌλŠ” λ³„λ„μ˜ 관리 μ˜μ—­λ„ μ‘΄μž¬ν•œλ‹€. μ΄λŠ” μƒμˆ˜ μžλ£Œν˜•μ„ μ €μž₯ν•˜κ³  μ°Έμ‘°ν•˜μ—¬ 쀑볡을 λ§‰λŠ” 역할을 μˆ˜ν–‰ν•œλ‹€.

5.Heap

Runtime μ‹œμ μ— λ™μ μœΌλ‘œ ν• λ‹Ήν•˜μ—¬ μ‚¬μš©ν•˜λŠ” μ˜μ—­μ΄λ‹€. 클래슀λ₯Ό μ΄μš©ν•΄ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λ©΄ Heap에 μ €μž₯λœλ‹€.

νƒœκ·Έ:

μΉ΄ν…Œκ³ λ¦¬:

μ—…λ°μ΄νŠΈ:

λŒ“κΈ€λ‚¨κΈ°κΈ°