β˜•οΈ μžλ°”: Java

[Java] JVM 총정리 (Class Loader, Execution Engine, Runtime Data Area)

🐀 쀀콩이 2023. 6. 29. 19:14

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

 

JVM μ΄λž€ Java 가상 머신이라고 λΆˆλ¦¬λŠ” μ†Œν”„νŠΈμ›¨μ–΄λ‘œ Java μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ λ™μž‘ν•  수 μžˆλŠ” ν™˜κ²½μ„ μ œκ³΅ν•©λ‹ˆλ‹€. JVM 은 μ• ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό 운영체제 μ‚¬μ΄μ—μ„œ μ€‘μž¬μž 역할을 μˆ˜ν–‰ν•©λ‹ˆλ‹€. 덕뢄에 Java λŠ” μ–΄λŠ 운영체제 ν™˜κ²½μ—μ„œλ„ 싀행될 수 있고, ‘write once and run anywhere’ μ΄λΌλŠ” ν‘œν˜„μ΄ λΆ™κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

 

 

πŸ’« JVM ꡬ성 μš”μ†Œ

 

JVM ꡬ성

 

JVM ꡬ성 μš”μ†ŒλŠ” μœ„μ™€ 같이 크게 μ„Έ κ°€μ§€λ‘œ λΆ„λ₯˜λ©λ‹ˆλ‹€.

 

  • Class Loader
  • Execution Engine
  • Runtime Data Area

 

클래슀 λ‘œλ”(Class Loader)κ°€ 컴파일된 μžλ°” λ°”μ΄νŠΈμ½”λ“œλ₯Ό λŸ°νƒ€μž„ 데이터 μ˜μ—­(Runtime Data Area)에 λ‘œλ“œν•˜κ³ , μ‹€ν–‰ μ—”μ§„(Execution Engine)이 μžλ°” λ°”μ΄νŠΈμ½”λ“œλ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€.

 

 

⛓️ μ»΄νŒŒμΌ

 

JVM ꡬ성 μš”μ†Œμ— λŒ€ν•΄ μ‚΄νŽ΄λ³΄κΈ° 전에 λ¨Όμ € 컴파일 과정에 λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

 

⛓️ .class 파일

 

κ°œλ°œμžλŠ” .java ν™•μž₯자λ₯Ό κ°€μ§„ νŒŒμΌμ— μ†ŒμŠ€ μ½”λ“œλ₯Ό μž‘μ„±ν•©λ‹ˆλ‹€. μ†ŒμŠ€ μ½”λ“œλŠ” μ‚¬λžŒμ΄ μ•Œμ•„λ³΄κΈ° μ‰½κ²Œ μž‘μ„±λ˜μ–΄ μžˆμ§€λ§Œ, κΈ°κ³„λŠ” 이λ₯Ό 해석할 수 μ—†μŠ΅λ‹ˆλ‹€. 이λ₯Ό JVM 이 해석할 수 μžˆλŠ” λ‚΄μš©μœΌλ‘œ μ†ŒμŠ€ μ½”λ“œλ₯Ό λ³€ν™˜ν•˜λŠ” 과정을 컴파일(compile) 이라고 ν•©λ‹ˆλ‹€. μ»΄νŒŒμΌμ€ JDK λ₯Ό μ„€μΉ˜ν•  λ•Œ ν¬ν•¨λ˜μ–΄ μžˆλŠ” javac μ— μ˜ν•΄ μˆ˜ν–‰λ©λ‹ˆλ‹€.

 

컴파일이 μ™„λ£Œλ˜λ©΄ JVM 이 해석할 수 μžˆλŠ” λ°”μ΄νŠΈ μ½”λ“œλ‘œ μž‘μ„±λœ .class ν™•μž₯자λ₯Ό κ°€μ§€λŠ” 파일이 μƒμ„±λ©λ‹ˆλ‹€.

 

 

πŸ”Œ Class Loader

 

이제 JVM 의 ꡬ성 μš”μ†Œμ— λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

클래슀 λ‘œλ”λŠ” JVM λ‚΄μ—μ„œ 컴파일 된 클래슀 νŒŒμΌμ„ λ‘œλ“œν•˜λŠ” 역할을 μˆ˜ν–‰ν•˜λŠ” μ»΄ν¬λ„ŒνŠΈμž…λ‹ˆλ‹€. 클래슀 λ‘œλ”λŠ” 크게 Loading, Linking, Initialization 3κ°€μ§€ μ£Όμš” κΈ°λŠ₯을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.

 

 

πŸ”Œ Loading

 

클래슀 λ‘œλ”λŠ” 클래슀 νŒŒμΌμ„ 파일 μ‹œμŠ€ν…œ ν˜Ήμ€ λ„€νŠΈμ›Œν¬μ—μ„œ μ°Ύμ•„ JVM 으둜 λ‘œλ“œν•©λ‹ˆλ‹€. 각각의 클래슀 νŒŒμΌλ“€μ΄ 기본으둜 μ œκ³΅λ˜λŠ” 클래슀 νŒŒμΌμΈμ§€ ν˜Ήμ€ κ°œλ°œμžκ°€ μ •μ˜ν•œ 클래슀 νŒŒμΌμΈμ§€μ™€ 같은 기쀀에 따라 클래슀 λ‘œλ” λ˜ν•œ Bootstrap Class Loader, Extension Class Loader, Application Class Loader 둜 λ‚˜λ‰˜κ²Œ λ©λ‹ˆλ‹€.

 

1. Bootstrap Class Loader

μ΅œμƒμœ„ ν΄λž˜μŠ€ λ‘œλ”μž…λ‹ˆλ‹€. rt.jar λ₯Ό ν¬ν•¨ν•˜μ—¬, JVM μ„ κ΅¬λ™μ‹œν‚€κΈ° μœ„ν•œ κ°€μž₯ ν•„μˆ˜μ μΈ 라이브러리의 ν΄λž˜μŠ€λ“€μ„ JVM μ— λ‘œλ“œν•©λ‹ˆλ‹€.

 

2. Extension Class Loader

Bootstrap Class Loader λ‹€μŒμœΌλ‘œ μš°μ„ μˆœμœ„λ₯Ό κ°€μ§€λ©°, JDK ν™•μž₯ λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ 핡심 μžλ°” ν΄λž˜μŠ€λ“€μ„ λ‘œλ“œν•©λ‹ˆλ‹€. 보톡 /jre/lib/ext 디렉토리 λ˜λŠ” java.ext.dirs ν™˜κ²½λ³€μˆ˜λ‘œ μ§€μ •λœ λ””λ ‰ν† λ¦¬μ˜ νŒŒμΌμ„ λ‘œλ“œν•©λ‹ˆλ‹€.

 

3. Application ClassLoader

JVM 클래슀 λ‘œλ” 계측 κ΅¬μ‘°μ—μ„œ μ΅œν•˜μœ„μ— μœ„μΉ˜ν•˜λ©°, μ‚¬μš©μžκ°€ μž‘μ„±ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œμ™€ κ΄€λ ¨λœ ν΄λž˜μŠ€λ“€μ„ λ‘œλ“œν•©λ‹ˆλ‹€.

 

 

πŸ”Œ Linking

 

클래슀 파일이 λ‘œλ“œ 된 ν›„μ—λŠ” 링크 과정을 κ±°μΉ©λ‹ˆλ‹€. 링크 과정은 λ‘œλ“œλœ 클래슀 νŒŒμΌλ“€μ„ κ²€μ¦ν•˜κ³ , μ‚¬μš©ν•  수 있게 μ€€λΉ„ν•˜λŠ” 과정을 μ˜λ―Έν•©λ‹ˆλ‹€. 이 과정은 Verification, Preparation, Resolution μ΄λΌλŠ” μ„Έ κ°€μ§€ λ‹¨κ³„λ‘œ 이루어져 μžˆμŠ΅λ‹ˆλ‹€.

 

1. Verification

클래슀 파일이 μœ νš¨ν•œμ§€ κ²€μ‚¬ν•˜κ³ , JVM 이 μ•ˆμ „ν•˜κ²Œ 싀행될 수 μžˆλŠ”μ§€ ν™•μΈν•˜λŠ” κ³Όμ •μž…λ‹ˆλ‹€. 클래슀의 ꡬ쑰적인 μœ νš¨μ„±, 상속 관계, ν•„λ“œ 및 λ©”μ„œλ“œμ˜ μ ‘κ·Ό κΆŒν•œ 등을 κ²€μ‚¬ν•©λ‹ˆλ‹€.

 

2. Preparation

클래슀의 정적 ν•„λ“œλ₯Ό ν• λ‹Ήν•˜κ³  κΈ°λ³Έκ°’μœΌλ‘œ μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€. 이 λ‹¨κ³„μ—μ„œλŠ” λ©”λͺ¨λ¦¬ κ³΅κ°„λ§Œ ν• λ‹Ήλ˜κ³ , μ‹€μ œ μ΄ˆκΈ°ν™”λŠ” Initialization λ‹¨κ³„μ—μ„œ μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€.

 

3. Resolution

Symbolic Reference(λ‹€λ₯Έ 클래슀λ₯Ό κ°€λ¦¬ν‚€λŠ” 논리 μ°Έμ‘°)κ°€ μ‘΄μž¬ν•˜λŠ” 경우 JVM 의 Method Area 의 λŸ°νƒ€μž„ ν™˜κ²½ 풀을 μ΄μš©ν•˜μ—¬ Direct Reference λΌλŠ” μ‹€μ œ λ©”λͺ¨λ¦¬ μœ„μΉ˜λ‘œ κ΅μ²΄ν•©λ‹ˆλ‹€.

 

 

πŸ”Œ Initialization

 

Linking 과정이 λλ‚œ ν›„ Initialization λ‹¨κ³„μ—μ„œλŠ” ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€μ˜ 값듀을 μ§€μ •ν•œ κ°’λ“€λ‘œ μ΄ˆκΈ°ν™” 및 μ΄ˆκΈ°ν™” λ©”μ„œλ“œλ₯Ό μ‹€ν–‰μ‹œμΌœμ€λ‹ˆλ‹€. 클래슀 λ‘œλ”λ₯Ό ν†΅ν•œ 클래슀 νƒ‘μž¬ 과정이 λλ‚˜λ©΄ JVM μ—μ„œ 클래슀 νŒŒμΌμ„ κ΅¬λ™μ‹œν‚¬ μ€€λΉ„κ°€ λλ‚˜κ²Œ λ©λ‹ˆλ‹€.

 

 

▢️ Execution Engine

 

μ‹€ν–‰ 엔진은 μžλ°” λ°”μ΄νŠΈ μ½”λ“œλ₯Ό μ‹€μ œλ‘œ μ‹€ν–‰ κ°€λŠ₯ν•œ 기계 μ½”λ“œλ‘œ λ³€ν™˜ν•˜κ³  μ‹€ν–‰ν•˜λŠ” 역할을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.

 

Execution Engine 은 크게 두 κ°€μ§€λ‘œ κ΅¬λΆ„λ©λ‹ˆλ‹€.

 

  • Interpreter
  • JIT Compiler

 

 

▢️ Interpreter

 

μΈν„°ν”„λ¦¬ν„°λŠ” 컴파일된 .class 파일의 λ°”μ΄νŠΈμ½”λ“œλ₯Ό ν•œ 쀄씩 읽고 ν•΄μ„ν•˜μ—¬ μ‹€ν–‰ν•˜λŠ” 역할을 μˆ˜ν–‰ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ μΈν„°ν”„λ¦¬ν„°μ˜ μ‹€ν–‰ 방식은 반볡적인 해석 과정이 ν•„μš”ν•˜κΈ° λ•Œλ¬Έμ— μ‹€ν–‰ 속도가 C, C++ 처럼 μ»΄νŒŒμΌμ„ 톡해 미리 κΈ°κ³„μ–΄λ‘œ λ²ˆμ—­λ˜λŠ” 언어에 λΉ„ν•΄ μƒλŒ€μ μœΌλ‘œ 속도가 λŠλ¦¬λ‹€λŠ” 단점이 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ 단점을 λ³΄μ™„ν•˜κΈ° μœ„ν•΄ JIT μ»΄νŒŒμΌλŸ¬μ™€ ν•¨κ»˜ μ‚¬μš©λ©λ‹ˆλ‹€.

 

 

▢️ JIT 컴파일러

 

JIT(Just In Time) μ»΄νŒŒμΌλŸ¬λŠ” Interpreter 의 μ„±λŠ₯을 ν–₯μƒμ‹œν‚€κΈ° μœ„ν•΄ λ„μž…λœ κΈ°μˆ μž…λ‹ˆλ‹€. JIT μ»΄νŒŒμΌλŸ¬λŠ” 인터프리터가 반볡적으둜 μ‹€ν–‰ν•˜λŠ” 뢀뢄을 λ™μ μœΌλ‘œ κΈ°κ³„μ–΄λ‘œ λ³€ν™˜ν•˜μ—¬ μ‹€ν–‰ 속도λ₯Ό ν–₯μƒμ‹œν‚΅λ‹ˆλ‹€. 인터프리터 λ°©μ‹μœΌλ‘œ μ‹€ν–‰ν•˜λ‹€κ°€ μ μ ˆν•œ μ‹œμ μ— νŠΉμ • λ©”μ„œλ“œλ₯Ό μ»΄νŒŒμΌν•˜μ—¬ κΈ°κ³„μ–΄λ‘œ λ³€ν™˜ν•˜κ³ , μ΄ν›„μ—λŠ” 더 이상 μΈν„°ν”„λ¦¬νŒ…ν•˜μ§€ μ•Šκ³  κΈ°κ³„μ–΄λ‘œ 직접 μ‹€ν–‰ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€. 기계어λ₯Ό μ‹€ν–‰ν•˜λŠ” 것이 μΈν„°ν”„λ¦¬νŒ…ν•˜λŠ” 것보닀 λΉ λ₯΄κ³ , λ³€ν™˜λœ κΈ°κ³„μ–΄λŠ” μΊμ‹œμ— λ³΄κ΄€λ˜κΈ° λ•Œλ¬Έμ— ν•œλ²ˆ λ³€ν™˜λœ μ½”λ“œλŠ” κ³„μ†ν•΄μ„œ λΉ λ₯΄κ²Œ 싀행될 수 μžˆμŠ΅λ‹ˆλ‹€.

 

JIT μ»΄νŒŒμΌλŸ¬κ°€ μ»΄νŒŒμΌν•˜λŠ” 과정은 λ°”μ΄νŠΈμ½”λ“œλ₯Ό μΈν„°ν”„λ¦¬νŒ…ν•˜λŠ” 것보닀 더 μ˜€λž˜κ±Έλ¦¬λŠ” μž‘μ—…μž…λ‹ˆλ‹€. λ”°λΌμ„œ, JIT μ»΄νŒŒμΌλŸ¬λŠ” λ©”μ„œλ“œκ°€ μ–Όλ§ˆλ‚˜ 자주 μˆ˜ν–‰λ˜λŠ”μ§€ μ²΄ν¬ν•˜κ³  일정 μž„κ³„μΉ˜λ₯Ό λ„˜μ€ κ²½μš°μ—λ§Œ μ»΄νŒŒμΌμ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

 

 

πŸ—„οΈ Runtime Data Area

 

λŸ°νƒ€μž„ 데이터 μ˜μ—­ ꡬ성

 

λŸ°νƒ€μž„ 데이터 μ˜μ—­μ€ JVM 이 운영체제 μœ„μ—μ„œ μ‹€ν–‰λ˜λ©΄μ„œ ν• λ‹Ήλ°›λŠ” λ©”λͺ¨λ¦¬ μ˜μ—­μž…λ‹ˆλ‹€. μœ„ κ·Έλ¦Όκ³Ό 같이 6개의 μ˜μ—­μœΌλ‘œ λ‚˜λ‰˜κ²Œ λ©λ‹ˆλ‹€. PC λ ˆμ§€μŠ€ν„°, JVM μŠ€νƒ, λ„€μ΄ν‹°λΈŒ λ©”μ„œλ“œ μŠ€νƒμ€ μŠ€λ ˆλ“œλ³„λ‘œ ν•˜λ‚˜μ”© μƒμ„±λ˜λ©° νž™, λ©”μ„œλ“œ μ˜μ—­, λŸ°νƒ€μž„ μƒμˆ˜ 풀은 λͺ¨λ“  μŠ€λ ˆλ“œμ—μ„œ κ³΅μœ λ©λ‹ˆλ‹€.

 

 

πŸ—„οΈ PC Register

 

  • PC(Program Counter) λ ˆμ§€μŠ€ν„°λŠ” 각 μŠ€λ ˆλ“œλ§ˆλ‹€ ν•˜λ‚˜μ”© μ‘΄μž¬ν•˜λ©° μŠ€λ ˆλ“œκ°€ μ‹œμž‘λ  λ•Œ μƒμ„±λ©λ‹ˆλ‹€.
  • ν˜„μž¬ μˆ˜ν–‰μ€‘μΈ JVM λͺ…λ Ήμ˜ μ£Όμ†Œλ₯Ό κ°€μ§‘λ‹ˆλ‹€.

 

 

πŸ—„οΈ JVM Stack

 

  • 각 μŠ€λ ˆλ“œλ§ˆλ‹€ ν•˜λ‚˜μ”© μ‘΄μž¬ν•˜λ©° μŠ€λ ˆλ“œκ°€ μ‹œμž‘λ  λ•Œ μƒμ„±λ©λ‹ˆλ‹€.
  • μŠ€νƒ ν”„λ ˆμž„μ΄λΌλŠ” ꡬ쑰체λ₯Ό μ €μž₯ν•˜λŠ” μŠ€νƒμž…λ‹ˆλ‹€. 각 μŠ€νƒ ν”„λ ˆμž„μ€ μ§€μ—­ λ³€μˆ˜ λ°°μ—΄, ν”Όμ—°μ‚°μž μŠ€νƒ, ν˜„μž¬ 싀행쀑인 λ©”μ„œλ“œκ°€ μ†ν•œ 클래슀의 λŸ°νƒ€μž„ μƒμˆ˜ 풀에 λŒ€ν•œ 레퍼런슀λ₯Ό κ°€μ§‘λ‹ˆλ‹€.
  • JVM λ‚΄μ—μ„œ λ©”μ„œλ“œκ°€ μˆ˜ν–‰λ  λ•Œλ§ˆλ‹€ ν•˜λ‚˜μ˜ μŠ€νƒ ν”„λ ˆμž„μ΄ μƒμ„±λ˜μ–΄ ν•΄λ‹Ή μŠ€λ ˆλ“œμ˜ JVM μŠ€νƒμ— μΆ”κ°€λ˜κ³  λ©”μ„œλ“œκ°€ μ’…λ£Œλ˜λ©΄ μŠ€νƒ ν”„λ ˆμž„μ΄ μ œκ±°λ©λ‹ˆλ‹€.

 

 

πŸ—„οΈ Native Method Stack

 

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

 

 

πŸ—„οΈ Heap

 

  • λͺ¨λ“  μŠ€λ ˆλ“œμ—μ„œ κ³΅μœ ν•©λ‹ˆλ‹€.
  • μΈμŠ€ν„΄μŠ€ λ˜λŠ” 객체λ₯Ό μ €μž₯ν•˜λŠ” κ³΅κ°„μœΌλ‘œ Garbage Collection λŒ€μƒμž…λ‹ˆλ‹€.

 

 

πŸ—„οΈ Method Area

 

  • λͺ¨λ“  μŠ€λ ˆλ“œμ—μ„œ κ³΅μœ ν•˜λŠ” μ˜μ—­μœΌλ‘œ JVM 이 μ‹œμž‘λ  λ•Œ μƒμ„±λ©λ‹ˆλ‹€.
  • JVM 이 읽은 ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€μ— λŒ€ν•œ λŸ°νƒ€μž„ μƒμˆ˜ ν’€, ν•„λ“œμ™€ λ©”μ„œλ“œ 정보, static λ³€μˆ˜, λ©”μ„œλ“œμ˜ λ°”μ΄νŠΈμ½”λ“œ 등을 λ³΄κ΄€ν•©λ‹ˆλ‹€.

 

 

πŸ—„οΈ Runtime Constant Pool

 

  • λ©”μ„œλ“œ μ˜μ—­μ— ν¬ν•¨λ˜λŠ” μ˜μ—­μž…λ‹ˆλ‹€.
  • 각 ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€μ˜ μƒμˆ˜λΏλ§Œ μ•„λ‹ˆλΌ, λ©”μ„œλ“œμ™€ ν•„λ“œμ— λŒ€ν•œ λͺ¨λ“  λ ˆνΌλŸ°μŠ€κΉŒμ§€ λ‹΄κ³  μžˆλŠ” ν…Œμ΄λΈ”μž…λ‹ˆλ‹€.
  • μ–΄λ–€ λ©”μ„œλ“œλ‚˜ ν•„λ“œλ₯Ό μ°Έμ‘°ν•  λ•Œ JVM 은 λŸ°νƒ€μž„ μƒμˆ˜ 풀을 톡해 ν•΄λ‹Ή λ©”μ„œλ“œλ‚˜ ν•„λ“œμ˜ μ‹€μ œ λ©”λͺ¨λ¦¬μƒ μ£Όμ†Œλ₯Ό μ°Ύμ•„μ„œ μ°Έμ‘°ν•©λ‹ˆλ‹€.

 

 

πŸ“š μ°Έκ³ 

 

https://tecoble.techcourse.co.kr/post/2021-07-15-jvm-classloader/

https://d2.naver.com/helloworld/1230