LANGUAGE/JAVA

[JAVA] 1μ£Όμ°¨ - JVM은 무엇이며 μžλ°” μ½”λ“œλŠ” μ–΄λ–»κ²Œ μ‹€ν–‰ν•˜λŠ” 것인가

GaGah 2021. 10. 10. 17:57

좜처 : https://nakyungim.tistory.com/entry/JAVA-Java-%EC%A0%9C%EA%B1%B0-%ED%9B%84-%EC%9E%AC%EC%84%A4%EC%B9%98

 

πŸ‘» μžλ°”κ°€ λ§Œλ“€μ–΄μ§€κ²Œ 된 λ°°κ²½

μžλ°”λŠ” 기본적으둜 C/C++κ³Ό λΉ„μŠ·ν•˜μ§€λ§Œ C/C++을 μ‚¬μš©ν•˜λ©΄μ„œ λ‚˜νƒ€λ‚˜λŠ” λ³΅μž‘ν•˜κ³  μ•ˆμ „ν•˜μ§€ μ•Šμ€ 문제λ₯Ό ν•΄κ²°ν•˜κ³ μž ν–ˆλ‹€.

μ΄ˆκΈ°μ— μžλ°”κ°€ 지ν–₯ν•œ λ°”λ‘œλŠ” multiple host architecture 와 secure으둜 ν•œ 번 μ“°κ³  μ–΄λŠ κ³³μ—μ„œλ„ μ‹€ν–‰ν•  수 μžˆλŠ” 것을 λͺ©ν‘œλ‘œ ν–ˆλ‹€. (Write Once Run Anywhere)

μžλ°”λ‘œ 개발된 ν”„λ‘œκ·Έλž¨μ€ CPUλ‚˜ 운영 체제의 μ’…λ₯˜μ— 관계없이 JVM을 μ„€μΉ˜ν•  수 μžˆλŠ” μ‹œμŠ€ν…œμ—μ„œ μ–΄λ””μ„œλ‚˜ μ‹€ν–‰ν•  수 있으며 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ νŠΉμ„±κ³Ό λ§žμ•„λ–¨μ–΄μ Έ 폭발적인 인기λ₯Ό 끌게 λ˜μ—ˆλ‹€.

 

πŸ™„ JVMμ΄λž€ 무엇인가?

  • μ •μ˜ : μžλ°” 가상 기계(JVM : Java Virtual Machine)λ‘œμ„œ μžλ°” λ°”μ΄νŠΈμ½”λ“œλ₯Ό μ‹€ν–‰ν•  수 μžˆλŠ” 주체
  • μ„€κ³„μž : μ œμž„μŠ€ 고슬링(James Gosling)
  • ꡬ성 : Class Loader, Excution Engine, Garbage Collector, Runtime Data Area
  • μž₯점 : CPUλ‚˜ 운영체제 μ’…λ₯˜μ™€ λ¬΄κ΄€ν•˜κ²Œ 싀행이 κ°€λŠ₯ν•˜λ‹€.(=ν”Œλž«νΌ 독립적)
  • 단점 : λ‹€λ₯Έ 인터프리터 λ°©μ‹μ˜ μ–Έμ–΄λ³΄λ‹€λŠ” μƒλ‹Ήνžˆ λΉ λ₯Έ μˆ˜ν–‰λŠ₯λ ₯을 λ³΄μ΄μ§€λ§Œ, 일괄 컴파일 방식 μ–Έμ–΄λ³΄λ‹€λŠ” μˆ˜ν–‰ 속도가 λŠλ¦¬λ‹€.

 

++ μΆ”κ°€ λ‚΄μš©

JVM은 JAVAμ–Έμ–΄μ˜ μ–΄λ–€ 것도 μ•Œμ§€λͺ»ν•˜κ³  λ°”μ΄νŠΈμ½”λ“œμΈ .class ν˜•μ‹λ§Œ μ•Œκ³  μžˆλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— μš°λ¦¬κ°€ JavaνŒŒμΌμ„ λ§Œλ“€λ©΄, μžλ°” μ»΄νŒŒμΌλŸ¬λŠ” μžλ°” μ–Έμ–΄λ‘œ μž‘μ„±λœ ν”„λ‘œκ·Έλž¨μ„ λ°”μ΄νŠΈ μ½”λ“œλΌλŠ” νŠΉμˆ˜ν•œ λ°”μ΄λ„ˆλ¦¬ ν˜•νƒœ(.class)둜 λ³€ν™˜ν•œλ‹€. (.class νŒŒμΌμ—λŠ” JVM λͺ…λ Ήμ–΄ λ˜λŠ” λ°”μ΄νŠΈ μ½”λ“œμ™€ 기호 ν‘œ 및 기타 보쑰 정보가 ν¬ν•¨λ˜μ–΄ μžˆλ‹€.)

 

 

 

πŸ“Œ JVM의 νŠΉμ§•

  1. μŠ€νƒ 기반의 가상 λ¨Έμ‹ 
    • λŒ€λ‹€μˆ˜μ˜ λͺ…λ Ήμ–΄κ°€ μŠ€νƒ μ„ λ‘μ—μ„œ ν”Όμ—°μ‚°μžλ₯Ό νƒν•˜κ³  κ²°κ³Όλ₯Ό λ‹€μ‹œ μŠ€νƒμ— λ„£λŠ” λ°©μ‹μœΌλ‘œ μ§„ν–‰ν•œλ‹€.
  2. 심볼릭 레퍼런슀
    • κΈ°λ³Έ μžλ£Œν˜•(primitive data type)을 μ œμ™Έν•œ λͺ¨λ“  νƒ€μž…(클래슀, μΈν„°νŽ˜μ΄μŠ€ λ“±)을 심볼릭 레퍼런슀λ₯Ό 톡해 μ°Έμ‘°ν•œλ‹€. 
    • κΈ°λ³Έμžλ£Œν˜• : boolean, char, byte, short, int, long, float, double
  3. 가비지 μ»¬λ ‰μ…˜
    • μ‚¬μš©μž μ½”λ“œλ₯Ό λͺ…μ‹œμ μœΌλ‘œ μƒμ„±ν•˜κ³  가비지 μ»¬λ ‰μ…˜μ— μ˜ν•΄ μžλ™μœΌλ‘œ 파괴 λœλ‹€.
  4.  λͺ¨λ“  κΈ°λ³Έ μžλ£Œν˜•μ„ λͺ…ν™•ν•˜κ²Œ μ •μ˜ν•˜μ—¬ ν”Œλž«νΌ 독립성 보μž₯
    • C/C++λ“±μ˜ μ–Έμ–΄λŠ” ν”Œλž«νΌμ— 따라 intν˜•μ˜ 크기가 λ³€ν•œλ‹€.
    • JVM은 κΈ°λ³Έ μžλ£Œν˜•μ„ λͺ…ν™•ν•˜κ²Œ μ •μ˜ν•˜μ—¬ ν˜Έν™˜μ„œμ„ μœ μ§€ν•˜κ³  ν”Œλž«νΌ 독립성을 보μž₯ν•œλ‹€.
  5.  λ„€νŠΈμ›Œν¬ λ°”μ΄νŠΈ μ˜€λ”
    • μžλ°” 클래슀 νŒŒμΌμ€ λ„€νŠΈμ›Œν¬ 전솑 μ‹œμ— μ‚¬μš©ν•˜λŠ” λ°”μ΄νŠΈ μ˜€λ”μΈ λ„€νŠΈμ›Œν¬ λ°”μ΄νŠΈ μ˜€λ”λ₯Ό μ‚¬μš©ν•œλ‹€.

 

 

πŸ“Œ JVM(Java Virtural Machine)의 κ΅¬μ„±μš”μ†Œ

 

  1. 클래슀 λ‘œλ” (Class Loader)
    • μ»΄νŒŒμΌλŸ¬μ— μ˜ν•΄ λ§Œλ“€μ–΄μ§„ .class νŒŒμΌμ„ Runtime Data Area둜 μ μž¬ν•˜λŠ” μ—­ν• (=λ©”λͺ¨λ¦¬μ— μ˜¬λ¦¬λŠ” μ—­ν• )을 ν•œλ‹€.
    • loading, linking, initialization 과정을 κ±°μΉœλ‹€.
      • loading : .classνŒŒμΌμ„ μ½μ–΄μ„œ Method Area에 μ €μž₯ν•œλ‹€. (클래슀/μΈν„°νŽ˜μ΄μŠ€/Enumκ³Ό 관련이 μžˆλŠ”μ§€ ν™•μΈν•˜κ³ , λ³€μˆ˜/λ©”μ†Œλ“œ/클래슀의 정보λ₯Ό 가지고 μžˆλ‹€.)
      • linking : class파일의 정확성을 검증(μ‹€νŒ¨ν•˜λ©΄ λŸ°νƒ€μž„μ—λŸ¬)ν•˜κ³ , 클래슀 λ³€μˆ˜μ— λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•˜κ³  μ΄ˆκΈ°ν™”ν•œλ‹€.
      • initialization : staticλ³€μˆ˜ ν• λ‹Ή
  2. Runtime Data Area
    • ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜λŠ” λ™μ•ˆ μ‚¬μš©λ˜λŠ” λ‹€μ–‘ν•œ λŸ°νƒ€μž„ 데이터 μ˜μ—­μ„ μ •μ˜ν•œλ‹€.
    • 데이터 μ˜μ—­μœΌλ‘œλŠ” Method, Heap, Stack, PC register, Native Method Stack이 μ‘΄μž¬ν•œλ‹€.
      • Method Area : 곡유 λ¦¬μ†ŒμŠ€λ‘œ 정적 λ³€μˆ˜, 클래슀 이름, λ©”μ†Œλ“œ 및 λ³€μˆ˜ 정보 μ €μž₯
      • Heap Area : 곡유 λ¦¬μ†ŒμŠ€λ‘œ λͺ¨λ“  개체의 정보가 μ €μž₯
      • Stack Area : μŠ€λ ˆλ“œλ³„λ‘œ μŠ€νƒμ΄ μ‘΄μž¬ν•˜λ©°, 둜컬 λ³€μˆ˜ μ €μž₯
      • PC register : μŠ€λ ˆλ“œμ˜ μ‹€ν–‰ λͺ…λ Ή μ£Όμ†Œ
  3. Execution Engine
    • .classλ₯Ό λ°”μ΄νŠΈ μ½”λ“œλ₯Ό ν•œμ€„μ”© 읽으며 λͺ…λ Ήμ–΄ λ‹¨μœ„λ‘œ μ‹€ν–‰ν•œλ‹€.
      • Interprter 방식 : λ°”μ΄νŠΈ μ½”λ“œλ₯Ό ν•œ 쀄씩 읽고 ν•΄μ„ν•œλ‹€.
      • JIT 방식 : 
  4. 가비지 μ½œλ ‰ν„° (Garbage Collector)
    • Heapλ©”λͺ¨λ¦¬μ— 적재된 객체듀 쀑 μ°Έμ‘°λ˜μ§€ μ•Šμ€ 객체λ₯Ό μ‚­μ œν•œλ‹€.

 

 

πŸ“Œ 컴파일 ν•˜λŠ” 방법

javac "클래슀 이름.java"
μœ„μ™€ 같은 λͺ…λ Ήμ–΄λ₯Ό μž‘μ„±ν•˜λ©΄ 클래슀 이름.class(λ°”μ΄νŠΈν˜•νƒœ)κ°€ λ§Œλ“€μ–΄μ§„λ‹€.

 

μžλ°”μ˜ 컴파일러의 μ—­ν• 

  • μžλ°” μ–Έμ–΄λ₯Ό JVM이 μ΄ν•΄ν•˜λŠ” μžλ°” λ°”μ΄νŠΈμ½”λ“œλ‘œ λ²ˆμ—­ν•œλ‹€. 

 

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

  1. κ°œλ°œμžλ“€μ΄ ideλ‚˜ terminal ν™˜κ²½μ—μ„œ .java νŒŒμΌμ„ μƒμ„±ν•œλ‹€.
  2. buildλΌλŠ” μž‘μ—…μ„ 톡해 .class νŒŒμΌμ„ μƒμ„±ν•˜κ²Œ λœλ‹€.

javac μ˜΅μ…˜

 

 

πŸ“Œ μ‹€ν–‰ν•˜λŠ” 방법

java ν΄λž˜μŠ€μ΄λ¦„.class
classLoaderκ°€ classλ₯Ό Method Area둜 올리고 byteμ½”λ“œκ°€ μ •ν™•ν•œμ§€ ν™•μΈν•œ ν›„ Execution Engineμ—μ„œ μ‹€ν–‰λœλ‹€.

 

 

πŸ“Œ λ°”μ΄νŠΈμ½”λ“œλž€ 무엇인가

μ•žμ„œ λ§ν–ˆλ“―μ΄ JVM은 ν”Œλž«νΌμ— 쒅속적이지 μ•Šκ³ , μ–΄λŠ κ³³μ—μ„œλ‚˜ λ™μž‘ν•  수 μžˆλ‹€.
JVM이 ν”Œλž«νΌ 쒅속적이지 μ•ŠλŠ” κ°€μž₯ 큰 μ΄μœ κ°€ λ°”μ΄νŠΈμ½”λ“œλ₯Ό μ‚¬μš©ν•˜κ³  μžˆλ‹€λŠ” 점이닀.

JVM이 이해할 수 μžˆλŠ” μ–Έμ–΄λ‘œ λ³€ν™˜λœ λ°”μ΄νŠΈ μ½”λ“œλŠ” μ‚¬μš©μž 언어인 μžλ°”μ™€ 기계어 μ‚¬μ΄μ˜ 쀑간 언어이며, μžλ°” μ½”λ“œλ₯Ό λ°°ν¬ν•˜λŠ” κ°€μž₯ μž‘μ€ λ‹¨μœ„μ΄λ‹€.

 

 

 

πŸ“Œ JIT 컴파일러? μ–΄λ–»κ²Œ λ™μž‘ν• κΉŒ?

JIT(Just In Time) κ°€ λ‚˜μ˜€κ²Œ 된 λ°°κ²½

ν΄λž˜μŠ€νŒŒμΌμ„ μ‹€ν–‰ν•˜λŠ” λ°©λ²•μœΌλ‘œ Interpreter방식이 μžˆλ‹€. κ·ΈλŸ¬λ‚˜, ν•˜λ‚˜μ˜ 방법을 μ—¬λŸ¬ 번 ν˜ΈμΆœν•  경우 맀번 해석이 ν•„μš”ν•˜μ—¬ μ‹€ν–‰ 속도가 λŠλ¦¬λ‹€λŠ” 단점이 μžˆλ‹€.

μ΄λŸ¬ν•œ 단점을 κ·Ήλ³΅ν•˜κΈ° μœ„ν•΄/컴파일러의 νš¨μœ¨μ„±μ„ 높이기 μœ„ν•΄ JITμ»΄νŒŒμΌλŸ¬κ°€ λ‚˜μ™”λ‹€.

 

JIT(Just In Time) λž€?

λ°”μ΄νŠΈμ½”λ“œ 전체(.class 파일)λ₯Ό μ»΄νŒŒμΌν•˜μ—¬ λ„€μ΄ν‹°λΈŒ μ½”λ“œλ‘œ λ³€κ²½ν•œλ‹€.

인터프리터가 λ°˜λ³΅λ˜λŠ” λ©”μ„œλ“œ ν˜ΈμΆœμ„ λ³Ό λ•Œλ§ˆλ‹€ JIT μ»΄νŒŒμΌλŸ¬κ°€ ν•΄λ‹Ή 뢀뢄에 λŒ€ν•΄ 직접 λ„€μ΄ν‹°λΈŒ μ½”λ“œλ₯Ό μ œκ³΅ν•˜μ—¬ μž¬ν•΄μ„μ΄ ν•„μš”ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ νš¨μœ¨μ„±μ΄ ν–₯μƒλœλ‹€.

 

cf) λ„€μ΄ν‹°λΈŒ μ–Έμ–΄λž€?

 

πŸ“Œ JDK와 JRE의 차이

좜처 : https://sangwoo0727.github.io/java/JAVA-2_jdk/

 

JDK(Java Developement kit)

μžλ°” ν™˜κ²½μ—μ„œ λŒμ•„κ°€λŠ” ν”„λ‘œκ·Έλž¨μ„ κ°œλ°œν•˜λŠ” 데 ν•„μš”ν•œ 툴(JRE, 컴파일러, 디버거)듀을 λͺ¨μ•„λ‘” μ†Œν”„νŠΈμ›¨μ–΄ νŒ¨ν‚€μ§€

 

JRE(Java Runtime Environment)

JREλŠ” μžλ°” μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•œ SW라고 λ³Ό 수 μžˆλ‹€.

  • μžλ°” νŒŒμΌμ„ JVM으둜 λ‘œλ”©μ‹œν‚€λŠ” μ—­ν• 
  • JVM은 μžλ°”νŒŒμΌμ„ ν•΄μ„ν•΄μ„œ μ‹€ν–‰ν•  수 μžˆλŠ” μƒνƒœλ‘œ λ§Œλ“€μ–΄μ€€λ‹€.
  • jreλŠ” μžλ°” ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜κΈ° μœ„ν•œ μ΅œμ†Œν™˜κ²½ = javaνŒŒμΌμ„ μ‹€ν–‰λ§Œ μ‹œν‚¬ 것이라면 jre만 μžˆμ–΄λ„ κ°€λŠ₯ν•˜λ‹€.
  • runtine environment은 λ‹€λ₯Έ μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•΄ κ³ μ•ˆλ˜λŠ” μΌμ’…μ˜ μ†Œν”„νŠΈμ›¨μ–΄μž„

 

μžλ°” μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•˜κΈ° μœ„ν•΄μ„œ
JDKλ₯Ό ν•„μˆ˜λ‘œ μ„€μΉ˜ν•΄μ•Όν•œλ‹€.

 

 

좜처

d2.naver.com/helloworld/1230

- oracle JVM : docs.oracle.com/javase/specs/jvms/se7/html/jvms-1.html#jvms-1.1

- How JVM work : https://www.geeksforgeeks.org/jvm-works-jvm-architecture/

- JDK 와 JRE의 차이 :  https://www.geeksforgeeks.org/differences-jdk-jre-jvm/

- μœ„ν‚€λ°±κ³Ό μžλ°” : https://ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94_(%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D_%EC%96%B8%EC%96%B4) 

- μœ„ν‚€λ°±κ³Ό JVM : ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94_%EA%B0%80%EC%83%81_%EB%A8%B8%EC%8B%A0

LIST