JVM(Java Virtual Machine)

January 8, 2023์— ์ž‘์„ฑ

๊ฐ€์ƒ ๋จธ์‹ (Virtual Machine)

์•ˆ์—์„œ ๋Œ์•„๊ฐ€๋Š” ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ๊ฐ€์ƒ๋จธ์‹ ์ด ์ œ๊ณตํ•˜๋Š” ํ™˜๊ฒฝ๊ณผ ์ž์›์— ์ œํ•œ์„ ๋ฐ›์œผ๋ฉฐ ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ๋ฒ—์–ด๋‚  ์ˆ˜ ์—†๋‹ค.

  • System Virtual Machine
    • ์™„์ „ํ•œ OS ์‹คํ–‰์„ ์ง€์›.
    • ๊ฐ™์€ ์ปดํ“จํ„ฐ ๋‚ด์—์„œ ์—ฌ๋Ÿฌ ์šด์˜์ฒด์ œ๋ฅผ ๋Œ๋ฆด ์ˆ˜ ์žˆ๋‹ค.
  • Process Virtual Machine
    • ๋‹จ์ผ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ง€์›
    • ํ”Œ๋žซํผ์— ๋…๋ฆฝ์ ์ธ ์‹คํ–‰ํ™˜๊ฒฝ๊ณผ ์ถ”์ƒํ™”๋ฅผ ์ œ๊ณตํ•˜์—ฌ ํ•˜๋‚˜์˜ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•œ๋‹ค.
    • JVM์ด ์ด๋Ÿฐ ๊ฒฝ์šฐ๋‹ค. (C#์˜ CLR๋„ ๋งˆ์ฐฌ๊ฐ€์ง€)

JVM?

JVM์€ ๋ช…์„ธ์ด๋‹ค. ์ด ๋ช…์„ธ๋ฅผ ๋”ฐ๋ฅธ ๊ตฌํ˜„์ฒด๋“ค์ด ๋”ฐ๋กœ ์กด์žฌํ•œ๋‹ค. (HotSpot VM ๋“ฑ๋“ฑ)

JVM Architecture

Java๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋Š” Compiler๊ฐ€ ๋ฐ”์ดํŠธ ์ฝ”๋“œ(.class ํŒŒ์ผ) ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , JRE์— ์†ํ•œ JVM์ด ์ด ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ JIT ์ปดํŒŒ์ผํ•˜์—ฌ ์‹คํ–‰๋œ๋‹ค.

  • JDK (Java Development Kit)
    • JRE๋ฅผ ํฌํ•จํ•˜๋ฉฐ, ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ์ปดํŒŒ์ผ๋Ÿฌ๋‚˜ ๋””๋ฒ„๊ฑฐ๋„ ๊ฐ™์ด ์ œ๊ณต๋œ๋‹ค.
  • JRE (Java Runtime Environment)

๊ตฌ์„ฑ ์š”์†Œ

Class Loader

Loading

1. ํด๋ž˜์Šค ์ •๋ณด๋ฅผ ์ฝ์–ด์˜จ๋‹ค.

  • โ€˜.classโ€™ ํŒŒ์ผ์„ ์ฝ์œผ๋ฉด, ๊ด€๋ จ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ method area์— ์ €์žฅํ•œ๋‹ค.
  • method area์— ์ €์žฅ๋˜๋Š” ์ •๋ณด๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค
    • ํŒจํ‚ค์ง€ ๋ช…์ด ์ „๋ถ€ ํฌํ•จ๋œ ํด๋ž˜์Šค ๊ฒฝ๋กœ(Fully Qualified Name), ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๋ถ€๋ชจ ํด๋ž˜์Šค
    • โ€˜.classโ€™ํŒŒ์ผ์ด Class์ธ์ง€, Interface์ธ์ง€ Enum์ธ์ง€ ์—ฌ๋ถ€
    • ์ ‘๊ทผ ํ•œ์ •์ž(private, public โ€ฆ)์™€ ๋ฉ”์„œ๋“œ ์ •๋ณด ๋“ฑ

JVM์ด ํด๋ž˜์Šค๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” 3๊ฐ€์ง€ ๋กœ๋”๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. Bootstrap ClassLoader
    • ์ตœ์ƒ์œ„ ClassLoader์ด๋‹ค. ์ด ๋กœ๋”๊ฐ€ JARํŒŒ์ผ์ด๋‚˜ $JAVA_HOME/jre/lib ๊ฒฝ๋กœ์˜ ์ฝ”์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ํŒจํ‚ค์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.
  2. Extension ClassLoader
    • Bootstrap ํด๋ž˜์Šค ๋กœ๋”์˜ ํ•˜์œ„ ํด๋ž˜์Šค์ด๊ณ , Application ClassLoader์˜ ์ƒ์œ„ ํด๋ž˜์Šค์ด๋‹ค.
    • $JAVA_HOME/jre/lib/ext ๊ฒฝ๋กœ์—์„œ ํŒจํ‚ค์ง€ ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.
  3. Application ClassLoader
    • ์ด ํด๋ž˜์Šค๋กœ๋”๋Š” classpath์˜ ํŒŒ์ผ๋“ค์„ ๋ถˆ๋Ÿฌ์˜จ๋‹ค. (๊ธฐ๋ณธ ๊ฒฝ๋กœ๊ฐ’์€ ํ˜„์žฌ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋””๋ ‰ํ† ๋ฆฌ)
    • ํด๋ž˜์Šค๋ฅผ ๋ชป ์ฐพ์œผ๋ฉด ClassNotFoundError๋ฅผ ๋˜์ง„๋‹ค.

2. ์ •๋ณด๋ฅผ ์ฝ์–ด์˜จ ํ›„์—” ํด๋ž˜์Šค ํƒ€์ž…์˜ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

  • JVM์ด ํด๋ž˜์Šค๋ฅผ ์ฒ˜์Œ ๋กœ๋”ฉํ•ด์˜ค๋ฉด JVM์€ java.lang ํŒจํ‚ค์ง€์— ์ •์˜๋œ Class ํด๋ž˜์Šค์—์„œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • ์ด ํด๋ž˜์Šค ์˜ค๋ธŒ์ ํŠธ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ํด๋ž˜์Šค๋“ค์˜ ์ •๋ณด(ํด๋ž˜์Šค๋ช…, ๋ถ€๋ชจ ํด๋ž˜์Šค๋ช…, ๋ฉ”์„œ๋“œ๋‚˜ ๋ณ€์ˆ˜ ์ •๋ณด ๋“ฑ)๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํด๋ž˜์Šค๋งˆ๋‹ค ํ•˜๋‚˜์˜ ์˜ค๋ธŒ์ ํŠธ๋งŒ ์กด์žฌํ•˜๋„๋ก ๊ด€๋ฆฌ๋œ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ์ด โ€˜Classโ€™ํƒ€์ž… ์˜ค๋ธŒ์ ํŠธ๋Š” ํž™์— ์ €์žฅ๋œ๋‹ค.

Linking

1. Verification

  • .classํŒŒ์ผ์„ ๋กœ๋”ฉํ•ด์˜ฌ ๋•Œ, bytecode verifier๋ผ๋Š” ํ”„๋กœ๊ทธ๋žจ์ด .classํŒŒ์ผ์„ ๊ฒ€์ฆํ•œ๋‹ค.
    • ์œ ํšจํ•œ ์ปดํŒŒ์ผ๋Ÿฌ๋กœ ์ปดํŒŒ์ผ ๋œ ๊ฒƒ์ธ์ง€.
    • ์˜ฌ๋ฐ”๋ฅธ ๊ตฌ์กฐ, ํฌ๋งท์ธ์ง€.
  • verification์ค‘ ํ•˜๋‚˜๋ผ๋„ ์‹คํŒจํ•˜๋ฉด JVM์€ verifier exception ์—๋Ÿฌ๋ฅผ ๋Ÿฐํƒ€์ž„์— ๋˜์ง„๋‹ค.

2. Preparation

  • ๋งŒ์•ฝ ํด๋ž˜์Šค๊ฐ€ instance level์ด๊ฑฐ๋‚˜ static ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™” ์‹œํ‚จ๋‹ค. (์„ค์ •ํ•ด๋‘” ์ดˆ๊ธฐ๊ฐ’์ด ์•„๋‹˜)
  • ex. boolean โ†’ false, int โ†’ 0, ์ด๋Ÿฐ ์‹.

3. Resolution

  • ์ฐธ์กฐ ๋ณ€์ˆ˜๋“ค์„ ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.

Initialization

์ฝ”๋“œ๋กœ ์„ค์ •ํ•œ ์ดˆ๊ธฐ๊ฐ’๋“ค์ด ์—ฌ๊ธฐ์„œ ํ• ๋‹น๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํด๋ž˜์Šค์˜ ์ •์  ์˜์—ญ๋“ค์ด ์‹คํ–‰๋œ๋‹ค.

Memory Area (= Runtime Data Area)

  • Method Area
    • ๋ชจ๋“  ํด๋ž˜์Šค ์ •๋ณด. (method data, constructor details โ€ฆ)
    • JVM๋งˆ๋‹ค ํ•˜๋‚˜๊ฐ€ ์กด์žฌํ•˜๋ฉฐ, ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋“ค๊ณผ ๊ณต์œ ๋˜๋Š” ๊ณต๊ฐ„์ด๋‹ค.
  • Heap
    • ๋ชจ๋“  ์˜ค๋ธŒ์ ํŠธ, static ๋ณ€์ˆ˜(JAVA 8๋ถ€ํ„ฐ ์ ์šฉ)
    • JVM๋งˆ๋‹ค ํ•˜๋‚˜๊ฐ€ ์กด์žฌํ•˜๋ฉฐ, ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋“ค๊ณผ ๊ณต์œ ๋˜๋Š” ๊ณต๊ฐ„์ด๋‹ค.
  • Stack
    • ํ•จ์ˆ˜ ํ˜ธ์ถœ๋งˆ๋‹ค ์Œ“์ž„. ๋กœ์ปฌ ๋ณ€์ˆ˜๋“ค์ด ์ €์žฅ๋œ๋‹ค.
    • ๊ฐ ์Šค๋ ˆ๋“œ๋งˆ๋‹ค ์กด์žฌํ•˜๋ฉฐ, ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ํ•ด๋‹น ์˜์—ญ๋„ ์ œ๊ฑฐ๋œ๋‹ค.
  • PC Register
    • ๊ฐ ์Šค๋ ˆ๋“œ๋งˆ๋‹ค ์กด์žฌํ•˜๋ฉฐ, ํ˜„์žฌ ์‹คํ–‰์ค‘์ธ ๋ช…๋ น์–ด ์œ„์น˜๋ฅผ ์ €์žฅํ•œ๋‹ค.
  • Native Method Stack
    • ๊ฐ ์Šค๋ ˆ๋“œ๋งˆ๋‹ค ์กด์žฌํ•˜๋ฉฐ, native methods ์ •๋ณด๋ฅผ ์ €์žฅํ•œ๋‹ค.

Execution Engine

.class ์ฝ”๋“œ(bytecode)๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

Interpreter

  • bytecode๋ฅผ ์ฝ์œผ๋ฉด์„œ machine code๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

JIT compiler

  • JVM์€ ์ฒ˜์Œ์—” ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ฅผ ์“ฐ์ง€๋งŒ, ํ•ด์„ํ•ด์•ผ ํ•  bytecode๊ฐ€ ๋ฐ˜๋ณต์ ์ด๋ฉด, JVM์€ JIT๋ฅผ ๋Œ€์‹  ์‚ฌ์šฉํ•ด์„œ ์ „์ฒด ์ฝ”๋“œ๋ฅผ machine code๋กœ ์ปดํŒŒ์ผํ•œ๋‹ค. (๋งค๋ฒˆ ๊ฐ™์€ ์ฝ”๋“œ์— ๋Œ€ํ•ด ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๋ณด๋‹ค ํ•œ๋ฒˆ์— ์ปดํŒŒ์ผํ•ด์„œ ์ตœ์ ํ™” ํ•˜๋Š”๊ฒŒ ๋” ๋น ๋ฅด๊ธฐ ๋•Œ๋ฌธ)
  • JIT compiler๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ 4๊ฐ€์ง€๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค
    • Intermediate Code Generator - ์ค‘๊ฐ„ ์ฝ”๋“œ ์ƒ์„ฑ
    • Code Optimizer - ์ฝ”๋“œ ์ตœ์ ํ™”
    • Target Code Generator - ๋จธ์‹  ์ฝ”๋“œ ์ƒ์„ฑ
    • Profiler - ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์ฐพ์Œ(hotspot)

GC(Garbage Collector)

  • C ๊ฐ™์€ ์–ธ์–ด๋“ค์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ง์ ‘ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น/ํ•ด์ œ ํ•ด์•ผ ํ•˜์ง€๋งŒ Java๋Š” JVM์ด ์•Œ์•„์„œ ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค.
  • GC๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์‹คํ–‰๋˜๋ฉด์„œ ์ฃผ๊ธฐ์ ์œผ๋กœ, ๋” ์ด์ƒ์˜ ์ฐธ์กฐ๊ฐ€ ์—†๋Š” Heap ์ƒ์˜ ์˜ค๋ธŒ์ ํŠธ๋“ค์„ ํ•ด์ œํ•œ๋‹ค.
    • Mark โ†’ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋” ์ด์ƒ ์“ฐ์ง€ ์•Š๋Š” ์˜ค๋ธŒ์ ํŠธ๋“ค์„ ๋งˆํ‚น.
    • Sweep โ†’ ๋งˆํ‚น๋œ ์˜ค๋ธŒ์ ํŠธ๋“ค์„ ํ•ด์ œ.
  • GC ๋ฐฉ๋ฒ•์—” ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.
    • Serial GC โ†’ ์‹ฑ๊ธ€์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์œผ๋กœ ๋Œ์•„๊ฐ. GC๊ฐ€ ๋™์ž‘ํ•˜๋ฉด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฉŽ์–ด๋ฒ„๋ฆผ.
    • Parallel GC โ†’ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋ฅผ ์ด์šฉ. (ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฉŽ์„ ๋•Œ๊ฐ€ ์žˆ์Œ)
    • G1GC

JNI interface

JVM์—์„œ ์‹คํ–‰ํ•˜๋Š” ์ž๋ฐ” ์ฝ”๋“œ๊ฐ€ ๋„ค์ดํ‹ฐ๋ธŒ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด๋‚˜ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ˜ธ์ถœ/ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ. .dll ๋˜๋Š” .so ํฌ๋งท.

์ฐธ๊ณ