Skip to content

Latest commit

Β 

History

History
71 lines (50 loc) Β· 4.19 KB

File metadata and controls

71 lines (50 loc) Β· 4.19 KB

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