[Java] - JVM

Java

λŒ€ν•™κ΅μ—μ„œ 처음 Javaλ₯Ό 곡뢀할 λ•Œ λ“€μ—ˆλ˜ μ΄μ•ΌκΈ°λŠ” WORA(Write Once Run Anywhere)λΌλŠ” λ‚΄μš©μ΄λ‹€. μ†”μ§νžˆ μš”μ¦˜ 세상에 μ–΄λ–€ μ–Έμ–΄λ‘œ μž‘μ„±ν•˜λ˜ μ–΄λ””μ„œλ“  돌릴 수 μžˆλ‹€κ³  μƒκ°ν–ˆλ‹€.

이 뢀뢄을 λŒ€ν•΄μ„œ μžμ„Ένžˆ μ•ŒκΈ° μœ„ν•΄μ„œλŠ” Compile, Interpretedλ₯Ό μ•Œμ•„μ•Όν•œλ‹€.

Compile

μš°λ¦¬κ°€ ν”νžˆ 컴파일 νƒ€μž„μ΄λΌκ³  λΆ€λ₯΄λŠ” 이 μš©μ–΄λŠ” ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ‘œ μ½”λ“œλ₯Ό μž‘μ„±ν•œ λ’€, μ‹€ν–‰ν•˜κΈ° 전에 미리 컴퓨터가 읽을 수 μžˆλŠ” μ–Έμ–΄λ‘œ λ²ˆμ—­ μž‘μ—…μ„ ν•΄λ‘λŠ” 것을 μ˜λ―Έν•œλ‹€.

public class Post {
    
    private String title, content;
    
    public Post() {
        
    }

}

μœ„μ™€ 같이 κ°„λ‹¨ν•œ μ½”λ“œκ°€ 컴파일 되면 μ•„λž˜μ™€ 같은 λ°”μ΄νŠΈ μ½”λ“œλ‘œ λ³€ν™˜λœλ‹€.

// class version 61.0 (61)
// access flags 0x21
public class ka/Post {

  // compiled from: Post.java

  // access flags 0x2
  private Ljava/lang/String; title

  // access flags 0x2
  private Ljava/lang/String; content

  // access flags 0x1
  public <init>()V
   L0
    LINENUMBER 10 L0
    ALOAD 0
    INVOKESPECIAL java/lang/Object.<init> ()V
    RETURN
   L1
    LOCALVARIABLE this Lka/chapter3/item10/consistency/Post; L0 L1 0
    MAXSTACK = 1
    MAXLOCALS = 1
}

μ‹€μ œλ‘œ μš°λ¦¬κ°€ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•  λ•ŒλŠ” 이 λ°”μ΄νŠΈ μ½”λ“œλ₯Ό ν† λŒ€λ‘œ μ‹€ν–‰ν•˜κ²Œ λœλ‹€.

즉, 컴파일 과정을 톡해 μš°λ¦¬κ°€ μž‘μ„±ν•œ μ½”λ“œμ˜ μ–΄λ–€ λ¬Έμ œκ°€ μžˆλŠ”μ§€ 확인할 수 있고, 컴퓨터가 읽을 수 μžˆλŠ” μ–Έμ–΄λ‘œ μž‘μ„±ν–ˆκΈ° λ•Œλ¬Έμ— μ‹€ν–‰ 속도도 λΉ λ₯Έ 것이닀!

Interpreted

InterpretedλŠ” 컴파일과 λ‹€λ₯΄κ²Œ μž‘μ„±ν•œ μ½”λ“œλ₯Ό κ·ΈλŒ€λ‘œ κ°–κ³  μžˆλ‹€κ°€ 싀행을 μ‹œν‚¬ λ•Œ, μ‹€μ‹œκ°„μœΌλ‘œ μ½μ–΄μ£Όλ©΄μ„œ 일을 μ‹œν‚€λŠ” 언어이닀.

κ°œλ°œμ—λŠ” 더 κ°„νŽΈν•  수 μžˆμ§€λ§Œ, 였λ₯˜μ— μ·¨μ•½ν•˜κ³ , 싀행이 λŠλ¦¬λ‹€λŠ” 단점이 μžˆλ‹€.

JVM(Java Virtual Machine)

μœ„μ—μ„œ λ³Έ 것과 같이 컴퓨터 OS μ’…λ₯˜λ§ˆλ‹€ μ“°λŠ” 기계 μ–Έμ–΄κ°€ λ‹€ λ‹€λ₯΄λ‹€. Window ν™˜κ²½μ—μ„œ Cμ–Έμ–΄λ‘œ μž‘μ„±λœ λ°”μ΄νŠΈ μ½”λ“œλŠ” Mac, Linux ν™˜κ²½μ—μ„œ λŒλ¦¬μ§€ λͺ»ν•œλ‹€.

Mac, LinuxλŠ” λͺ¨λ‘ UNIX 기반의 μš΄μ˜μ²΄μ œμ΄λ‹€. λ•Œλ¬Έμ— λŒ€λΆ€λΆ„ ν˜Έν™˜μ΄ κ°€λŠ₯ν•˜μ§€λ§Œ, 운영 μ²΄μ œμ™€ λ§žμ§€ μ•ŠλŠ” 라이브러리λ₯Ό μ‚¬μš©ν•  경우 ν˜Έν™˜λ˜μ§€ μ•Šμ„ 수 μžˆλ‹€.

ν•˜μ§€λ§Œ JavaλŠ” C와 같은 언어와 달리 JVM을 톡해 μ–΄λ””μ„œλ“  μ‹€ν–‰ν•  수 μžˆλ‹€.

μš°λ¦¬κ°€ ν”„λ‘œκ·Έλž¨μ„ μ„€μΉ˜ν•  λ•Œ, 운영 μ²΄μ œμ— λ§žλŠ” ν”„λ‘œκ·Έλž¨μ„ μ„€μΉ˜ν•˜λŠ” κ²ƒμ²˜λŸΌ Java λ˜ν•œ 운영 μ²΄μ œμ— 맞게 μ„€μΉ˜λ₯Ό ν•œλ‹€. λ•Œλ¬Έμ— JVM은 ν˜„μž¬ μš΄μ˜μ²΄μ œμ— λ§žλŠ” 기계 언어와 μžλ°” λ°”μ΄νŠΈ μ½”λ“œ μ–Έμ–΄λ₯Ό ν•  수 μžˆμ–΄ WORAκ°€ κ°€λŠ₯해진 것이닀.

Runtime

그러면 컴파일 된 λ°”μ΄νŠΈ μ½”λ“œλŠ” μ–΄λ–€ 과정을 톡해 싀행이 될까?

![image](https://github.com/Jwhyee/Jwhyee.github.io/assets/82663161/0d99ebc8-8cb5-48f8-ac8f-727ee7563a1a)
  1. JVM이 OSλ‘œλΆ€ν„° μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ 싀행을 μœ„ν•΄ ν•„μš”λ‘œν•˜λŠ” λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ή λ°›μŒ
  2. JVM은 이 λ©”λͺ¨λ¦¬λ₯Ό μš©λ„μ— 따라 μ—¬λŸ¬ μ˜μ—­μœΌλ‘œ λ‚˜λˆ„μ–΄ 관리함
  3. μ»΄νŒŒμΌλŸ¬κ°€ μš°λ¦¬κ°€ μž‘μ„±ν•œ μžλ°” νŒŒμΌμ„ 읽어 클래슀 파일(λ°”μ΄νŠΈμ½”λ“œ)둜 λ³€ν™˜ν•¨
  4. λ³€κ²½λœ 클래슀 파일(λ°”μ΄νŠΈ μ½”λ“œ)듀을 클래슀 λ‘œλ”λ₯Ό 톡해 JVM λ©”λͺ¨λ¦¬ μ˜μ—­μœΌλ‘œ λ‘œλ”©ν•¨
  5. λ‘œλ”©λœ 클래슀 파일(λ°”μ΄νŠΈ μ½”λ“œ)듀은 Execution Engine을 톡해 해석함
  6. ν•΄μ„λœ λ„€μ΄ν‹°λΈŒ μ½”λ“œλ₯Ό λ©”λͺ¨λ¦¬ μ˜μ—­μ— λ°°μΉ˜ν•˜κ³ , μ½”λ“œλ₯Ό μˆ˜ν–‰ν•¨

JIT Compiler

JITμ΄λž€, Just In Time의 μ•½μžλ‘œ ν”„λ‘œκ·Έλž¨μ„ μ‹€μ œ μ‹€ν–‰ν•˜λŠ” μ‹œμ μ— λ²ˆμ—­ν•˜λŠ” 컴파일 기법이닀.

μ•žμ„œ μ„€λͺ…ν•œ κ³Όμ •κ³Ό 같이 클래슀 λ‘œλ”λ₯Ό 톡해 JVM λ©”λͺ¨λ¦¬ μ˜μ—­μœΌλ‘œ λ‘œλ”©ν•˜κ²Œ λœλ‹€. 이후, μ‹€μ œ λ©”λͺ¨λ¦¬ μ˜μ—­μ— λ°°μΉ˜ν•˜κΈ° μ „ λ„€μ΄ν‹°λΈŒ μ½”λ“œλ‘œ λ²ˆμ—­ν•΄ 컴퓨터가 읽을 수 μžˆλ„λ‘ ν•˜λŠ” 것이닀.

![image](https://github.com/Jwhyee/Jwhyee.github.io/assets/82663161/8da19493-c277-48c1-aca5-f34b5b582967)

JRE(Java Runtime Environment)

JREλŠ” μžλ°” μ‹€ν–‰ ν™˜κ²½μ˜ μ•½μžμ΄λ‹€. JVM이 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰κ³Ό 관련이 μžˆμœΌλ―€λ‘œ, JRE 내뢀에 μ†ν•΄μžˆλ‹€. 이 외에도 μš°λ¦¬κ°€ ν”νžˆ μ‚¬μš©ν•˜λŠ” utilμ΄λ‚˜ math λ“±κ³Ό 같은 ν‘œμ€€ 라이브러리λ₯Ό ν¬ν•¨ν•˜κ³  μžˆλ‹€.

java.util.*;
java.math.*;

JDK(Java Development Kit)

JDKλŠ” μžλ°” 개발 ν‚€νŠΈμ˜ μ•½μžμ΄λ‹€. μš°λ¦¬κ°€ μžλ°” μ–Έμ–΄λ₯Ό κ°œλ°œν•  수 μžˆλŠ” μ΄μœ κ°€ JDK 덕뢄이닀.

JDKλŠ” κ°œλ°œμ„ ν•  수 μžˆμ–΄μ•Όν•˜κ³ , μ‹€ν–‰κΉŒμ§€ ν•΄μ•Όν•  수 μžˆμ–΄μ•Όν•˜κΈ° λ•Œλ¬Έμ— μ•„λž˜μ™€ 같은 μš”μ†Œλ“€μ΄ ν¬ν•¨λ˜μ–΄ μžˆλ‹€.

  • Compiler : μš°λ¦¬κ°€ μž‘μ„±ν•œ μžλ°” μ½”λ“œλ₯Ό λ°”μ΄νŠΈ μ½”λ“œλ‘œ λ³€ν™˜ν•΄μ€Œ
  • JRE : ν‘œμ€€ λΌμ΄λΈŒλŸ¬λ¦¬μ™€ JVM을 톡해 μ½”λ“œλ₯Ό μ‹€ν–‰ν•  수 μžˆλ„λ‘ ν•΄μ€Œ
  • Debuger : μ½”λ“œ μ‹€ν–‰ 흐름을 ν•˜λ‚˜ν•˜λ‚˜ 확인할 수 있게 λ„μ™€μ€Œ
  • JAR : μ‹€ν–‰ν•  수 μžˆλ„λ‘ μ••μΆ•ν•΄μ€Œ

μ΄λŸ¬ν•œ μš”μ†Œλ“€μ„ ν™œμš©ν•΄ μš°λ¦¬κ°€ μžλ°” ν”„λ‘œκ·Έλž¨μ„ 개발, ν…ŒμŠ€νŠΈ, μ‹€ν–‰κΉŒμ§€ ν•  수 있게 λ˜λŠ” 것이닀.

Reference

νƒœκ·Έ:

μΉ΄ν…Œκ³ λ¦¬:

μ—…λ°μ΄νŠΈ:

λŒ“κΈ€λ‚¨κΈ°κΈ°