λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

DEV/Java

chapter02. JVM

πŸ“’ κ°œμš”

λ³Έ ν¬μŠ€νŒ…μ€ μ‹ μš©κΆŒ, μž„κ²½κ· λ‹˜μ˜ 이것이 μžλ°”λ‹€ μ„œμ κ³Ό λ°±κΈ°μ„ λ‹˜μ˜ μžλ°” 기초 μŠ€ν„°λ””λ₯Ό follow-up ν•œλ‹€.

 

πŸ“Œ λͺ©μ°¨

  1. WORA
  2. JVM
  3. JVM의 ꡬ쑰

1. WORA(Write Once Run Anywhere)

λŒ€ν•™κ΅ μ •κ·œ μˆ˜μ—…μ„ 톡해 Cμ–Έμ–΄λ₯Ό μˆ˜κ°•ν•œ κ²½ν—˜μ΄ μžˆλ‹€λ©΄, OS(λ¦¬λˆ…μŠ€, μœˆλ„μš°)에 따라 μ†ŒμŠ€ μ½”λ“œλ₯Ό λ”°λ‘œ μž‘μ„±ν•˜λŠ” μˆ˜κ³ μŠ€λŸ¬μ›€μ„ ν•œ λ²ˆμ―€μ€ κ²½ν—˜ν•΄λ³΄μ•˜μ„ 것이닀. μ΄λŸ¬ν•œ 단점을 λ³΄μ™„ν•˜κ³ μž λ“±μž₯ν•œ μžλ°”λŠ” Write Once Run Anywhere 즉, 'ν•œ 번 μž‘μ„±ν•˜λ©΄ μ–΄λ””μ„œλ“  μ‹€ν–‰λœλ‹€'λΌλŠ” μŠ¬λ‘œκ±΄μ„ λ‚΄μ„Έμš°λŠ”λ°, μ΄λŸ¬ν•œ 역할이 κ°€λŠ₯ν•œ μ΄μœ λŠ” λ°”λ‘œ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό OS 사이에 μ‘΄μž¬ν•˜λŠ” JVM에 μžˆλ‹€.

 

2. JVM

JVMμ΄λž€ Java Virtual Machine의 μ€„μž„λ§λ‘œ, μžλ°” μ½”λ“œ(.java)λ₯Ό μ»΄νŒŒμΌν•˜μ—¬ λ°”μ΄νŠΈ μ½”λ“œ(.class)둜 λ³€ν™˜ν•˜κ³  이λ₯Ό OS에 λ§žλŠ” κΈ°κ³„μ–΄λ‘œ λ³€ν™˜ν•˜μ—¬ μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰μ‹œμΌœμ£ΌλŠ” 역할을 ν•œλ‹€. μ΄λŸ¬ν•œ 역할을 ν•˜λŠ” JVM 덕뢄에 μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ μ–΄λ–€ ν”Œλž«νΌμ—λ„ μ’…μ†λ˜μ§€ μ•Šκ³  μ‹€ν–‰λ˜λŠ” μž₯점을 가진닀. ν¬μŠ€νŒ…μ„ μž‘μ„±ν•˜λ‹€ κ½€λ‚˜ ν₯미둜운 글을 λ°œκ²¬ν–ˆλŠ”λ°, ν•œ 번쯀 읽어보면 쒋을 것 κ°™λ‹€.

 

"JVMμ΄λž€ 무엇인가" μžλ°” 가상 λ¨Έμ‹  μ΄ν•΄ν•˜κΈ°

μžλ°” 가상 λ¨Έμ‹ (Java Virtual Machine, JVM)은 μ‹œμŠ€ν…œ λ©”λͺ¨λ¦¬λ₯Ό κ΄€λ¦¬ν•˜λ©΄μ„œ μžλ°” 기반 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μœ„ν•΄ 이식 κ°€λŠ₯ν•œ μ‹€ν–‰ ν™˜

www.itworld.co.kr

 

3. JVM의 ꡬ쑰

 

3-1. 클래슀 λ‘œλ” (Class Loader)

컴파일 된 클래슀 파일(.class)을 읽어 λŸ°νƒ€μž„ μ‹œ JVM에 λ‘œλ“œν•˜λ©°, λ‘œλ“œ, 링크, μ΄ˆκΈ°ν™” 3단계λ₯Ό κ±°μΉœλ‹€.

  • λ‘œλ“œ(Loading) : 클래슀 νŒŒμΌμ„ ν•„μš”ν•œ μ‹œμ μ— λ™μ μœΌλ‘œ JVM λ©”λͺ¨λ¦¬μ— λ‘œλ“œν•œλ‹€.
  • 링크(Linking) : 클래슀 νŒŒμΌμ„ μ‚¬μš©ν•˜κΈ° μœ„ν•΄ κ²€μ¦ν•œλ‹€.
  • μ΄ˆκΈ°ν™”(Initialization) : 클래슀 λ³€μˆ˜λ“€μ„ μ μ ˆν•œ κ°’μœΌλ‘œ μ΄ˆκΈ°ν™”ν•œλ‹€.

3-2. μ‹€ν–‰ 엔진 (Execution Engine)

클래슀 λ‘œλ”(Class Loader)에 μ˜ν•΄ JVM의 λŸ°νƒ€μž„ 데이터 μ˜μ—­(Runtime Data Area)에 λ‘œλ“œλœ λ°”μ΄νŠΈμ½”λ“œ(.class)λ₯Ό λͺ…λ Ήμ–΄ λ‹¨μœ„λ‘œ 읽어 μ‹€ν–‰ν•œλ‹€. 이 κ³Όμ •μ—μ„œ μ‹€ν–‰ 엔진은 인터프리터와 JIT 컴파일러 두 가지 방식을 ν˜Όν•©ν•˜μ—¬ μ‚¬μš©ν•œλ‹€.

  • 인터프리터(Interpreter) : λ°”μ΄νŠΈ μ½”λ“œ λͺ…λ Ήμ–΄λ₯Ό ν•œ 쀄씩 읽어 ν•΄μ„ν•˜κ³  μ‹€ν–‰ν•œλ‹€. 컴파일 단계λ₯Ό κ±°μΉ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 컴파일 μ‹œκ°„μ„ 단좕할 수 μžˆλ‹€λŠ” μž₯점이 μžˆμœΌλ‚˜, 같은 λ©”μ†Œλ“œλ₯Ό μ—¬λŸ¬ 번 ν˜ΈμΆœν•  경우, 맀번 ν•΄μ„ν•˜κ³  μ‹€ν–‰ν•˜λ―€λ‘œ 속도가 λŠλ¦¬λ‹€.
  • JIT 컴파일러(Just-In-Time Compiler) : μΈν„°ν”„λ¦¬ν„°μ˜ 단점을 λ³΄μ™„ν•˜κΈ° μœ„ν•΄ λ„μž…λœ λ°©μ‹μœΌλ‘œ, λ°”μ΄νŠΈμ½”λ“œλ₯Ό μ»΄νŒŒμΌν•˜μ—¬ λ„€μ΄ν‹°λΈŒ μ½”λ“œ(Native Code)둜 λ³€ν™˜ν•˜κ³ , 이λ₯Ό 캐싱해 λ‘μ—ˆλ‹€κ°€ 이후 λ„€μ΄ν‹°λΈŒ μ½”λ“œλ₯Ό 직접 μ‹€ν–‰ν•˜λŠ” 방식이닀.
  • 가비지 컬렉터(Garbage Collector) : 더 이상 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” λ©”λͺ¨λ¦¬λ₯Ό μžλ™μœΌλ‘œ νšŒμˆ˜ν•΄ μ£ΌλŠ” 역할을 ν•œλ‹€.

3-3. λŸ°νƒ€μž„ 데이터 μ˜μ—­(Runtime Data Area)

 

JVM이 μžλ°” ν”„λ‘œκ·Έλž¨μ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ OSλ‘œλΆ€ν„° λ³„λ„λ‘œ 할당받은 λ©”λͺ¨λ¦¬ 곡간을 λ§ν•œλ‹€. 크게 5가지 μ˜μ—­μœΌλ‘œ λ‚˜λ‰œλ‹€.

  • λ©”μ„œλ“œ μ˜μ—­(Method Area) : JVM이 μ‹œμž‘λ  λ•Œ μƒμ„±λ˜λŠ” κ³΅κ°„μœΌλ‘œ λ°”μ΄νŠΈ μ½”λ“œ(.class)λ₯Ό 처음 λ©”λͺ¨λ¦¬μ— 올릴 λ•Œ μ΄ˆκΈ°ν™”λ˜λŠ” λŒ€μƒμ„ μ €μž₯ν•˜κΈ° μœ„ν•œ λ©”λͺ¨λ¦¬ 곡간이닀. 클래슀, μΈν„°νŽ˜μ΄μŠ€, λ©”μ„œλ“œ, ν•„λ“œ, static λ³€μˆ˜ λ“±μ˜ λ°”μ΄νŠΈ μ½”λ“œλ₯Ό λ³΄κ΄€ν•˜λ©°, λͺ¨λ“  μ“°λ ˆλ“œκ°€ κ³΅μœ ν•˜λŠ” μ˜μ—­μ΄κΈ°λ„ ν•˜λ‹€.
  • νž™ μ˜μ—­(Heap Area) : λ©”μ„œλ“œ μ˜μ—­κ³Ό ν•¨κ»˜ λͺ¨λ“  μ“°λ ˆλ“œκ°€ κ³΅μœ ν•˜λ©°, new ν‚€μ›Œλ“œλ‘œ μƒμ„±λœ 객체와 배열이 μ €μž₯λ˜λŠ” 곡간이닀. 주기적으둜 가비지 컬렉터가 μ œκ±°ν•œλ‹€.
  • PC λ ˆμ§€μŠ€ν„°(PC Register) : μ“°λ ˆλ“œκ°€ 생성될 λ•Œλ§ˆλ‹€ μƒμ„±λ˜λŠ” μ˜μ—­μœΌλ‘œ, ν˜„μž¬ μ‹€ν–‰λ˜λŠ” μ“°λ ˆλ“œμ˜ μ£Όμ†Œμ™€ λͺ…령을 μ €μž₯ν•œλ‹€.
  • μŠ€νƒ μ˜μ—­(Stack Area) : 지역 λ³€μˆ˜, νŒŒλΌλ―Έν„°, 리턴 κ°’ λ“± μž„μ‹œμ μœΌλ‘œ μ‚¬μš©λ˜λŠ” λ³€μˆ˜λ‚˜ 정보듀이 μ €μž₯λ˜λŠ” μ˜μ—­μ΄λ‹€.
  • λ„€μ΄ν‹°λΈŒ λ©”μ„œλ“œ μŠ€νƒ μ˜μ—­(Native Method Stack) : λ°”μ΄νŠΈ μ½”λ“œκ°€ μ•„λ‹Œ κΈ°κ³„μ–΄λ‘œ μž‘μ„±λœ ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰μ‹œν‚€λŠ” μ˜μ—­μ΄λ‹€. λ˜ν•œ μžλ°” μ΄μ™Έμ˜ μ–Έμ–΄(C, C++ λ“±)둜 μž‘μ„±λœ λ„€μ΄ν‹°λΈŒ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•œ 곡간이기도 ν•˜λ‹€. μ‹€ν–‰ μ—”μ§„μ˜ JIT μ»΄νŒŒμΌλŸ¬μ— μ˜ν•΄ λ³€ν™˜λœ λ„€μ΄ν‹°λΈŒ μ½”λ“œκ°€ 이 μ˜μ—­μ—μ„œ μ‹€ν–‰λœλ‹€κ³  보면 λœλ‹€.

 

μ°Έκ³ 

  • https://code-lab1.tistory.com/92
  • https://coding-factory.tistory.com/828

 

 

 

 

'DEV > Java' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€