[Java] JVM

Yumya's recordยท2025๋…„ 4์›” 9์ผ

SKALA

๋ชฉ๋ก ๋ณด๊ธฐ
18/25
post-thumbnail

๐Ÿฆˆ JVM ์ •๋ฆฌ ๐Ÿฆˆ

JVM

Java Virtual Machine
Java๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์ƒ ๋จธ์‹ , Java API์™€ ํ•จ๊ป˜ ์‹คํ–‰

  • Java application์€ JVM ์œ„์—์„œ ๋™์ž‘ํ•˜์ง€ ์•Š์Œ > OS ์ข…์†์  X
  • Garbage Collection์„ ํ†ตํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ > ์ž๋™ ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™”
  • Stack ๊ธฐ๋ฐ˜ ๊ฐ€์ƒ ๋จธ์‹ 
  • Class Loader, Execution Engine, Runtime Data Area์œผ๋กœ ์ด๋ฃจ์–ด์ง

๋™์ž‘ ๊ณผ์ •

  1. ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‹œ JVM์€ OS๋กœ๋ถ€ํ„ฐ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น
  2. Java Compiler(Javac)๊ฐ€ Java Source code(.java)๋ฅผ Java byte code(.class)๋กœ Compile
  3. Class Loader๋Š” ๋™์  ๋กœ๋”ฉ์„ ํ†ตํ•ด ํ•„์š”ํ•œ ํด๋ž˜์Šค๋“ค์„ Loading, Linkingํ•ด Runtime Data Area์— ์˜ฌ๋ฆผ
  4. Runtime Data Area์— Loading๋œ byte code๋Š” Execution Engine์„ ํ†ตํ•ด ํ•ด์„
  5. ์ด ๊ณผ์ •์—์„œ Execution Engine์— ์˜ํ•ด Garbage Collector์˜ ์ž‘๋™๊ณผ Thread ๋™๊ธฐํ™”๊ฐ€ ์ด๋ฃจ์–ด์ง

๊ตฌ์„ฑ

  • Class Loader
  • Execution Engine
    • Interpreter
    • JIT Compiler
    • Garbage collector
  • Runtime Data Area
    • Method Area
    • Heap Area
    • PC Register
    • Stack Area
    • Native Method
  • JNI - Native Method Interface
  • Native Method Library

Class Loader

jar ํŒŒ์ผ ๋‚ด ์ €์žฅ๋œ ํด๋ž˜์Šค๋ฅผ ๋™์ ์œผ๋กœ JVM์˜ Heap์— ํƒ‘์žฌํ•˜๋Š” ์—ญํ• 

  • .class ํŒŒ์ผ์„ ๋กœ๋“œ - ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰ ์ค‘์ธ Runtime์—์„œ ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ JVM๊ณผ ์—ฐ๊ฒฐ
  • Loading ์‹œ ํ•œ๋ฒˆ์— ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ฆฌ์ง€ ์•Š๊ณ , ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋™์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ์ ์žฌ

Loading ์ˆœ์„œ

  • Loading : ํด๋ž˜์Šค ํŒŒ์ผ์„ ๊ฐ€์ ธ์™€ JVM์˜ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ
  • Linking : ํด๋ž˜์Šค ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ฒ€์ฆ
    • Verifying(๊ฒ€์ฆ) : ์ฝ์–ด๋“ค์ธ ํด๋ž˜์Šค๊ฐ€ JVM ๋ช…์„ธ์— ๋งž๋Š”์ง€ ๊ฒ€์‚ฌ
    • Preparing(์ค€๋น„) : ํด๋ž˜์Šค๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น
    • Resolving(๋ถ„์„) : ํด๋ž˜์Šค์˜ ์ƒ์ˆ˜ ํ’€ ๋‚ด ๋ชจ๋“  ์‹ฌ๋ณผ๋ฆญ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๋‹ค์ด๋ ‰ํŠธ ๋ ˆํผ๋Ÿฐ์Šค๋กœ ๋ณ€๊ฒฝ
  • Initialization : ํด๋ž˜์Šค ๋ณ€์ˆ˜๋“ค์„ ์ ์ ˆํ•œ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”
    ex) static ํ•„๋“œ๋“ค์„ ์„ค์ •๋œ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”

Compile

์ปดํ“จํ„ฐ์˜ ๊ณ ๊ธ‰ ์–ธ์–ด๋กœ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ๊ธฐ๊ณ„์–ด๋กœ ๋ฒˆ์—ญํ•˜๋Š” ๊ณผ์ •

Compiler

ํ”„๋กœ๊ทธ๋žจ ์ „์ฒด๋ฅผ ์Šค์บ”ํ•ด ๊ธฐ๊ณ„์–ด๋กœ ๋ฒˆ์—ญ

  • ์ „์ฒด๋ฅผ ์Šค์บ”ํ•ด ์ดˆ๊ธฐ ์Šค์บ”์ด ์˜ค๋ž˜ ๊ฑธ๋ฆผ
  • ์ด์ „์— ๋งŒ๋“ค์–ด ๋†“์•˜๋˜ ์‹คํ–‰ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด ์‹คํ–‰ ์‹œ๊ฐ„์—์„œ๋Š” Interpreter๋ณด๋‹ค ๋น ๋ฆ„
  • ํ•˜์ง€๋งŒ ๊ธฐ๊ณ„์–ด ๋ฒˆ์—ญ ๊ณผ์ •์—์„œ Object Code ํŒŒ์ผ์„ ๋งŒ๋“œ๋Š”๋ฐ, ์ด๋ฅผ ๋ฌถ์–ด ํ•˜๋‚˜์˜ ์‹คํ–‰ ํŒŒ์ผ๋กœ ๋‹ค์‹œ ๋งŒ๋“œ๋Š” Linking ์ž‘์—…๋•Œ๋ฌธ์— Interpreter๋ณด๋‹ค ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ
  • ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ์ƒ์„ฑ ์‹œ ์ „์ฒด ์ฝ”๋“œ ๊ฒ€์‚ฌ ํ›„ ์ƒ์„ฑ => ์‹คํ–‰ ์ „ ์˜ค๋ฅ˜ ๋ฐœ๊ฒฌ ๊ฐ€๋Šฅ
    ex) C, C++, Java ๋“ฑ

Interpreter

Compiler์™€๋Š” ๋ฐ˜๋Œ€๋กœ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‹œ ํ•œ ๋ฒˆ์— ํ•œ ๋ฌธ์žฅ์”ฉ ๋ฒˆ์—ญ

  • Compiler๋ณด๋‹ค ์‹คํ–‰ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆผ
  • Compiler์™€ ๋‹ฌ๋ฆฌ Object Code ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ Linking ์ž‘์—…์„ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ ๋” ์ข‹์Œ
  • ํ”„๋กœ๊ทธ๋žจ์„ ํ•œ ๋ฌธ์žฅ์”ฉ ์‹คํ–‰์‹œํ‚ค๋ฉด์„œ ์˜ค๋ฅ˜๋ฅผ ๋งŒ๋‚˜๋ฉด ๋ฐ”๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์ค‘์ง€ => ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•ด์•ผ๋งŒ ์˜ค๋ฅ˜ ๋ฐœ๊ฒฌ ๊ฐ€๋Šฅ
    ex) Python, Ruby, JavaScript ๋“ฑ

Compiler vs Interpreter

์„ค๋ช…ComprilerInterpreter
์Šค์บ” ์˜์—ญ์ „์ฒดํ•œ ๋ฒˆ์— ํ•œ ๋ฌธ์žฅ
์‹คํ–‰ ์‹œ๊ฐ„์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ณด๋‹ค ๋น ๋ฆ„์ปดํŒŒ์ผ๋Ÿฌ๋ณด๋‹ค ๋А๋ฆผ
๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ณด๋‹ค ์•ˆ์ข‹์Œ์ปดํŒŒ์ผ๋Ÿฌ๋ณด๋‹ค ์ข‹์Œ
์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์ „์ฒด ์ฝ”๋“œ ๊ฒ€์‚ฌ ํ›„ ์ƒ์„ฑ์˜ค๋ฅ˜ ๋งŒ๋‚˜๋ฉด ์ค‘์ง€

Execution Engine

Class Loader๋ฅผ ํ†ตํ•ด Runtime Data Area์— ๋ฐฐ์น˜๋œ byte code๋ฅผ ๋ช…๋ น์–ด ๋‹จ์œ„๋กœ ์ฝ์–ด์„œ ์‹คํ–‰

  • Interpreter์™€ JIT(Just In Time)์œผ๋กœ ํด๋ž˜์Šค ์‹คํ–‰
  • Garbage Collector๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐพ์•„ ์‚ญ์ œ

JIT(Just In Time)

์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰ํ•˜๋‹ค๊ฐ€ ์ ์ ˆํ•œ ์‹œ์ ์— ๋ฐ”์ดํŠธ ์ฝ”๋“œ ์ „์ฒด๋ฅผ ์ปดํŒŒ์ผ -> Native code๋กœ ๋ณ€๊ฒฝํ•˜๊ณ , ์ดํ›„์—๋Š” ๋” ์ด์ƒ ์ธํ„ฐํ”„๋ฆฌํŒ…ํ•˜์ง€ ์•Š๊ณ  Native Code๋กœ ์ง์ ‘ ์‹คํ–‰

  • ์ธํ„ฐํ”„๋ฆฌํ„ฐ์˜ ๋‹จ์ (์†๋„ ๋А๋ฆผ) ๋ณด์™„์„ ์œ„ํ•ด ๋„์ž…
  • Native Code
    • Java์—์„œ ๋ถ€๋ชจ๊ฐ€ ๋˜๋Š” C์–ธ์–ด, C++, ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๋กœ ๊ตฌ์„ฑ๋œ ์ฝ”๋“œ
    • ์บ์‹œ์— ๋ณด๊ด€๋จ
    • ์ปดํŒŒ์ผ ์‹œ ๋ฐ”๋€ ๋ถ€๋ถ„๋งŒ ์ปดํŒŒ์ผํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ์บ์‹ฑ๋œ ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰
      => ํ•œ ๋ฒˆ ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ๋Š” ๋น ๋ฅด๊ฒŒ ์ˆ˜ํ–‰

RunTime Data Area

ํ”„๋กœ๊ทธ๋žจ ์ˆ˜ํ–‰์„ ์œ„ํ•ด ์šด์˜์ฒด์ œ๋กœ๋ถ€ํ„ฐ ํ• ๋‹น๋ฐ›์€ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ

Heap Area

๊ฐ์ฒด ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฐ€์ƒ์˜ ๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์˜์—ญ

  • ๋ชจ๋“  Thread์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ
  • new ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ Heap ๋ฉ”๋ชจ๋ฆฌ์— ์ „๋‹ฌ
  • ํ• ๋‹น๋œ ๊ฐ์ฒด๋Š” ์ง์ ‘ ํ•ด์ œ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์ฃผ๊ธฐ์ ์œผ๋กœ GC๊ฐ€ ์ œ๊ฑฐ

Garbage Collector(GC)

JVM์˜ Heap ์˜์—ญ์—์„œ ๋™์ ์œผ๋กœ ํ• ๋‹นํ–ˆ๋˜ ๋ฉ”๋ชจ๋ฆฌ ์ค‘ ํ•„์š” ์—†๊ฒŒ ๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ฐ์ฒด(Garbage)๋ฅผ ๋ชจ์•„ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ œ๊ฑฐํ•˜๋Š” ํ”„๋กœ์„ธ์Šค

  • GC๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ํ•ด์คŒ์œผ๋กœ์จ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐœ๋ฐœ์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋จ
  • ์‹คํ–‰์ด ๋๋‚œ ๋’ค ๋ฒ„๋ ค์ง€๋Š” ๊ฐ์ฒด๋“ค์„ ์ฃผ๊ธฐ์ ์œผ๋กœ ๋น„์›Œ์คŒ์œผ๋กœ์จ ํ•œ์ •๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์คŒ
  • ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์–ธ์ œ ํ•ด์ œ๋˜๋Š”์ง€ ์ •ํ™•ํžˆ ์•Œ ์ˆ˜ ์—†์–ด ์ œ์–ดํ•˜๊ธฐ ํž˜๋“ฆ
  • GC๊ฐ€ ๋™์ž‘ํ•˜๋Š” ๋™์•ˆ JVM์ด ๋‹ค๋ฅธ ๋™์ž‘์„ ๋ฉˆ์ถ”๊ธฐ ๋•Œ๋ฌธ์— Overhead ๋ฐœ์ƒ(Stop-The-World) > ์†Œํ”„ํŠธ์›จ์–ด ์„ฑ๋Šฅ ํ•˜๋ฝ ์›์ธ
  • ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‚ฌ์šฉ์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ํšจ์œจ์ ์ด๊ฒŒ GC๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์ตœ์ ํ™” ์ž‘์—…์ด ํ•„์š” > GC ํŠœ๋‹

Stack Area

  • ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ ์ƒ์„ฑ๋˜๋Š” ์Šค๋ ˆ๋“œ ์ˆ˜ํ–‰์ •๋ณด๋ฅผ ๊ธฐ๋กํ•˜๋Š” Frame ์ €์žฅ
  • ๋ฉ”์„œ๋“œ ์ •๋ณด, ์ง€์—ญ ๋ณ€์ˆ˜, ๋งค๊ฐœ๋ณ€์ˆ˜, ์—ฐ์‚ฐ ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ์ž„์‹œ ๋ฐ์ดํ„ฐ ์ €์žฅ

Method Area

JVM์—์„œ ์ฝ์–ด๋“ค์ธ ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ์ƒ์ˆ˜ ํ’€, ๋ฉ”์„œ๋“œ์™€ ํ•„๋“œ, static ๋ณ€์ˆ˜, ๋ฉ”์„œ๋“œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ ๋“ฑ์„ ๋ณด๊ด€

PC Register

  • ์—ฐ์‚ฐ ๋ฐ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ „๋‹ฌํ•˜๊ธฐ ์ „ CPU ๋‚ด ๊ธฐ์–ต์žฅ์น˜
  • ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ JVM ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๋ฉฐ, CPU ๋ช…๋ น์–ด(=Instruction) ์ˆ˜ํ–‰
  • CPU Instruction ์ˆ˜ํ–‰ ๋™์•ˆ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ CPU ๋‚ด ๊ธฐ์–ต ์žฅ์น˜์ธ Register์— ์ €์žฅ

Native Method Stack

์ž๋ฐ” ์™ธ์˜ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ Native code๋ฅผ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ

  • C, C++ ๋“ฑ์˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์Šคํƒ
  • Native ๋ฉ”์„œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜, ์ง€์—ญ๋ณ€์ˆ˜ ๋“ฑ์„ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ ์ €์žฅ

Heap Area์™€ Method Area๋Š” JVM ์‹œ์ž‘ ์‹œ ์ƒ์„ฑ๋˜๊ณ , ์ข…๋ฃŒ ์‹œ ํ•ด์ œ๋จ
๋‚˜๋จธ์ง€ Area๋Š” Thead ์ƒ์„ฑ ์‹œ ์ƒ์„ฑ, ์ข…๋ฃŒ ์‹œ ํ•ด์ œ


์ด๋ฏธ์ง€ ์ถœ์ฒ˜ ๋ฐ ์ฐธ๊ณ -JVM
์ฐธ๊ณ -Compile, Compiler์™€ Interpreter
์ฐธ๊ณ -JVM ๋‚ด๋ถ€ ๊ตฌ์กฐ
์ฐธ๊ณ -Garbage Collection

profile
๐Ÿ€ ูฉ(หŠแ—œห‹*)ูˆ ๐Ÿ€

0๊ฐœ์˜ ๋Œ“๊ธ€