πŸ“‚ JAVA/μ£Όμš” κ°œλ…

μžλ°”μ˜ 컴파일 κ³Όμ •

Amenable 2023. 6. 19. 18:59

  μžλ°”λŠ” JVM(Java Virtual Machine) 덕뢄에 OS에 독립적인 νŠΉμ§•μ„ κ°€μ§€κ³  μžˆλ‹€. JVM의 μ–΄λ– ν•œ κΈ°λŠ₯ λ•Œλ¬Έμ— OS에 λ…λ¦½μ μœΌλ‘œ μ‹€ν–‰μ‹œν‚¬ μˆ˜ μžˆλŠ”μ§€ μžλ°”μ˜ 컴파일 κ³Όμ •을 ν†΅ν•΄ μ•Œμ•„λ³΄μž.

 

 

πŸ“™ 1. 컴파일 κ³Όμ •

  μžλ°”μ˜ 컴파일 과정은 λ‹€μŒκ³Ό κ°™λ‹€.

  1. κ°œλ°œμžκ°€ μž‘μ„±ν•œ μžλ°” μ†ŒμŠ€νŒŒμΌ(*. java)을 μžλ°” 컴파일러(Java Compiler)κ°€ λ°”μ΄νŠΈνŒŒμΌ(*.class)둜 μ»΄νŒŒμΌν•œλ‹€. (CPUκ°€ μ΄ν•΄ν•  μˆ˜ μžˆλŠ” μ–Έμ–΄μΈ λ°”μ΄λ„ˆλ¦¬ μ½”λ“œκ°€ μ•„λ‹ˆλΌ JVM이 μ΄ν•΄ν•  μˆ˜ μžˆλŠ” λ°”μ΄νŠΈ μ½”λ“œλ₯Ό κ°€μ§„ λ°”μ΄νŠΈ νŒŒμΌλ‘œ λ³€ν™˜ν•œλ‹€.)
  2. 클래슀 λ‘œλ”(Class Loader)λ₯Ό ν†΅ν•΄ λ°”μ΄νŠΈ νŒŒμΌ(*.class)듀을 JVM에 μ˜¬λ¦°λ‹€.
  3. JVM에 μžˆλŠ” λ°”μ΄νŠΈ νŒŒμΌ(*.class)듀은 μ‹€ν–‰ μ—”μ§„(Execution Engine)의 μΈν„°ν”„리터(Interpreter)와 JIT μ»΄νŒŒμΌλŸ¬(JIT Compiler)λ₯Ό ν†΅ν•΄μ„œ ν•΄μ„λœλ‹€.
  4. ν•΄μ„λœ λ°”μ΄νŠΈ νŒŒμΌμ€ Runtime Data Areas에 λ°°μΉ˜λ˜μ–΄ μ‹€μ§ˆμ μΈ μˆ˜ν–‰μ΄ μ΄λ£¨μ–΄μ§„λ‹€.

  컴파일 κ³Όμ •μ—μ„œ λ‚˜μ˜¨ 'μ‹€ν–‰ μ—”μ§„ (Execution Engine), λŸ°νƒ€μž„ λ°μ΄ν„° μ˜μ—­ (Runtime Data Area), κ°€λΉ„μ§€ μ»¬λ ‰ν„° (Garbage Collector)'에 λŒ€ν•΄μ„œ μžμ„Ένžˆ μ•Œμ•„λ³΄μž.

 

 

πŸ“™ 2. μ‹€ν–‰ μ—”μ§„ (Execution Engine)

  μ‹€ν–‰ 엔진은 JVM λ©”λͺ¨λ¦¬μ— 올라온 λ°”μ΄νŠΈ μ½”λ“œλ“€μ„ λͺ…λ Ήμ–΄ λ‹¨μœ„λ‘œ ν•˜λ‚˜μ”© κ°€μ Έμ™€μ„œ μ‹€ν–‰ν•œλ‹€. μ΄λ•Œ, μ‹€ν–‰ μ—”진은 μΈν„°ν”„리터(Interpreter)와 JIT μ»΄νŒŒμΌλŸ¬(JIT Compiler)에 μ˜ν•΄ λ™μž‘λœλ‹€.

 

  λ¨Όμ €, 인터프리터와 μ»΄νŒŒμΌλŸ¬μ— λŒ€ν•œ λŒ€λž΅μ μΈ 차이λ₯Ό λ¨Όμ € μ•Œμ•„λ³΄μž.

  μΈν„°ν”„λ¦¬ν„°λŠ” 컴파일러처럼 κ³ λ ˆλ²¨μ–Έμ–΄λ₯Ό μ €λ ˆλ²¨μ–Έμ–΄(기계어)둜 해석해 μ£ΌλŠ” λ²ˆμ—­ ν”„λ‘œκ·Έλž¨μ΄λ‹€. μ»΄νŒŒμΌλŸ¬λŠ” 전체 μ†ŒμŠ€μ½”λ“œλ₯Ό 보고 λͺ…λ Ήμ–΄λ₯Ό μˆ˜μ§‘ν•˜κ³  μž¬κ΅¬μ„±ν•˜λŠ” 반면 μΈν„°ν”„λ¦¬ν„°λŠ” μ†ŒμŠ€μ½”λ“œμ˜ 각 행을 μ—°μ†μ μœΌλ‘œ λΆ„μ„ν•˜λ©° μ‹€ν–‰ν•©λ‹ˆλ‹€. 

  κ·Έλž˜μ„œ 일반적으둜 각 ν–‰λ§ˆλ‹€ μ‹€ν–‰ν•˜λŠ” μΈν„°ν”„λ¦¬ν„°λ³΄λ‹€λŠ” μ»΄νŒŒμΌλŸ¬κ°€ 더 λΉ λ¦…λ‹ˆλ‹€.

 

JVMμ—μ„œμ˜ μΈν„°ν”„리터(Interpreter)와 JIT μ»΄νŒŒμΌλŸ¬(JIT Compiler)에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μž.

πŸ“Œ 1. 인터프리터(Interpreter)

  • μΈν„°ν”„λ¦¬ν„°λŠ” λ°”μ΄νŠΈ μ½”λ“œ λͺ…λ Ήμ–΄λ₯Ό ν•˜λ‚˜μ”© μ½μ–΄μ„œ ν•΄μ„ν•˜κ³  μ‹€ν–‰ν•œλ‹€.
  • ν•˜λ‚˜ν•˜λ‚˜μ˜ μ‹€ν–‰μ€ λΉ λ₯΄λ‚˜, μ „체적인 μ‹€ν–‰ μ†λ„κ°€ λŠλ¦¬λ‹€λŠ” λ‹¨μ μ΄ μžˆλ‹€.

πŸ“Œ 2. JIT 컴파일러(JIT Compiler)

  • JIT μ»΄νŒŒμΌλŸ¬λŠ” μΈν„°ν”„λ¦¬ν„°μ˜ 단점을 λ³΄μ™„ν•˜κΈ° μœ„ν•΄ λ„μž…λœ λ°©μ‹μœΌλ‘œ, λ°”μ΄νŠΈ μ½”λ“œ 전체λ₯Ό μ»΄νŒŒμΌν•˜μ—¬ λ°”μ΄λ„ˆλ¦¬ μ½”λ“œλ‘œ λ³€κ²½ν•œλ‹€.
  • μ΄ν›„μ—λŠ” ν•΄λ‹Ή λ©”μ„œλ“œλ₯Ό 더 이상 μΈν„°ν”„λ¦¬νŒ… ν•˜μ§€ μ•Šκ³ , λ°”μ΄λ„ˆλ¦¬ μ½”λ“œλ‘œ 직접 μ‹€ν–‰ν•˜λŠ” 방식이닀.
  • ν•˜λ‚˜μ”© μΈν„°ν”„λ¦¬νŒ…ν•˜μ—¬ μ‹€ν–‰ν•˜λŠ” κ²ƒμ΄ μ•„λ‹ˆλΌ λ°”μ΄νŠΈ μ½”λ“œ μ „체가 μ»΄νŒŒμΌλœ λ°”μ΄λ„ˆλ¦¬ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” κ²ƒμ΄κΈ° λ•Œλ¬Έμ— μ „체적인(μ—¬κΈ° λ³Όλ“œ) μ‹€ν–‰μ†λ„λŠ” μΈν„°ν”„리터λ₯Ό μ΄μš©ν•˜λŠ” λ°©μ‹λ³΄λ‹€ λΉ λ₯΄λ‹€.

 

  인터프리터λ₯Ό μ΄μš©ν•˜μ—¬ 맀번 μ½”λ“œλ₯Ό ν•œ 쀄씩 읽어 λ³€ν™˜ν•˜κ²Œ 되면 μ•„λ¬΄λž˜λ„ 미리 컴파일된 μ½”λ“œλ₯Ό μˆ˜ν–‰ν•˜λŠ” 것보닀 느릴 μˆ˜λ°–μ— μ—†λ‹€. κ·Έλ ‡λ‹€κ³ , λ°”μ΄νŠΈ μ½”λ“œ 전체λ₯Ό ν”„λ‘œκ·Έλž¨ μˆ˜ν–‰ μ΄ˆκΈ°μ— λͺ¨λ‘ μ»΄νŒŒμΌν•˜κ²Œ 되면 초기 속도가 λ„ˆλ¬΄ 느리게 λœλ‹€.

  μ΄λŸ¬ν•œ 점듀을 κ³ λ €ν•˜μ—¬, λͺ¨λ“  μ½”λ“œλŠ” μ΄ˆκΈ°μ— 인터프리터에 μ˜ν•΄ μ‹œμž‘λ˜κ³ , ν•΄λ‹Ή μ½”λ“œλ₯Ό μΆ©λΆ„νžˆ 많이 μ‚¬μš©ν•  경우 JIT μ»΄νŒŒμΌλŸ¬μ—μ„œ μ»΄νŒŒμΌμ„ μˆ˜ν–‰ν•˜κ²Œ λœλ‹€.

 

 

πŸ“™ 3. λŸ°νƒ€μž„ λ°μ΄ν„° μ˜μ—­ (Runtime Data Area)

  λŸ°νƒ€μž„ 데이터 μ˜μ—­μ€ JVM의 λ©”λͺ¨λ¦¬ μ˜μ—­μœΌλ‘œ μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•  λ•Œ μ‚¬μš©λ˜λŠ” 데이터듀을 μ μž¬ν•˜λŠ” μ˜μ—­μ„ λ§ν•œλ‹€.

  λŸ°νƒ€μž„ 데이터 μ˜μ—­μ€ ν¬κ²ŒλŠ” 5개, μž‘κ²ŒλŠ” 6개의 μ˜μ—­μœΌλ‘œ λ‚˜λˆŒ 수 μžˆλ‹€.

  λ©”μ„œλ“œ μ˜μ—­(Method Area)κ³Ό νž™ μ˜μ—­(Heap Area)은 λͺ¨λ“  μŠ€λ ˆλ“œκ°€ κ³΅μœ ν•΄μ„œ μ‚¬μš©ν•œλ‹€.

  μŠ€νƒ μ˜μ—­(Stack Area), PC λ ˆμ§€μŠ€ν„°(PC Register), λ„€μ΄ν‹°λΈŒ λ©”μ„œλ“œ μŠ€νƒ(Native Method Stack)은 μŠ€λ ˆλ“œλ§ˆλ‹€ ν•˜λ‚˜μ”© μƒμ„±λœλ‹€.

 

πŸ“Œ λ©”μ„œλ“œ μ˜μ—­(Method Area)

  • λͺ¨λ“  μŠ€λ ˆλ“œκ°€ κ³΅μœ ν•˜λŠ” μ˜μ—­μœΌλ‘œ JVM이 μ‹œμž‘λ  λ•Œ μƒμ„±λœλ‹€.
  • 클래슀 멀버 λ³€μˆ˜μ˜ 이름, 데이터 νƒ€μž…, μ ‘κ·Ό μ œμ–΄μž 정보와 같은 각쒅 ν•„λ“œ 정보듀과 λ©”μ„œλ“œ 정보, 데이터 νƒ€μž… 정보, Constant Pool, static λ³€μˆ˜, final class 등이 μƒμ„±λ˜λŠ” μ˜μ—­μ΄λ‹€.

πŸ“Œ νž™ μ˜μ—­(Heap Area)

  • μΈμŠ€ν„΄μŠ€ λ˜λŠ” 객체λ₯Ό μ €μž₯ν•˜λŠ” κ³΅κ°„μœΌλ‘œ GC의 λŒ€μƒμ΄ λœλ‹€.
  • JVM μ„±λŠ₯ λ“±μ˜ μ΄μŠˆμ—μ„œ κ°€μž₯ 많이 μ–ΈκΈ‰λ˜λŠ” 곡간이닀.

πŸ“Œ μŠ€νƒ μ˜μ—­(Stack Area)

  • μ§€μ—­λ³€μˆ˜, νŒŒλΌλ―Έν„°, λ¦¬ν„΄ κ°’, μ—°μ‚°μ— μ‚¬μš©λ˜λŠ” μž„μ‹œ κ°’ λ“±μ΄ μƒμ„±λ˜λŠ” μ˜μ—­μ΄λ‹€.

πŸ“Œ PC λ ˆμ§€μŠ€ν„°(PC Register)

  • μŠ€λ ˆλ“œκ°€ μƒμ„±λ  λ•Œλ§ˆλ‹€ μƒμ„±λ˜λŠ” μ˜μ—­μœΌλ‘œ ν”„λ‘œκ·Έλž¨ μΉ΄μš΄ν„°, μ¦‰ ν˜„μž¬ μŠ€λ ˆλ“œκ°€ μ‹€ν–‰λ˜λŠ” λΆ€λΆ„μ˜ μ£Όμ†Œμ™€ λͺ…령을 μ €μž₯ν•˜κ³  μžˆλŠ” μ˜μ—­μ΄λ‹€.

πŸ“Œ λ„€μ΄ν‹°λΈŒ λ©”μ„œλ“œ μŠ€νƒ(Native Method Stack)

  • JAVA μ™Έμ˜ μ–Έμ–΄λ‘œ μž‘μ„±λœ λ„€μ΄ν‹°λΈŒ μ½”λ“œλ₯Ό μœ„ν•œ μŠ€νƒμ΄λ‹€.
  • JNI(JAVA Native Interface)λ₯Ό 톡해 ν˜ΈμΆœν•˜λŠ” C/C++ λ“±μ˜ μ½”λ“œλ₯Ό μˆ˜ν–‰ν•˜κΈ° μœ„ν•œ μŠ€νƒμœΌλ‘œ, 언어에 맞게 μŠ€νƒμ΄ μƒμ„±λœλ‹€. (C의 경우 CμŠ€νƒ, C++의 경우 C++μŠ€νƒμ΄ μƒμ„±λœλ‹€.)

πŸ“Œ λŸ°νƒ€μž„ μƒμˆ˜ ν’€(Runtime Constant Pool)

  • JVM λ™μž‘μ—μ„œ κ°€μž₯ 핡심적인 역할을 μˆ˜ν–‰ν•˜λŠ” 곳으둜 JVM λͺ…μ„Έμ—μ„œλ„ λ”°λ‘œ μ€‘μš”ν•˜κ²Œ κΈ°μˆ ν•œλ‹€.
  • 각 ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€μ˜ μƒμˆ˜λΏλ§Œ μ•„λ‹ˆλΌ, λ©”μ„œλ“œμ™€ ν•„λ“œμ— λŒ€ν•œ λͺ¨λ“  λ ˆνΌλŸ°μŠ€κΉŒμ§€ λ‹΄κ³  μžˆλŠ” ν…Œμ΄λΈ”λ‘œ μ–΄λ–€ λ©”μ„œλ“œλ‚˜ ν•„λ“œλ₯Ό μ°Έμ‘°ν•  λ•Œ JVM은 λŸ°νƒ€μž„ μƒμˆ˜ν’€μ„ 톡해 ν•΄λ‹Ή λ©”μ„œλ“œλ‚˜ ν•„λ“œμ˜ μ‹€μ œ λ©”λͺ¨λ¦¬μƒ μ£Όμ†Œλ₯Ό μ°Ύμ•„μ„œ μ°Έμ‘°ν•œλ‹€.

 

 

πŸ“™ 4. κ°€λΉ„μ§€ μ»¬λ ‰ν„° (Garbage Collector)

  μœ νš¨ν•˜μ§€ μ•Šμ€ λ©”λͺ¨λ¦¬(= μ£Όμ†Œλ₯Ό μžƒμ–΄λ²„λ €μ„œ μ‚¬μš©ν•  수 μ—†λŠ” λ©”λͺ¨λ¦¬)λ₯Ό Garbage라고 ν•˜λŠ”λ°, Garbage CollectorλŠ” λ©”λͺ¨λ¦¬κ°€ λΆ€μ‘±ν•  λ•Œ 이런 Garbage λ©”λͺ¨λ¦¬λ₯Ό ν•΄μ œμ‹œμΌœ λ‹€λ₯Έ μš©λ„λ‘œ μ‚¬μš©ν•  수 있게 ν•΄μ£ΌλŠ” ν”„λ‘œκ·Έλž¨μ„ λ§ν•œλ‹€.

  Garbage Collectorλ₯Ό μˆ˜ν–‰ν•  땐 Garbage Collectorλ₯Ό μˆ˜ν–‰ν•˜λŠ” μŠ€λ ˆλ“œλ₯Ό μ œμ™Έν•œ λͺ¨λ“  μŠ€λ ˆλ“œλ“€μ΄ μž‘μ—…μ„ λ©ˆμΆ”κ²Œ λœλ‹€. 그리고 GC의 μž‘업이 μ™„λ£Œλ˜λ©΄ λ©ˆμ·„λ˜ μŠ€λ ˆλ“œλ“€μ΄ λ‹€μ‹œ μž‘업을 μ‹œμž‘ν•œλ‹€.

  Garbage Collector에 λŒ€ν•΄μ„œλŠ” 이후 κΈ€μ—μ„œ μžμ„Ένžˆ λ‹€λ£¨λŠ” κ²ƒμœΌλ‘œ ν•˜μž.

 

ν•΄λ‹Ή 글은
ν‚€λŸ¬λ‹ˆ λ‹˜μ˜ 'μ•ŒκΈ°μ‰½κ²Œ μ •λ¦¬ν•œ JAVA의 μ»΄νŒŒμΌκ³Όμ • 및 JVM λ©”λͺ¨λ¦¬ ꡬ쑰, JVM GC',
KoB λ‹˜μ˜ '[Java] μžλ°”μ˜ λ™μž‘κ³Όμ • Java Compiler와 JVM',
dalpang.e λ‹˜μ˜ '[JAVA] JVM λ™μž‘μ›λ¦¬ 및 κΈ°λ³Έκ°œλ…',
minseojo λ‹˜μ˜ '[Java] μžλ°” 컴파일 κ³Όμ • & JVM λ‚΄λΆ€ ꡬ쑰',
Gyoogle λ‹˜μ˜ '[Java] 컴파일 κ³Όμ •'
을 μ°Έκ³ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.