Java Virtual Machine

μžλ°” 가상 λ¨Έμ‹ (JVM)은 μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•˜κΈ° μœ„ν•œ λŸ°νƒ€μž„ 엔진이닀.

Java Application

JVM(Windows/Mac/Linux)

OS(Windows/Mac/Linux)

Computer(Hardware)

μžλ°” μ½”λ“œλŠ” 이 JVM μœ„μ—μ„œ λ™μž‘ν•˜λ©°, 전체 μ‹€ν–‰ ν™˜κ²½μ€ 'ν•˜λ“œμ›¨μ–΄ - 운영체제(OS) - JVM - μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜' μˆœμ„œμ˜ 계측 ꡬ쑰λ₯Ό κ°€μ§„λ‹€.

JVM의 μ£Όμš” νŠΉμ§•

JVM의 μ‘΄μž¬λŠ” μžλ°” μ–Έμ–΄μ˜ λ‹€μŒκ³Ό 같은 νŠΉμ§•μ„ κ²°μ •ν•œλ‹€.

  • ν”Œλž«νΌ 독립성

    • μžλ°” μ†ŒμŠ€ μ½”λ“œλŠ” νŠΉμ • OSλ₯Ό λŒ€μƒμœΌλ‘œ μ»΄νŒŒμΌλ˜μ§€ μ•Šκ³ , JVM을 λͺ©μ μ§€λ‘œ ν•˜λŠ” 'μžλ°” λ°”μ΄νŠΈ μ½”λ“œ(*.class)'둜 λ³€ν™˜

    • 이 λ°”μ΄νŠΈ μ½”λ“œλŠ” ν•΄λ‹Ή OS에 λ§žλŠ” JVM이 μ„€μΉ˜λ˜μ–΄ 있기만 ν•˜λ©΄, μ–΄λ–€ ν”Œλž«νΌ(Windows, Mac, Linux λ“±)μ—μ„œλ“  μˆ˜μ • 없이 λ™μΌν•˜κ²Œ μ‹€ν–‰ κ°€λŠ₯

  • JVM μ‹€ν–‰ ν•„μˆ˜

    • ν”Œλž«νΌ 독립성을 μ–»λŠ” λŒ€μ‹ , μžλ°” μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ°˜λ“œμ‹œ λŒ€μƒ ν”Œλž«νΌμ— JVM μ„€μΉ˜ ν•„μš”

  • μ„±λŠ₯ μ΅œμ ν™”

    • κ³Όκ±°μ—λŠ” OS μœ„μ—μ„œ 가상 머신을 ν•œ 단계 더 거치기 λ•Œλ¬Έμ— λ„€μ΄ν‹°λΈŒ μ½”λ“œ(C/C++) λŒ€λΉ„ μ‹€ν–‰ 속도가 λŠλ¦¬λ‹€λŠ” 단점 쑴재

    • ν˜„μž¬λŠ” JIT(Just-In-Time) μ»΄νŒŒμΌλŸ¬μ™€ 같은 μ΅œμ ν™” 기술의 λ°œμ „μœΌλ‘œ, λŸ°νƒ€μž„ 쀑에 자주 μ‚¬μš©λ˜λŠ” μ½”λ“œλ₯Ό λ„€μ΄ν‹°λΈŒ κΈ°κ³„μ–΄λ‘œ λ³€ν™˜ν•˜μ—¬ μ‹€ν–‰ 속도 ν–₯상

Java μ‹€ν–‰ κ³Όμ •

java execution process
  • Java Compiler: Java Source Codeλ₯Ό Java Byte Code둜 λ³€ν™˜

  • Class Loader: λ°”μ΄νŠΈ μ½”λ“œ λ‘œλ”© / 검증 / 링킹 λ“± μˆ˜ν–‰

  • Runtime Data Area: μ•± 싀행을 μœ„ν•΄ μ‚¬μš©λ˜λŠ” JVM λ©”λͺ¨λ¦¬ μ˜μ—­

  • Execution Engine: λ©”λͺ¨λ¦¬ μ˜μ—­μ— μžˆλŠ” 데이터λ₯Ό 가져와 ν•΄λ‹Ήν•˜λŠ” μž‘μ—… μˆ˜ν–‰

  1. μž‘μ„±λœ Java Sourceλ₯Ό Java Compilerλ₯Ό 톡해 Java Byte Code둜 λ³€ν™˜

  2. 컴파일 된 Byte Codeλ₯Ό JVM의 Class Loader에 전달

  3. Class LoaderλŠ” Dynamic Loading을 톡해 ν•„μš”ν•œ ν΄λž˜μŠ€λ“€μ„ λ‘œλ”© 및 λ§ν¬ν•˜μ—¬ Runtime Data Area(JVM Memory)둜 전달

  4. Execution Engine이 올라온 Byte Code듀을 λͺ…λ Ήμ–΄ λ‹¨μœ„λ‘œ ν•˜λ‚˜μ”© κ°€μ Έμ™€μ„œ μ‹€ν–‰

Class Loader

클래슀 λ‘œλ”λŠ” 컴파일된 μžλ°” 클래슀 파일(*.class)을 λ©”λͺ¨λ¦¬λ‘œ λ‘œλ“œν•˜κ³ , Runtime Data Area에 λ°°μΉ˜ν•˜λŠ” 역할을 ν•œλ‹€.

  • λ‘œλ”© 단계

    1. λ‘œλ”©(Loading): 클래슀 νŒŒμΌμ„ μ°Ύμ•„ λ°”μ΄νŠΈ μ½”λ“œλ₯Ό λ©”λͺ¨λ¦¬μ— λ‘œλ“œ

      • ν•œ λ²ˆμ— λͺ¨λ“  클래슀λ₯Ό λ‘œλ“œν•˜λŠ” 것이 μ•„λ‹ˆλΌ, ν•„μš”ν•  λ•Œ λ™μ μœΌλ‘œ λ‘œλ“œ

      • static 멀버듀 λ˜ν•œ μ „λΆ€ λ©”λͺ¨λ¦¬μ— μ˜¬λΌκ°€λŠ” 것이 μ•„λ‹ˆλΌ, 클래슀 λ‚΄μ˜ static 멀버λ₯Ό ν˜ΈμΆœν•˜κ²Œ 되면 ν΄λž˜μŠ€κ°€ λ™μ μœΌλ‘œ λ©”λͺ¨λ¦¬μ— λ‘œλ“œ

    2. 링크(Linking): μ½μ–΄μ˜¨ μ½”λ“œλ₯Ό μ‹€ν–‰ κ°€λŠ₯ν•˜λ„λ‘ μ€€λΉ„

      • 검증(Verify): λ°”μ΄νŠΈ μ½”λ“œκ°€ μžλ°” μ–Έμ–΄ λͺ…μ„Έ 및 JVM λͺ…μ„Έλ₯Ό μ€€μˆ˜ν•˜λŠ”μ§€ 확인(λ³΄μ•ˆ)

      • μ€€λΉ„(Prepare): 클래슀의 정적(static) λ³€μˆ˜λ“€μ„ μœ„ν•œ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•˜κ³  κΈ°λ³Έκ°’(0, false, null λ“±)으둜 μ΄ˆκΈ°ν™”

      • 뢄석(Resolve): μ½”λ“œ λ‚΄μ˜ 기호 μ°Έμ‘°(Symbolic Reference)λ₯Ό μ‹€μ œ λ©”λͺ¨λ¦¬ μ£Όμ†Œ(Direct Reference)둜 λ³€κ²½

    3. μ΄ˆκΈ°ν™”(Initialization): 'μ€€λΉ„' λ‹¨κ³„μ—μ„œ κΈ°λ³Έκ°’μœΌλ‘œ μ΄ˆκΈ°ν™”ν–ˆλ˜ 정적 λ³€μˆ˜λ“€μ„ μ‹€μ œ μ½”λ“œμ— λͺ…μ‹œλœ κ°’(static 블둝 포함)으둜 μ΄ˆκΈ°ν™”

  • 클래슀 λ‘œλ” μœ„μž„ λͺ¨λΈ(Delegation Model): 클래슀 λ‘œλ”λŠ” 계측 ꡬ쑰λ₯Ό κ°€μ§€λ©°, 클래슀 λ‘œλ“œ μš”μ²­ μ‹œ ν•˜μœ„ λ‘œλ”κ°€ μƒμœ„ λ‘œλ”μ—κ²Œ μ±…μž„μ„ μœ„μž„ν•˜λŠ” λ°©μ‹μœΌλ‘œ λ™μž‘

    • λΆ€νŠΈμŠ€νŠΈλž©(Bootstrap) λ‘œλ”: μ΅œμƒμœ„ λ‘œλ”. JVM 핡심 라이브러리(JAVA_HOME/lib의 rt.jar λ“±)λ₯Ό λ‘œλ“œ

    • ν™•μž₯(Extension) λ‘œλ”: lib/ext ν΄λ”μ˜ 클래슀 λ‘œλ“œ

    • μ• ν”Œλ¦¬μΌ€μ΄μ…˜(Application/System) λ‘œλ”: μ‚¬μš©μžκ°€ μ§€μ •ν•œ 클래슀패슀(Classpath)의 클래슀 λ‘œλ“œ

    • 이 κ΅¬μ‘°λŠ” 이미 λ‘œλ“œλœ 클래슀의 쀑볡 λ‘œλ“œλ₯Ό λ°©μ§€ν•˜κ³ , 핡심 라이브러리의 λ³΄μ•ˆμ„ μœ μ§€ν•˜λŠ” μ—­ν• 

Execution Engine

클래슀 λ‘œλ”κ°€ λ©”λͺ¨λ¦¬μ— μ μž¬ν•œ λ°”μ΄νŠΈ μ½”λ“œλ₯Ό μ‹€μ œ κΈ°κ³„μ–΄λ‘œ λ³€ν™˜ν•˜κ³  μ‹€ν–‰ν•˜λŠ” 역할을 ν•œλ‹€.

  • 인터프리터 (Interpreter)

    • λ°”μ΄νŠΈ μ½”λ“œλ₯Ό ν•œ 쀄씩 μ½μ–΄μ„œ ν•΄μ„ν•˜κ³ (interpret) λ°”λ‘œ μ‹€ν–‰

    • 초기 μ‹€ν–‰ μ†λ„λŠ” λΉ λ₯΄μ§€λ§Œ, λ™μΌν•œ μ½”λ“œκ°€ 반볡 호좜될 λ•Œλ„ 맀번 해석해야 ν•˜λ―€λ‘œ λΉ„νš¨μœ¨μ μΌ 수 있음

  • JIT 컴파일러 (Just-In-Time Compiler)

    • μΈν„°ν”„λ¦¬ν„°μ˜ 단점을 λ³΄μ™„ν•˜κΈ° μœ„ν•΄ λ„μž…

    • μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰ 쀑에(Just-In-Time) 반볡적으둜 μ‹€ν–‰λ˜λŠ” 'ν•«μŠ€νŒŸ(hotspot)' μ½”λ“œ 감지

    • 'ν•«μŠ€νŒŸ' μ½”λ“œλ₯Ό λ„€μ΄ν‹°λΈŒ κΈ°κ³„μ–΄λ‘œ μ»΄νŒŒμΌν•˜μ—¬ μΊμ‹œμ— μ €μž₯

    • 이후 ν•΄λ‹Ή μ½”λ“œκ°€ 호좜되면, μΈν„°ν”„λ¦¬νŠΈ 방식이 μ•„λ‹Œ μΊμ‹œλœ λ„€μ΄ν‹°λΈŒ μ½”λ“œλ₯Ό 직접 μ‹€ν–‰ν•˜μ—¬ μ„±λŠ₯ ν–₯상

  • κ°€λΉ„μ§€ 컬렉터 (Garbage Collector, GC)

    • μ‹€ν–‰ μ—”μ§„μ˜ μΌλΆ€λ‘œ λ™μž‘ν•˜λ©°, νž™(Heap) λ©”λͺ¨λ¦¬ μ˜μ—­μ—μ„œ 더 이상 μ°Έμ‘°λ˜μ§€ μ•ŠλŠ” 객체(κ°€λΉ„μ§€)λ₯Ό μ°Ύμ•„ μ œκ±°ν•˜κ³  λ©”λͺ¨λ¦¬ 회수

JDK & JRE & JVM

java jdk diagram
  • JVM(Java Virtual Machine): μžλ°” λ°”μ΄νŠΈ μ½”λ“œλ₯Ό μ‹€ν–‰μ‹œν‚€κΈ° μœ„ν•œ 가상 λ¨Έμ‹ 

  • JRE(Java Runtime Environment): μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•˜κΈ° μœ„ν•œ 도ꡬ(ν•„μš”ν•œ 라이브러리 및 ν•„μˆ˜ 파일)κ°€ ν¬ν•¨λœ μ‹€ν–‰ ν™˜κ²½(JRE = JVM + Standard Libraries)

  • JDK(Java Development Kit): μžλ°”λ‘œ κ°œλ°œν•˜κΈ° μœ„ν•œ ν•„μš” μš”μ†Œ(javac λ“±)λ₯Ό ν¬ν•¨ν•œ 개발 ν‚€νŠΈ(JDK = JRE + Development Tools)

μœ„μ™€ 같은 ꡬ쑰둜 인해 μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ°°ν¬ν•˜μ—¬ μ‹€ν–‰λ§Œ ν•  μ„œλ²„μ—λŠ” JRE만 μ„€μΉ˜ν•˜κ³ , 개발자의 둜컬 μž₯λΉ„μ—λŠ” JDKλ₯Ό μ„€μΉ˜ν•œλ‹€.

JVM λ©”λͺ¨λ¦¬ ꡬ쑰

JVM은 OSλ‘œλΆ€ν„° 싀행에 ν•„μš”ν•œ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήλ°›μœΌλ©°, 이 μ˜μ—­μ„ Runtime Data Area라고 λΆ€λ₯Έλ‹€.

μ˜μ—­
μš©λ„
생λͺ… μ£ΌκΈ°
μŠ€λ ˆλ“œ 곡유 μ—¬λΆ€

Method

클래슀 정보, 클래슀(static) λ³€μˆ˜, μƒμˆ˜, λ©”μ†Œλ“œ μ½”λ“œ

JVM μ‹œμž‘ ~ μ’…λ£Œ

O

Heap

객체 μΈμŠ€ν„΄μŠ€, μΈμŠ€ν„΄μŠ€ λ³€μˆ˜

Gabage Collection에 μ˜ν•΄ 관리

O

Stack

μŠ€λ ˆλ“œ λ³„λ‘œ λŸ°νƒ€μž„μ— 호좜 된 λ©”μ„œλ“œ, μ§€μ—­ λ³€μˆ˜, 맀개 λ³€μˆ˜, 리턴 κ°’

λ©”μ„œλ“œ μ’…λ£Œ μ‹œ

X

μŠ€λ ˆλ“œ 곡유 μ˜μ—­ (λͺ¨λ“  μŠ€λ ˆλ“œκ°€ 곡유)

  • νž™ (Heap Area)

    • new ν‚€μ›Œλ“œλ‘œ μƒμ„±λœ 객체 μΈμŠ€ν„΄μŠ€μ™€ 배열이 μ €μž₯λ˜λŠ” 곡간

    • κ°€λΉ„μ§€ μ»¬λ ‰μ…˜(GC)의 주된 λŒ€μƒ

    • μ„±λŠ₯ μ΅œμ ν™”λ₯Ό μœ„ν•΄ λ‚΄λΆ€μ μœΌλ‘œ Young Generation(Eden, Survivor 0/1)κ³Ό Old Generation μ˜μ—­μœΌλ‘œ λ‚˜λ‰˜μ–΄ 관리

    • 이 μ˜μ—­μ˜ λ©”λͺ¨λ¦¬κ°€ λΆ€μ‘±ν•˜λ©΄ OutOfMemoryErrorκ°€ λ°œμƒ

  • λ©”μ†Œλ“œ μ˜μ—­ (Method Area)

    • 클래슀의 메타데이터(ꡬ쑰, ν•„λ“œ, λ©”μ†Œλ“œ 정보), 정적(static) λ³€μˆ˜, μƒμˆ˜ ν’€(Runtime Constant Pool), λ©”μ†Œλ“œ μ½”λ“œ λ“± μ €μž₯

    • μžλ°” 8 μ΄μ „μ—λŠ” 이 μ˜μ—­μ„ νž™μ˜ μΌλΆ€λ‘œ μ·¨κΈ‰

    • μžλ°” 8λΆ€ν„°λŠ” νž™μ΄ μ•„λ‹Œ λ„€μ΄ν‹°λΈŒ λ©”λͺ¨λ¦¬ μ˜μ—­(OSκ°€ 직접 관리)을 μ‚¬μš©ν•˜λ„λ‘ λ³€κ²½(OutOfMemoryError λ¬Έμ œκ°€ 크게 κ°œμ„ )

μŠ€λ ˆλ“œ 독립 μ˜μ—­ (μŠ€λ ˆλ“œλ³„ κ°œλ³„ 생성)

각 μŠ€λ ˆλ“œλŠ” 생성될 λ•Œλ§ˆλ‹€ 이 μ˜μ—­λ“€μ„ κ°œλ³„μ μœΌλ‘œ ν• λ‹Ήλ°›λŠ”λ‹€.

  • μŠ€νƒ (Stack Area)

    • λ©”μ†Œλ“œ 호좜 정보λ₯Ό μ €μž₯ν•˜λŠ” μ˜μ—­

    • λ©”μ†Œλ“œκ°€ 호좜될 λ•Œλ§ˆλ‹€ ν•΄λ‹Ή λ©”μ†Œλ“œμ˜ 정보(μ§€μ—­ λ³€μˆ˜, 맀개 λ³€μˆ˜, 리턴 μ£Όμ†Œ λ“±)λ₯Ό 담은 μŠ€νƒ ν”„λ ˆμž„(Stack Frame)이 μƒμ„±λ˜μ–΄ μŠ€νƒμ— μŒ“μ΄κ³ , λ©”μ†Œλ“œ 싀행이 μ™„λ£Œλ˜λ©΄ 제거

    • μŠ€νƒ μ˜μ—­μ˜ ν•œκ³„λ₯Ό μ΄ˆκ³Όν•˜λ©΄ StackOverflowErrorκ°€ λ°œμƒ

  • PC λ ˆμ§€μŠ€ν„° (PC Register)

    • ν˜„μž¬ μŠ€λ ˆλ“œκ°€ μ‹€ν–‰ 쀑인 JVM λͺ…λ Ήμ–΄μ˜ μ£Όμ†Œ μ €μž₯

    • μŠ€λ ˆλ“œκ°€ μ»¨ν…μŠ€νŠΈ μŠ€μœ„μΉ­μ„ ν•  λ•Œ, λ‹€μŒμ— μ‹€ν–‰ν•  λͺ…λ Ήμ–΄λ₯Ό κΈ°μ–΅ν•˜κΈ° μœ„ν•΄ μ‚¬μš©

  • λ„€μ΄ν‹°λΈŒ λ©”μ†Œλ“œ μŠ€νƒ (Native Method Stack)

    • μžλ°” μ½”λ“œ(λ°”μ΄νŠΈ μ½”λ“œ)κ°€ μ•„λ‹Œ C/C++ λ“± λ„€μ΄ν‹°λΈŒ μ½”λ“œλ‘œ μž‘μ„±λœ JNI(Java Native Interface) λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œ μ‚¬μš©λ˜λŠ” μŠ€νƒ μ˜μ—­

Last updated

Was this helpful?