πŸ’Ž/Java

[Java] μžλ°” 가상 λ¨Έμ‹ (Java Virtual Machine)

dar0m! 2021. 7. 28. 15:26

JVM(Java Virtual Machine)

  • Java둜 κ°œλ°œν•œ ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜κΈ° μœ„ν•œ 가상머신. μžλ°” 가상 머신을 λœ»ν•˜λŠ” 말둜 λ°”μ΄νŠΈμ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” 주체이닀. 운영체제 μœ„μ—μ„œ λ™μž‘ν•˜λ―€λ‘œ ν”Œλž«νΌμ— λ…λ¦½μ μœΌλ‘œ Java ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•  수 μžˆλ‹€.
  • ν”„λ‘œκ·Έλž¨ λ©”λͺ¨λ¦¬λ₯Ό κ΄€λ¦¬ν•˜κ³  μ΅œμ ν™”ν•˜λŠ” 것

물리적인 μ‹€μ œμ˜ 기계가 μ•„λ‹ˆλΌ 좔상적인 μž₯μΉ˜μ΄λ‹€.

μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ 클래슀 λ‘œλ”(Class Loader)λ₯Ό 톡해 읽어 λ“€μ—¬μ„œ μžλ°” API와 ν•¨κ»˜ μ‹€ν–‰ν•˜λŠ” 것

μžλ°” μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•΄μ„œλŠ” μžλ°”μ—μ„œ javac λͺ…령을 톡해 λ°”μ΄νŠΈμ½”λ“œ(.class)λ₯Ό λ§Œλ“€κ³ , λ°”μ΄νŠΈμ½”λ“œλ₯Ό JVM이 인터프리터 λ°©μ‹μœΌλ‘œ κΈ°κ³„μ–΄λ‘œ λ²ˆμ—­ν•˜λ©° μ‹€ν–‰ν•œλ‹€.

 

JVM κ΅¬μ„±μš”μ†Œ

1. Class Loader

JVM은 λŸ°νƒ€μž„μ‹œμ— 처음으둜 클래슀λ₯Ό μ°Έμ‘°ν•  λ•Œ ν•΄λ‹Ή 클래슀λ₯Ό λ‘œλ“œν•˜κ³  λ©”λͺ¨λ¦¬ μ˜μ—­μ— λ°°μΉ˜μ‹œν‚΄. 이 동적 λ‘œλ“œλ₯Ό λ‹΄λ‹Ήν•˜λŠ” 뢀뢄이 λ°”λ‘œ 클래슀 λ‘œλ”

2. GC (Garbage Collector)

μžλ°” μ΄μ „μ—λŠ” ν”„λ‘œκ·Έλž˜λ¨Έκ°€ λͺ¨λ“  ν”„λ‘œκ·Έλž¨ λ©”λͺ¨λ¦¬λ₯Ό κ΄€λ¦¬ν–ˆμŒ ν•˜μ§€λ§Œ, μžλ°”μ—μ„œλŠ” JVM이 ν”„λ‘œκ·Έλž¨ λ©”λͺ¨λ¦¬λ₯Ό 관리함!

JVM은 κ°€λΉ„μ§€ μ»¬λ ‰μ…˜μ΄λΌλŠ” ν”„λ‘œμ„ΈμŠ€λ₯Ό 톡해 λ©”λͺ¨λ¦¬λ₯Ό 관리함. κ°€λΉ„μ§€ μ»¬λ ‰μ…˜μ€ μžλ°” ν”„λ‘œκ·Έλž¨μ—μ„œ μ‚¬μš©λ˜μ§€ μ•ŠλŠ” λ©”λͺ¨λ¦¬λ₯Ό μ§€μ†μ μœΌλ‘œ μ°Ύμ•„λ‚΄μ„œ μ œκ±°ν•˜λŠ” 역할을 함.

μ‹€ν–‰μˆœμ„œ : μ°Έμ‘°λ˜μ§€ μ•Šμ€ 객체듀을 탐색 ν›„ μ‚­μ œ → μ‚­μ œλœ 객체의 λ©”λͺ¨λ¦¬ λ°˜ν™˜ → νž™ λ©”λͺ¨λ¦¬ μž¬μ‚¬μš©

3. Execution Engine

클래슀 λ‘œλ”λ₯Ό 톡해 JVM λ‚΄μ˜ λŸ°νƒ€μž„ 데이터 μ˜μ—­μ— 배치된 λ°”μ΄νŠΈμ½”λ“œλŠ” μ‹€ν–‰ 엔진에 μ˜ν•΄ μ‹€ν–‰λœλ‹€. μ‹€ν–‰ 엔진은 μžλ°” λ°”μ΄νŠΈμ½”λ“œλ₯Ό λͺ…λ Ήμ–΄ λ‹¨μœ„λ‘œ μ½μ–΄μ„œ μ‹€ν–‰ν•œλ‹€.

  • 인터프리터
  • JIT(Just-In-Time) 컴파일러

JIT 컴파일러

μΈν„°ν”„λ¦¬ν„°μ˜ 단점을 λ³΄μ™„ν•˜κΈ° μœ„ν•΄ λ„μž…λœ 것이 JIT μ»΄νŒŒμΌλŸ¬μ΄λ‹€. 인터프리터 방식(μ‹€ν–‰μ‹œμ μ— λ°”μ΄νŠΈμ½”λ“œλ₯Ό κΈ°κ³„μ–΄λ‘œ λ²ˆμ—­ν•˜μ—¬ μ‹€ν–‰ν•˜λŠ” 것)으둜 μ‹€ν–‰ν•˜λ‹€κ°€ μ μ ˆν•œ μ‹œμ μ— λ°”μ΄νŠΈμ½”λ“œ 전체λ₯Ό μ»΄νŒŒμΌν•˜μ—¬ λ„€μ΄ν‹°λΈŒ μ½”λ“œλ‘œ λ³€κ²½ν•˜κ³ , μ΄ν›„μ—λŠ” ν•΄λ‹Ή λ©”μ„œλ“œλ₯Ό 더 이상 μΈν„°ν”„λ¦¬νŒ…ν•˜μ§€ μ•Šκ³  λ„€μ΄ν‹°λΈŒ μ½”λ“œλ‘œ 직접 μ‹€ν–‰ν•˜λŠ” 방식이닀. λ„€μ΄ν‹°λΈŒ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” 것이 ν•˜λ‚˜μ”© μΈν„°ν”„λ¦¬νŒ…ν•˜λŠ” 것보닀 λΉ λ₯΄κ³ , λ„€μ΄ν‹°λΈŒ μ½”λ“œλŠ” μΊμ‹œμ— λ³΄κ΄€ν•˜κΈ° λ•Œλ¬Έμ— ν•œ 번 컴파일된 μ½”λ“œλŠ” 계속 λΉ λ₯΄κ²Œ μˆ˜ν–‰λ˜κ²Œ λœλ‹€.

(= 인터프리터 방식은 싀행쀑에 λ°”μ΄νŠΈμ½”λ“œλ₯Ό ν•œ 쀄씩 μ½μœΌλ©΄μ„œ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ° λ•Œλ¬Έμ— λ™μΌν•œ λ©”μ†Œλ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” 경우 μ€‘λ³΅ν•΄μ„œ λ²ˆμ—­ν•˜λŠ” λΉ„νš¨μœ¨μ΄ μžˆλ‹€. μ΄λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ λ²ˆμ—­ν•œ λ‚΄μš©μ„ μΊμ‹±ν•΄ λ‘μ—ˆλ‹€κ°€ λ™μΌν•œ λ©”μ†Œλ“œλ₯Ό μ‹€ν–‰ν•  경우 μΊμ‹±λœ λ‚΄μš©μ„ μ‹€ν–‰ν•œλ‹€.)

 μΈν„°ν”„리터 방식(싀행쀑 ν•œ 쀄씩 읽으며 μ‹€ν–‰)κ³Ό μ •적 컴파일 방식(μ‹€ν–‰ν•˜κΈ° μ „ ν”„λ‘œκ·Έλž¨ μ½”λ“œλ₯Ό κΈ°κ³„μ–΄λ‘œ λ²ˆμ—­ - μΊμ‹±)이 ν˜Όν•©λœ ν˜•νƒœ

JIT μ»΄νŒŒμΌλŸ¬κ°€ μ»΄νŒŒμΌν•˜λŠ” 과정은 λ°”μ΄νŠΈμ½”λ“œλ₯Ό ν•˜λ‚˜μ”© μΈν„°ν”„λ¦¬νŒ…ν•˜λŠ” 것보닀 훨씬 였래 κ±Έλ¦¬λ―€λ‘œ, λ§Œμ•½ ν•œ 번만 μ‹€ν–‰λ˜λŠ” μ½”λ“œλΌλ©΄ μ»΄νŒŒμΌν•˜μ§€ μ•Šκ³  μΈν„°ν”„λ¦¬νŒ…ν•˜λŠ” 것이 훨씬 μœ λ¦¬ν•˜λ‹€. λ”°λΌμ„œ, JIT 컴파일러λ₯Ό μ‚¬μš©ν•˜λŠ” JVM듀은 λ‚΄λΆ€μ μœΌλ‘œ ν•΄λ‹Ή λ©”μ„œλ“œκ°€ μ–Όλ§ˆλ‚˜ 자주 μˆ˜ν–‰λ˜λŠ”μ§€ μ²΄ν¬ν•˜κ³ , 일정 정도λ₯Ό λ„˜μ„ λ•Œμ—λ§Œ μ»΄νŒŒμΌμ„ μˆ˜ν–‰ν•œλ‹€.

4. Runtime Data Area

JVM이 운영체제 μœ„μ—μ„œ μ‹€ν–‰λ˜λ©΄μ„œ ν• λ‹Ήλ°›λŠ” λ©”λͺ¨λ¦¬ μ˜μ—­μž„

총 5κ°€μ§€ μ˜μ—­μœΌλ‘œ λ‚˜λˆ„μ–΄μ§ : PC λ ˆμ§€μŠ€ν„°, JVM μŠ€νƒ, λ„€μ΄ν‹°λΈŒ λ©”μ„œλ“œ μŠ€νƒ, νž™, λ©”μ„œλ“œ μ˜μ—­

(이 쀑에 νž™κ³Ό λ©”μ„œλ“œ μ˜μ—­μ€ λͺ¨λ“  μŠ€λ ˆλ“œκ°€ κ³΅μœ ν•΄μ„œ μ‚¬μš©ν•¨)

  1. PC register(PC λ ˆμ§€μŠ€ν„°) : μŠ€λ ˆλ“œκ°€ μ–΄λ–€ λͺ…λ Ήμ–΄λ‘œ μ‹€ν–‰λ˜μ–΄μ•Ό ν• μ§€ κΈ°λ‘ν•˜λŠ” λΆ€λΆ„(JVM λͺ…λ Ήμ˜ μ£Όμ†Œλ₯Ό 가짐)
  2. Stack Area(μŠ€νƒ μ˜μ—­, JVM μŠ€νƒ) : μ§€μ—­λ³€μˆ˜, λ§€κ°œλ³€μˆ˜, λ©”μ„œλ“œ 정보, μž„μ‹œ 데이터 등을 μ €μž₯. μŠ€λ ˆλ“œ λ§ˆλ‹€ ν•˜λ‚˜μ”© μ‘΄μž¬ν•˜λ©° μŠ€λ ˆλ“œκ°€ μ‹œμž‘λ  λ•Œ μƒμ„±λœλ‹€.
  3. Native Method Stack(λ„€μ΄ν‹°λΈŒ λ©”μ„œλ“œ μŠ€νƒ) : μ‹€μ œ μ‹€ν–‰ν•  수 μžˆλŠ” κΈ°κ³„μ–΄λ‘œ μž‘μ„±λœ ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰μ‹œν‚€λŠ” μ˜μ—­
  4. Heap(νž™) : λŸ°νƒ€μž„μ— λ™μ μœΌλ‘œ ν• λ‹Ήλ˜λŠ” 데이터가 μ €μž₯λ˜λŠ” μ˜μ—­. κ°μ²΄λ‚˜ λ°°μ—΄ 생성이 여기에 해당함
    • (λ˜ν•œ νž™μ— ν• λ‹Ήλœ 데이터듀은 κ°€λΉ„μ§€μ»¬λ ‰ν„°μ˜ λŒ€μƒμ΄ 됨. JVM μ„±λŠ₯ μ΄μŠˆμ—μ„œ κ°€μž₯ 많이 μ–ΈκΈ‰λ˜λŠ” κ³΅κ°„μž„)
  5. Class Area(static μ˜μ—­, λ©”μ„œλ“œ μ˜μ—­, 데이터 μ˜μ—­) : λͺ¨λ“  μŠ€λ ˆλ“œκ°€ κ³΅μœ ν•˜λŠ” μ˜μ—­μœΌλ‘œ JVM이 μ‹œμž‘λ  λ•Œ μƒμ„±λœλ‹€. JVM이 읽은 각각의 ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€μ— λŒ€ν•œ λŸ°νƒ€μž„ μƒμˆ˜ ν’€, ν•„λ“œ 및 λ©”μ„œλ“œ μ½”λ“œ, 정적(static) λ³€μˆ˜, λ©”μ„œλ“œμ˜ λ°”μ΄νŠΈ μ½”λ“œ 등을 보관함

 

JVM λ©”λͺ¨λ¦¬ 관리

μ‹€ν–‰ κ³Όμ •

  1. ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜λ©΄ JVM은 OSλ‘œλΆ€ν„° ν•΄λ‹Ή ν”„λ‘œκ·Έλž¨μ΄ ν•„μš”λ‘œν•˜λŠ” λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήλ°›κ³ , ν• λ‹Ή 받은 λ©”λͺ¨λ¦¬λ₯Ό μš©λ„μ— 따라 μ—¬λŸ¬ μ˜μ—­μœΌλ‘œ λ‚˜λˆ„μ–΄ κ΄€λ¦¬ν•œλ‹€.
  2. μžλ°” 컴파일러(javac)κ°€ μžλ°” μ½”λ“œ(.java)λ₯Ό 읽어 μžλ°” λ°”μ΄νŠΈμ½”λ“œ(.class)둜 λ³€ν™˜μ‹œν‚¨λ‹€.
  3. 클래슀 λ‘œλ”λŠ” classνŒŒμΌλ“€μ„ JVM으둜 λ‘œλ”©ν•œλ‹€.
  4. λ‘œλ”©λœ classνŒŒμΌλ“€μ€ μ‹€ν–‰ μ—”μ§„(Execution engine)을 ν†΅ν•΄μ„œ ν•΄μ„λœλ‹€.
  5. ν•΄μ„λœ λ°”μ΄νŠΈμ½”λ“œλŠ” Runtime Data Areas(λ©”λͺ¨λ¦¬ μ˜μ—­)에 λ°°μΉ˜λ˜μ–΄ μ‹€μ§ˆμ μΈ μˆ˜ν–‰μ΄ 이루어진닀. μ΄λŸ¬ν•œ μ‹€ν–‰κ³Όμ • μ†μ—μ„œ JVM은 ν•„μš”μ— 따라 μŠ€λ ˆλ“œ λ™κΈ°ν™”λ‚˜ κ°€λΉ„μ§€ μ»¬λ ‰μ…˜(GC)같은 λ©”λͺ¨λ¦¬ 관리 μž‘μ—…μ„ μˆ˜ν–‰ν•œλ‹€.

컴파일 ν•œλ‹€ = .java νŒŒμΌμ„ .class(λ°”μ΄νŠΈμ½”λ“œ)둜 λ§Œλ“ λ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€.

 

μ°Έκ³