πŸ’¬ κ°œλ°œμ–Έμ–΄/JAVA

[ JAVA ] JVM

HI_IH 2023. 2. 10.

JVM은 λ¬΄μ—‡μΌκΉŒ?

Java Virtual Machine 의 μ•½μžλ‘œ, μžλ°”λ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•œ 가상 기계라고 ν•  수 μžˆλ‹€. μ—¬κΈ°μ„œ 가상 κΈ°κ³„λž€ μ†Œν”„νŠΈμ›¨μ–΄λ‘œ κ΅¬ν˜„λœ ν•˜λ“œμ›¨μ–΄λ₯Ό λœ»ν•˜λŠ” 넓은 의미의 μš©μ–΄μ΄λ‹€. ( 컴퓨터 μ„±λŠ₯의 ν–₯μƒμœΌλ‘œ λ§Žμ€ μ†Œν”„νŠΈμ›¨μ–΄λ“€μ΄ μ†Œν”„νŠΈμ›¨μ–΄ν™”λ˜μ–΄ 컴퓨터 μ†μœΌλ‘œ λ“€μ–΄μ˜€κ³  μžˆλ‹€ )

 

μ‰½κ²Œ 말해

μžλ°”λ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•œ κ°€μƒμ˜ 컴퓨터

라고 μ΄ν•΄ν•˜λ©΄ 쒋을 것이닀.

 

μžλ°”λ‘œ μž‘μ„±λœ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ λͺ¨λ‘ 이 가상 컴퓨터(JVM) μ—μ„œλ§Œ μ‹€ν–‰λ˜κΈ° λ•Œλ¬Έμ— μžλ°” μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ‹€ν–‰λ˜κΈ° μœ„ν•΄μ„œλŠ” λ°˜λ“œμ‹œ JVM이 ν•„μš”ν•˜λ‹€.

 

JVM 은 μ™œ ν•„μš”ν• κΉŒ?

μ•žμ„œ μžλ°” μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ‹€ν–‰λ˜κΈ° μœ„ν•΄μ„œλŠ” λ°˜λ“œμ‹œ JVM 이 ν•„μš”ν•˜λ‹€κ³  ν–ˆλŠ”λ° 이게 μ™œ λ°˜λ“œμ‹œ ν•„μš”ν•œ κ²ƒμΌκΉŒ?

 

μ»΄ν“¨ν„°λŠ” κΈ°κ³„μ–΄λ§Œ μ•Œμ•„λ“€μ„ 수 있기 λ•Œλ¬Έμ— μ‚¬λžŒμ΄ μž‘μ„±ν•œ μ½”λ“œλ₯Ό 컴퓨터가 μ•Œμ•„λ“€μ„ 수 있게 컴파일러λ₯Ό 톡해 λ²ˆμ—­ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€. μ΄λ ‡κ²Œ μ»΄νŒŒμΌλŸ¬κ°€ μ‚¬λžŒμ΄ μž‘μ„±ν•œ μ½”λ“œλ₯Ό 0κ³Ό 1둜 이루어진 κΈ°κ³„μ–΄λ‘œ 컴파일 ν•΄μ£Όμ—ˆμ„ λ•Œ λΉ„λ‘œμ†Œ 컴퓨터가 거기에 맞게 행동할 수 μžˆλŠ” 것이닀. 

 

ν•˜μ§€λ§Œ κΈ°κ³„μ–΄λŠ” μ‹€ν–‰ν™˜κ²½μ— 따라 μ“°μ΄λŠ” 기계어가 λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— μ‹€ν–‰ν™˜κ²½μ— λ§žκ²Œλ” 컴파일 ν•΄μ£Όμ–΄μ•Όν•œλ‹€. μ΄λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ 것이 λ°”λ‘œ JVM이닀. 

 

 

Java 둜 ν”„λ‘œκ·Έλž˜λ°μ„ ν•˜κ³  μ»΄νŒŒμΌμ„ 거치면 λ°”λ‘œ κΈ°κ³„μ–΄λ‘œ λ³€ν™˜λ˜μ§€ μ•Šκ³  λ°”μ΄νŠΈ μ½”λ“œ(.class)둜 λ³€ν™˜λœλ‹€. 그리고 λ§Œμ•½ μ „λ‹¬ν•΄μ£ΌλŠ” 컴퓨터에 JVM이 μ‘΄μž¬ν•œλ‹€λ©΄ JVM은 이λ₯Ό λ°›μ•„μ„œ μ‹€ν–‰ν™˜κ²½μ— λ§žκ²Œλ” κΈ°κ³„μ–΄λ‘œ λ²ˆμ—­ν•΄μ£Όκ³  μ»΄ν“¨ν„°λŠ” κΈ°κ³„μ–΄λ‘œ ν”„λ‘œκ·Έλž˜λ° λͺ…령을 μ‹€ν–‰ν•  수 μžˆλŠ” 것이닀.

 

μš”μ•½ν•˜μžλ©΄ JVM은 μžλ°” μ½”λ“œμ™€ 기계어 사이에 μ‘΄μž¬ν•˜λŠ” λ°”μ΄νŠΈ μ½”λ“œλ₯Ό JVM이 κΉ”λ¦° μ–΄λ–€ μ’…λ₯˜μ˜ μ‹€ν–‰ν™˜κ²½μ—μ„œλ„ λŒμ•„κ°ˆ 수 μžˆκ²Œλ” 도와주기 μœ„ν•΄ μ‘΄μž¬ν•˜λŠ” 것이닀. 그리고 μ΄λŸ¬ν•œ JVM으둜 인해 μžλ°”μ˜ μ€‘μš”ν•œ μž₯점 쀑 ν•˜λ‚˜μΈ "ν•œλ²ˆ μž‘μ„±ν•˜λ©΄ μ–΄λ””μ„œλ“  μ‹€ν–‰λœλ‹€" (Write once, run anywhere) κ°€ κ°€λŠ₯ν•˜κ²Œ λ˜λŠ” 것이닀.

 

일반 μ• ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 비ꡐ

일반 μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 경우, μ½”λ“œκ°€ OS만 거치고 ν•˜λ“œμ›¨μ–΄λ‘œ μ „λ‹¬λ˜λ©° OS에 λ°”λ‘œ λ§žλΆ™μ–΄ 있기 λ•Œλ¬Έμ— OS에 쒅속적이닀. 즉, μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ‹€λ₯Έ OSμ—μ„œ μ‹€ν–‰μ‹œν‚€κΈ° μœ„ν•΄μ„œλŠ” κ·Έ OS에 λ§žκ²Œλ” λ³€κ²½ν•΄μ•Ό ν•œλ‹€.

 

반면 Java μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ€, JVM ν•˜κ³ λ§Œ μƒν˜Έμž‘μš©ν•˜κΈ° λ•Œλ¬Έμ— OS에 독립적이닀. 즉, μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ‹€λ₯Έ OS에 μ‹€ν–‰μ‹œν‚€κΈ° μœ„ν•΄μ„œ λ³€κ²½ν•  ν•„μš”κ°€ μ—†λ‹€. λ¬Όλ‘  μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ 독립적인 것이고 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λŒ€μ‹  OS와 λ§žλΆ™μ–΄μžˆλŠ” JVM은 OS에 쒅속적이닀. 즉, ν•΄λ‹Ή OS에 μ‹€ν–‰κ°€λŠ₯ν•œ JVM이 ν•„μš”ν•˜λ‹€.

μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ JVM을 ν•œλ²ˆ 더 거치고, ν•˜λ“œμ›¨μ–΄μ— 맞게 μ™„μ „νžˆ 컴파일된 μƒνƒœκ°€ μ•„λ‹ˆκ³  μ‹€ν–‰ μ‹œμ— ν•΄μ„λ˜κΈ° λ•Œλ¬Έμ— 속도가 λŠλ¦¬λ‹€λŠ” 단점을 κ°€μ§€κ³  μžˆμ§€λ§Œ μš”μ¦˜λ“€μ–΄ λ°”μ΄νŠΈμ½”λ“œ(컴파일된 μžλ°” μ½”λ“œ)λ₯Ό κΈ°κ³„μ–΄λ‘œ λ°”λ‘œ λ³€ν™˜ν•΄μ£ΌλŠ” JIT μ»΄νŒŒμΌλŸ¬μ™€ ν–₯μƒλœ μ΅œμ ν™” 기술이 μ μš©λ˜μ–΄ 속도 차이λ₯Ό 많이 μ€„μ˜€λ‹€. 

 

μš”μ•½ν•˜μžλ©΄ λ‹€μŒκ³Ό κ°™λ‹€. 

 

일반 μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜

  • OS에 쒅속적이닀.
  • μƒλŒ€μ μœΌλ‘œ λΉ λ₯΄λ‹€.

μžλ°” μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜

  • OS에 독립적이닀. ( JVM이 쒅속적이닀. )
  • μƒλŒ€μ μœΌλ‘œ λŠλ¦¬λ‹€. ( 졜근 격차가 많이 μ€„μ—ˆλ‹€. )

 

JVM 의 μˆ˜ν–‰ κ³Όμ • ( λ™μž‘ 방식 )

μ§€κΈˆκΉŒμ§€ 글을 μ½μ—ˆλ‹€λ©΄ JAVA μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μˆ˜ν–‰λ˜κΈ° κΉŒμ§€ .java(μ†ŒμŠ€ μ½”λ“œ) -> 컴파일러 -> .class(λ°”μ΄νŠΈ μ½”λ“œ) -> jvm -> μ‹€ν–‰μ˜ μˆœμ„œλ₯Ό κ°€μ§„λ‹€λŠ” 것을 μ•Œ 수 μžˆμ„ 것이닀. κ·Έλ ‡λ‹€λ©΄ JVM λ‚΄λΆ€μ—μ„œ λ°”μ΄νŠΈ μ½”λ“œλ₯Ό μ–΄λ–»κ²Œ μ²˜λ¦¬ν•˜λŠ”μ§€ μ•Œμ•„λ³΄μž.

JVM은 컴파일된 λ°”μ΄νŠΈ μ½”λ“œλ₯Ό 받은 λ‹€μŒ μ•„λž˜μ™€ 같은 μˆœμ„œλ‘œ μ²˜λ¦¬ν•œλ‹€.

  1. Class Loader λͺ¨λ“ˆμ„ μ‚¬μš©ν•΄μ„œ λŸ°νƒ€μž„ μ‹œμ— λ™μ μœΌλ‘œ 클래슀λ₯Ό RunTime Data Area에 λ‘œλ“œν•œλ‹€.
  2. RunTime Data Area에 λ‘œλ”©λœ class 듀은 Execution Engine을 톡해 ν•΄μ„λœλ‹€.
  3. ν•΄μ„λœ λ°”μ΄νŠΈ μ½”λ“œλŠ” Runtime Data Area의 각 μ˜μ—­μ— λ°°μΉ˜λ˜μ–΄ μˆ˜ν–‰λ˜λ©° 이 κ³Όμ •μ—μ„œ Execution Engine에 μ˜ν•΄ GC의 μž‘λ™κ³Ό Thead 동기화가 이루어진닀.

각 λͺ¨λ“ˆμ— λŒ€ν•΄μ„œλ„ μ•Œμ•„λ³΄μž

 

Class Loader

  • JVM λ‚΄λ‘œ 클래슀 νŒŒμΌμ„ λ‘œλ“œν•˜κ³ , λ°°μΉ˜ν•˜λŠ” μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” λͺ¨λ“ˆ

Execution Engine

  • 클래슀 λ‘œλ”λ₯Ό 톡해 JVM λ‚΄μ˜ Runtime Data Area에 배치된 λ°”μ΄νŠΈ μ½”λ“œλ“€μ„ λͺ…렁어 λ‹¨μœ„λ‘œ μ½μ–΄μ„œ μ‹€ν–‰.
졜초 JVM이 λ‚˜μ™”μ„ λ‹Ήμ‹œμ—λŠ” 인터프리터 λ°©μ‹μ΄μ—ˆκΈ°λ•Œλ¬Έμ— 속도가 λŠλ¦¬λ‹€λŠ” 단점이 μžˆμ—ˆμ§€λ§Œ JIT 컴파일러 방식을 톡해 이 점을 λ³΄μ™„ν•œλ‹€. JITλŠ” λ°”μ΄νŠΈ μ½”λ“œλ₯Ό μ–΄μ…ˆλΈ”λŸ¬ 같은 λ„€μ΄ν‹°λΈŒ μ½”λ“œλ‘œ λ°”κΏˆμœΌλ‘œμ¨ 싀행이 λΉ λ₯΄μ§€λ§Œ μ—­μ‹œ λ³€ν™˜ν•˜λŠ”λ° λΉ„μš©μ΄ λ°œμƒν–ˆλŠ”λ° 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ JVM은 λͺ¨λ“  μ½”λ“œλ₯Ό JIT 컴파일러 λ°©μ‹μœΌλ‘œ μ‹€ν–‰ν•˜μ§€ μ•Šκ³ , 인터프리터 방식을 μ‚¬μš©ν•˜λ‹€κ°€ μΌμ •ν•œ 기쀀이 λ„˜μ–΄κ°€λ©΄ JIT 컴파일러 λ°©μ‹μœΌλ‘œ μ‹€ν–‰ν•œλ‹€.

 

Garbage Collector

Garbage Collector(GC)λŠ” νž™ λ©”λͺ¨λ¦¬ μ˜μ—­μ— μƒμ„±λœ 객체듀 μ€‘μ—μ„œ μ°Έμ‘°λ˜μ§€ μ•Šμ€ 객체듀을 탐색 ν›„ μ œκ±°ν•˜λŠ” 역할을 ν•œλ‹€. μ΄λ•Œ, GCκ°€ 역할을 ν•˜λŠ” μ‹œκ°„μ€ μ–Έμ œμΈμ§€ μ •ν™•νžˆ μ•Œ 수 μ—†λ‹€.

 

Runtime Data Area

JVM의 λ©”λͺ¨λ¦¬ μ˜μ—­μœΌλ‘œ μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•  λ•Œ μ‚¬μš©λ˜λŠ” 데이터듀을 μ μž¬ν•˜λŠ” μ˜μ—­μ΄λ‹€. 이 μ˜μ—­μ€ 크게 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack둜 λ‚˜λˆŒ 수 μžˆλ‹€.

 

이제 λ™μž‘ 과정을 과정에 따라 μ’€ 더 μƒμ„Έν™”ν•œ λ„μ‹μœΌλ‘œ μ•Œμ•„λ³΄μž

 

JVM의 λ©”λͺ¨λ¦¬ ꡬ쑰

μ‘μš© ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜λ©΄, JVM은 μ‹œμŠ€ν…œμœΌλ‘œλΆ€ν„° ν”„λ‘œκ·Έλž¨μ„ μˆ˜ν–‰ν•˜λŠ”λ° ν•„μš”ν•œ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ή λ°›κ³  JVM은 이 λ©”λͺ¨λ¦¬λ₯Ό μš©λ„μ— 따라 μ—¬λŸ¬ μ˜μ—­μœΌλ‘œ λ‚˜λˆ„μ–΄ κ΄€λ¦¬ν•œλ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€. 이제 이 λ©”λͺ¨λ¦¬ μ˜μ—­μ˜ ꡬ쑰λ₯Ό μ•Œμ•„λ³΄μž.

 

λ©”μ„œλ“œ μ˜μ—­ β˜…

λͺ¨λ“  μ“°λ ˆλ“œκ°€ κ³΅μœ ν•˜λŠ” λ©”λͺ¨λ¦¬ μ˜μ—­μ΄λ©° ν΄λž˜μŠ€μ— λŒ€ν•œ 정보(클래슀 데이터)λ₯Ό μ €μž₯ν•˜λŠ” μ˜μ—­μ΄λ‹€. 클래슀, μΈν„°νŽ˜μ΄μŠ€, λ©”μ„œλ“œ, ν•„λ“œ, static λ³€μˆ˜ λ“±μ˜ λ°”μ΄νŠΈ μ½”λ“œλ₯Ό λ³΄κ΄€ν•œλ‹€.

νž™ μ˜μ—­ β˜…

λͺ¨λ“  μ“°λ ˆλ“œκ°€ κ³΅μœ ν•˜λ©° μΈμŠ€ν„΄μŠ€ λ³€μˆ˜, new ν‚€μ›Œλ“œλ‘œ μƒμ„±λœ 객체와 배열이 μƒμ„±λ˜λŠ” 동적인 μ˜μ—­μ΄λ‹€. λ˜ν•œ λ©”μ„œλ“œ μ˜μ—­μ— λ‘œλ“œλœ 클래슀만 생성이 κ°€λŠ₯ν•˜κ³  GCκ°€ μ°Έμ‘°λ˜μ§€ μ•ŠλŠ” λ©”λͺ¨λ¦¬λ₯Ό ν™•μΈν•˜κ³  μ œκ±°ν•˜λŠ” μ˜μ—­μ΄λ‹€. 즉 ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 쀑 μƒμ„±λ˜λŠ” μΈμŠ€ν„΄μŠ€λ“€μ΄ μƒμ„±λ˜λŠ” 곡간이닀.

호좜 μŠ€νƒ μ˜μ—­ β˜…

 λ©”μ„œλ“œ μž‘μ—…μ— ν•„μš”ν•œ λ©”λͺ¨λ¦¬ 곡간을 μ œκ³΅ν•œλ‹€. λ©”μ„œλ“œκ°€ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” λ™μ•ˆ μ§€μ—­λ³€μˆ˜λ“€κ³Ό μ—°μ‚°μ˜ 쀑간결과 등을 μ €μž₯ν•˜λŠ”λ° μ‚¬μš©λ˜λ©° μž‘μ—…μ„ 마칠 경우 ν• λ‹Ήλ˜μ—ˆλ˜ λ©”λͺ¨λ¦¬ 곡간은 λ°˜ν™˜λ˜μ–΄ λΉ„μ–΄μ§„λ‹€. 즉, 호좜된 λ©”μ„œλ“œμ˜ λ§€κ°œλ³€μˆ˜, μ§€μ—­λ³€μˆ˜, 리턴 κ°’ 및 μ—°μ‚° μ‹œμ— μΌμ–΄λ‚˜λŠ” 값듀을 μž„μ‹œλ‘œ μ €μž₯ν•˜λŠ” 곡간이닀.

 

이 μ˜μ—­μ€ λ‹€μŒκ³Ό 같이 λ©”μ„œλ“œκ°€ 호좜될 λ•Œλ§ˆλ‹€ μˆ˜ν–‰μ— ν•„μš”ν•œ λ©”λͺ¨λ¦¬λ₯Ό μŠ€νƒμ— ν• λ‹Ήλ°›κ³  μˆ˜ν–‰μ„ 마치고 λ‚˜λ©΄ μ‚¬μš©ν–ˆλ˜ λ©”λͺ¨λ¦¬λ₯Ό λ°˜ν™˜ν•˜κ³  μŠ€νƒμ—μ„œ μ œκ±°κ°€ λœλ‹€. λ§Œμ•½ 첫 번째 λ©”μ„œλ“œλ₯Ό μ‹€ν–‰ν•˜λ˜ 쀑에 λ‹€λ₯Έ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄ λ©”μ„œλ“œ μœ„μ— 두 번째 호좜된 λ©”μ„œλ“œλ₯Ό μœ„ν•œ 곡간이 λ§ˆλ ¨λœλ‹€. λ°˜ν™˜νƒ€μž…μ΄ μžˆλŠ” λ©”μ„œλ“œμ˜ 경우 μ’…λ£Œλ˜λ©° 결과값을 μžμ‹ μ„ ν˜ΈμΆœν•œ λ©”μ„œλ“œμ—κ²Œ λ°˜ν™˜ν•˜κ³  λŒ€κΈ°μƒνƒœμ— μžˆλŠ” λ©”μ„œλ“œλŠ” λ„˜κ²¨λ°›μ€ λ°˜ν™˜κ°’μœΌλ‘œ μˆ˜ν–‰μ„ 계속 μ§„ν–‰ν•˜κ²Œ λœλ‹€.

PC Register

μ“°λ ˆλ“œκ°€ μ‹œμž‘λ  λ•Œ μƒμ„±λ˜λ©° μƒμ„±λ˜λŠ” κ³΅κ°„μœΌλ‘œ μ“°λ ˆλ“œλ§ˆλ‹€ ν•˜λ‚˜μ”© μ‘΄μž¬ν•œλ‹€. μ“°λ ˆλ“œκ°€ μ–΄λ–€ 뢀뢄을 무슨 λͺ…λ ΉμœΌλ‘œ 싀행할지에 λŒ€ν•œ 기둝을 ν•˜λŠ” λΆ€λΆ„μœΌλ‘œ ν˜„μž¬ μˆ˜ν–‰μ€‘μΈ JVM λͺ…λ Ήμ˜ μ£Όμ†Œλ₯Ό κ°–λŠ”λ‹€.

Native Method Stack

μžλ°” μ™Έ μ–Έμ–΄λ‘œ μž‘μ„±λœ λ„€μ΄ν‹°λΈŒ μ½”λ“œλ₯Ό μœ„ν•œ λ©”λͺ¨λ¦¬ μ˜μ—­μ΄λ‹€.

 

 

 

 

'πŸ’¬ κ°œλ°œμ–Έμ–΄ > JAVA' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[ JAVA ] JRE,JDK  (0) 2023.02.10
[ JAVA ]String 클래슀 κ°„λ‹¨ν•œ 정리  (0) 2023.02.05

λŒ“κΈ€