# JVM(Java Virtual Machine)

written by sohyeon, hyemin πŸ’‘


# 1. JVM(Java Virtual Machine)

  • JVM은 μžλ°”λ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•œ 가상 컴퓨터(μ‹€μ œ 컴퓨터가 μ•„λ‹Œ μ†Œν”„νŠΈμ›¨μ–΄λ‘œ κ΅¬ν˜„ν•œ 것)이닀.

  • JVM은 JAVA와 OS μ‚¬μ΄μ—μ„œ μ€‘κ°œμž 역할을 μˆ˜ν–‰ν•˜μ—¬ JAVAκ°€ OS에 독립적 이며, μž¬μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€.

    • μžλ°” μ‘μš©ν”„λ‘œκ·Έλž¨μ€ OSκ°€ μ•„λ‹Œ JVMκ³Ό ν†΅μ‹ ν•˜κ³ , JVM은 μžλ°” μ‘μš©ν”„λ‘œκ·Έλž¨μœΌλ‘œλΆ€ν„° 전달받은 λͺ…령을 ν•΄λ‹Ή OSκ°€ 이해할 수 μžˆλ„λ‘ λ³€ν™˜ν•˜μ—¬ μ „λ‹¬ν•œλ‹€.
  • JVM은 λ©”λͺ¨λ¦¬ 관리 와 Garbage Collection 을 μˆ˜ν–‰ν•œλ‹€.


# 2. JVM의 ꡬ쑰

# Class Loader(클래슀 λ‘œλ”)

μžλ°” 컴파일러λ₯Ό μ‚¬μš©ν•΄μ„œ .java νŒŒμΌμ„ .class(λ°”μ΄νŠΈμ½”λ“œ) 파일둜 μ»΄νŒŒμΌν•¨. 이후, Class Loaderλ₯Ό 톡해 JVM에 .class νŒŒμΌμ„ λ‘œλ“œν•˜κ³ , 링크λ₯Ό 톡해 λ°°μΉ˜ν•˜λŠ” μž‘μ—…μ„ μˆ˜ν–‰ν•œλ‹€.

# Execution Engine(μ‹€ν–‰ 엔진)

.classνŒŒμΌμ„ μ‹€ν–‰μ‹œν‚€λŠ” μ—­ν• . 클래슀 λ‘œλ”κ°€ JVM λ‚΄μ˜ Runtime Data Area에 .class(λ°”μ΄νŠΈμ½”λ“œ) λ₯Ό λ°°μΉ˜ν•˜κ³ , 이λ₯Ό μ‹€ν–‰ 엔진에 μ˜ν•΄ μ‹€ν–‰λœλ‹€.

  • Interpreter
    λ°”μ΄νŠΈ μ½”λ“œλ₯Ό λͺ…λ Ήμ–΄ λ‹¨μœ„λ‘œ μ½μ–΄μ„œ μ‹€ν–‰ν•˜λŠ” 인터프리터. ν•œ 쀄씩 μˆ˜ν–‰ν•˜κΈ° λ•Œλ¬Έμ— λŠλ¦¬λ‹€λŠ” 단점이 μžˆλ‹€.

  • JIT compiler(Just - In - Time)
    JIT μ»΄νŒŒμΌλŸ¬λŠ” 인터프리터 λ°©μ‹μ˜ 단점을 λ³΄μ™„ν•˜κΈ° μœ„ν•΄ λ„μž…ν–ˆλ‹€.
    인터프리터 λ°©μ‹μœΌλ‘œ μ‹€ν–‰ν•˜λ‹€κ°€ μ μ ˆν•œ μ‹œμ μ— λ°”μ΄νŠΈ μ½”λ“œ 전체λ₯Ό μ»΄νŒŒμΌν•˜μ—¬ λ„€μ΄ν‹°λΈŒ μ½”λ“œλ‘œ λ³€κ²½ν•˜κ³ , μ΄ν›„μ—λŠ” λ„€μ΄ν‹°λΈŒ μ½”λ“œλ₯Ό 직접 μ‹€ν–‰ν•˜λŠ” 방식이닀.
    단, JIT μ»΄νŒŒμΌλŸ¬κ°€ μ»΄νŒŒμΌν•˜λŠ” 과정은 λ°”μ΄νŠΈ μ½”λ“œλ₯Ό μΈν„°ν”„λ¦¬νŒ…ν•˜λŠ” 것보닀 훨씬 였래 κ±Έλ¦¬λ―€λ‘œ, JIT 컴파일러λ₯Ό μ‚¬μš©ν•˜λŠ” JVM은 λ‚΄λΆ€μ μœΌλ‘œ ν•΄λ‹Ή λ©”μ„œλ“œκ°€ μ–Όλ§ˆλ‚˜ 자주 μˆ˜ν–‰λ˜λŠ”μ§€ ν™•μΈν•˜μ—¬, 일정 정도λ₯Ό λ„˜μ„ λ•Œμ—λ§Œ μ»΄νŒŒμΌμ„ μˆ˜ν–‰ν•œλ‹€.

# GC(Garbage Collector)

GCλŠ” 동적 ν• λ‹Ήλœ λ©”λͺ¨λ¦¬ μ˜μ—­(heap) μ€‘μ—μ„œ 더 이상 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” μ˜μ—­μ„ νƒμ§€ν•˜μ—¬ μžλ™μœΌλ‘œ ν•΄μ§€ν•˜λŠ” κΈ°λ²•μœΌλ‘œ, ν”„λ‘œκ·Έλž˜λ¨Έκ°€ λ©”λͺ¨λ¦¬λ₯Ό λ”°λ‘œ κ΄€λ¦¬ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.

# Runtime Data Area

μžλ°” ν”„λ‘œκ·Έλž¨μ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ OSμ—μ„œ ν• λ‹Ή 받은 λ©”λͺ¨λ¦¬ 곡간을 μ˜λ―Έν•œλ‹€.

  • PC Register
    JVM은 μŠ€νƒ 기반의 λ°©μ‹μœΌλ‘œ μž‘λ™ν•˜λŠ”λ°, CPU에 직접 Instuction을 μˆ˜ν–‰ν•˜μ§€ μ•Šκ³ , μŠ€νƒμ—μ„œ Operand(μ£Όμ†Œ)λ₯Ό 뽑아 이λ₯Ό λ³„λ„μ˜ λ©”λͺ¨λ¦¬ 곡간(PC Register)에 μ €μž₯ν•œλ‹€.
    λ”°λΌμ„œ, ν˜„μž¬μ˜ μ–΄λ–€ λͺ…령을 μ‹€ν–‰ν•΄μ•Όν•  지에 λŒ€ν•œ 뢀뢄을 κΈ°λ‘ν•œλ‹€.

  • JVM stack
    ν”„λ‘œκ·Έλž¨ μ‹€ν–‰κ³Όμ •μ—μ„œ 호좜된 λ©”μ„œλ“œμ˜ νŒŒλΌλ―Έν„°, 지역 λ³€μˆ˜, 리턴 κ°’ 및 μ—°μ‚° κ°’ 등이 μž„μ‹œλ‘œ μ €μž₯λ˜λŠ” μ˜μ—­μ΄λ‹€.

  • Native Method stack
    μžλ°” ν”„λ‘œκ·Έλž¨μ΄ μ»΄νŒŒμΌλ˜μ–΄ μƒμ„±λ˜λŠ” λ°”μ΄νŠΈ μ½”λ“œκ°€ μ•„λ‹Œ μ‹€μ œ μ‹€ν–‰ν•  수 μžˆλŠ” κΈ°κ³„μ–΄λ‘œ μž‘μ„±λœ ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰μ‹œν‚€λŠ” μ˜μ—­μ΄λ‹€.
    JAVA Native Interfaceλ₯Ό 톡해 λ°”μ΄νŠΈ μ½”λ“œλ‘œ μ „ν™˜ν•˜μ—¬ μ €μž₯ν•œλ‹€.

  • Heap
    GC의 λŒ€μƒμ΄ λ˜λŠ” μ˜μ—­. ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 쀑 μƒμ„±λ˜λŠ” μΈμŠ€ν„΄μŠ€(new μ—°μ‚°μž)λŠ” λͺ¨λ‘ Heap μ˜μ—­μ— μƒμ„±λœλ‹€.
    즉, μΈμŠ€ν„΄μŠ€λ³€μˆ˜(instance variable)듀이 μƒμ„±λ˜λŠ” 곡간이닀.

  • Method Area
    ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 쀑 μ–΄λ–€ ν΄λž˜μŠ€κ°€ μ‚¬μš©λ˜λ©΄, JVM은 ν•΄λ‹Ή 클래슀의 클래슀파일(*.class)을 μ½μ–΄μ„œ λΆ„μ„ν•˜μ—¬ ν΄λž˜μŠ€μ— λŒ€ν•œ 정보(클래슀 데이터)λ₯Ό 이곳에 μ €μž₯ν•œλ‹€.
    이 λ•Œ, κ·Έ 클래슀의 ν΄λž˜μŠ€λ³€μˆ˜(class variable)도 Method Area(λ©”μ„œλ“œ μ˜μ—­)에 ν•¨κ»˜ μƒμ„±λœλ‹€.


# Question

  • JVM의 νŠΉμ§•μ„ μ„€λͺ…ν•˜μ‹œμ˜€.
  • JVM의 ꡬ쑰λ₯Ό μ„€λͺ…ν•˜μ‹œμ˜€.
  • μžλ°” ν”„λ‘œκ·Έλž¨μ˜ μ‹€ν–‰ 과정을 μ„€λͺ…ν•˜μ‹œμ˜€.
  • GC에 λŒ€ν•΄ μ„€λͺ…ν•˜μ‹œμ˜€.

# Reference & Additional Resources

Last Updated: 12/5/2020, 11:36:44 AM