Skip to content

Latest commit

Β 

History

History
128 lines (78 loc) Β· 7.17 KB

[Java] JVM.md

File metadata and controls

128 lines (78 loc) Β· 7.17 KB

JVM(Java Virtual Machine)

  • μŠ€νƒ 기반의 가상 λ¨Έμ‹ .
  • JVM의 역할은 μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ 클래슀 λ‘œλ”λ₯Ό 톡해 읽어듀여 μžλ°” API와 ν•¨κ»˜ μ‹€ν–‰ν•˜λŠ” 것이닀.
  • Java와 OS μ‚¬μ΄μ—μ„œ μ€‘κ°œμž 역할을 μˆ˜ν–‰ν•˜μ—¬ Javaκ°€ OS에 ꡬ애받지 μ•Šκ³  μž¬μ‚¬μš© κ°€λŠ₯ν•˜κ²Œ ν•΄μ€€λ‹€.
  • λ©”λͺ¨λ¦¬ 관리, Garbage Collection(GCλ₯Ό 톡해 μžμ›μ„ 관리)을 μˆ˜ν–‰ν•œλ‹€.
  • μžλ°” λ°”μ΄νŠΈ μ½”λ“œλ₯Ό μ‹€ν–‰ν•  수 μžˆλŠ” 주체이닀.

[JVM을 μ•Œμ•Όμ•„ ν•˜λŠ” μ΄μœ λŠ” 뭘까?]

-> ν•œμ •λœ λ©”λͺ¨λ¦¬λ₯Ό 효율적으둜 μ‚¬μš©ν•˜μ—¬ 졜고의 μ„±λŠ₯을 λ‚΄κΈ° μœ„ν•΄μ„œλΌ ν•  수 μžˆλ‹€. λ™μΌν•œ κΈ°λŠ₯의 ν”„λ‘œκ·Έλž¨μ΄λ”λΌλ„ λ©”λͺ¨λ¦¬ 관리에 λ”°λΌμ„œ μ„±λŠ₯이 쒌우되기 λ•Œλ¬Έμ— JVM이 ν•˜λŠ” 역할을 μ΄ν•΄ν•˜κ³  λ©”λͺ¨λ¦¬λ₯Ό 효율적으둜 μ‚¬μš©ν•˜μ—¬ 졜고의 μ„±λŠ₯을 λ‚Ό 수 μžˆμ„ 것이닀.

[μžλ°” ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ κ³Όμ •]

  1. ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜λ©΄ JVM은 OSλ‘œλΆ€ν„° 이 ν”„λ‘œκ·Έλž¨μ΄ ν•„μš”λ‘œ ν•˜λŠ” λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήλ°›λŠ”λ‹€. JVM은 이 λ©”λͺ¨λ¦¬λ₯Ό μš©λ„μ— 따라 μ—¬λŸ¬ μ˜μ—­μœΌλ‘œ λ‚˜λˆ„μ–΄ κ΄€λ¦¬ν•œλ‹€.
  2. μžλ°” 컴파일러(javac)κ°€ μžλ°” μ†ŒμŠ€ μ½”λ“œλ₯Ό 읽어듀여 μžλ°” λ°”μ΄νŠΈ μ½”λ“œ(.class)둜 λ³€ν™˜μ‹œν‚¨λ‹€.
  3. Class Loaderλ₯Ό 톡해 class νŒŒμΌλ“€μ„ JVM으둜 λ‘œλ”©ν•œλ‹€.
  4. λ‘œλ”©λœ class νŒŒμΌλ“€μ€ Execution Engine을 톡해 ν•΄μ„λœλ‹€.
  5. ν•΄μ„λœ λ°”μ΄νŠΈ μ½”λ“œλŠ” Runtime Data Area에 λ°°μΉ˜λ˜μ–΄ μ‹€μ§ˆμ μΈ μˆ˜ν–‰μ΄ μ΄λ£¨μ–΄μ§€κ²Œ λœλ‹€. μ΄λŸ¬ν•œ μ‹€ν–‰ κ³Όμ • μ†μ—μ„œ JVM은 ν•„μš”μ— 따라 Thread Synchronizationκ³Ό GC 같은 관리 μž‘μ—…μ„ μˆ˜ν–‰ν•œλ‹€.

각각의 μ—­ν• 

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

  • Runtimμ‹œμ— JVMλ‚΄λ‘œ 클래슀(.class 파일)λ₯Ό λ‘œλ“œν•˜κ³  링크λ₯Ό 톡해 λ°°μΉ˜ν•˜λŠ” μž‘μ—…μ„ μˆ˜ν–‰ν•œλ‹€. (Runtime : 클래슀λ₯Ό 처음으둜 μ°Έμ‘°ν•  λ•Œ.)
  • μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” ν΄λž˜μŠ€λ“€μ€ λ©”λͺ¨λ¦¬μ—μ„œ μ‚­μ œν•œλ‹€.
  • 동적 λ‘œλ“œλ₯Ό λ‹΄λ‹Ήν•œλ‹€.

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

  • 클래슀λ₯Ό μ‹€ν–‰μ‹œν‚€λŠ” 역할이닀.
  • 클래슀 λ‘œλ”κ°€ JVM λ‚΄μ˜ Runtime Data Area에 λ°”μ΄νŠΈ μ½”λ“œλ₯Ό λ°°μΉ˜μ‹œν‚€κ³  이것은 μ‹€ν–‰ 엔진에 μ˜ν•΄μ„œ μ‹€ν–‰λœλ‹€.
  • μžλ°” λ°”μ΄νŠΈ μ½”λ“œλŠ” 비ꡐ적 인간이 보기 νŽΈν•œ ν˜•νƒœλ‘œ 기술된 것이닀. κ·Έλž˜μ„œ μ‹€ν–‰ 엔진은 이와 같은 λ°”μ΄νŠΈ μ½”λ“œλ₯Ό μ‹€μ œλ‘œ JVM λ‚΄λΆ€μ—μ„œ 기계가 μ‹€ν–‰ν•  수 μžˆλŠ” ν˜•νƒœλ‘œ λ³€κ²½ν•œλ‹€.
  • μ‹€ν–‰ 엔진은 μžλ°” λ°”μ΄νŠΈ μ½”λ“œλ₯Ό λͺ…λ Ήμ–΄ λ‹¨μœ„λ‘œ μ½μ–΄μ„œ μ‹€ν–‰ν•œλ‹€.
  • 2가지 방식이 μ‘΄μž¬ν•œλ‹€.
    • 졜초의 JVM은 인터프리터 λ°©μ‹μ΄μ—ˆκΈ° λ•Œλ¬Έμ— 속도가 느린 단점이 μ‘΄μž¬ν–ˆμ§€λ§Œ, JIT 컴파일러 방식을 톡해 이 점을 λ³΄μ™„ν–ˆλ‹€.
  1. Interpreter(인터프리터)
  • μžλ°” λ°”μ΄νŠΈ μ½”λ“œλ₯Ό λͺ…λ Ήμ–΄ λ‹¨μœ„λ‘œ μ½μ–΄μ„œ μ‹€ν–‰ν•œλ‹€.
  • ν•œ 쀄씩 μ‹€ν–‰ν•˜κΈ° λ•Œλ¬Έμ— λŠλ¦¬λ‹€.
  1. JIT(Just-In-Time) Compiler
  • 인터프리터 λ°©μ‹μ˜ 단점을 λ³΄μ™„ν•˜κΈ° μœ„ν•΄ λ“±μž₯ν–ˆλ‹€.
  • 인터프리터 λ°©μ‹μœΌλ‘œ μ‹€ν–‰ν•˜λ‹€κ°€ μ μ ˆν•œ μ‹œμ μ— λ°”μ΄νŠΈ μ½”λ“œ 전체λ₯Ό μ»΄νŒŒμΌν•˜μ—¬ λ„€μ΄ν‹°λΈŒ μ½”λ“œλ‘œ λ³€κ²½ν•˜κ³  μ΄ν›„μ—λŠ” 더 이상 μΈν„°ν”„λ¦¬νŒ…ν•˜μ§€ μ•Šκ³  λ„€μ΄ν‹°λΈŒ μ½”λ“œλ‘œ 직접 μ‹€ν–‰ν•˜λŠ” 방식이닀.
  • λ„€μ΄ν‹°λΈŒ μ½”λ“œλŠ” μΊμ‹œμ— λ³΄κ΄€ν•˜κΈ° λ•Œλ¬Έμ— ν•œ 번 컴파일된 μ½”λ“œλŠ” λΉ λ₯΄κ²Œ μˆ˜ν–‰λœλ‹€.
  • ν•œ 번만 μ‹€ν–‰λ˜λŠ” μ½”λ“œλΌλ©΄ JIT μ»΄νŒŒμΌλŸ¬κ°€ μ»΄νŒŒμΌν•˜λŠ” 게 μΈν„°ν”„λ¦¬νŒ…ν•˜λŠ” 것보닀 였래 κ±Έλ¦¬λ―€λ‘œ μΈν„°ν”„λ¦¬νŒ…ν•˜λŠ” 것이 μœ λ¦¬ν•˜λ‹€.
  • 이처럼 ν•΄λ‹Ή λ©”μ†Œλ“œκ°€ μ–Όλ§ˆλ‚˜ 자주 μˆ˜ν–‰λ˜λŠ”μ§€ μ²΄ν¬ν•˜κ³  일정 정도λ₯Ό λ„˜μ„ λ•Œλ§Œ μ»΄νŒŒμΌμ„ μˆ˜ν–‰ν•˜λŠ” 게 μ’‹λ‹€.

[Garbage Collector]

  • GCλ₯Ό μˆ˜ν–‰ν•˜λŠ” λͺ¨λ“ˆμ΄ μ‘΄μž¬ν•œλ‹€.

[Runtime Data Area]

  • JVM이 ν”„λ‘œκ·Έλž¨μ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ OSλ‘œλΆ€ν„° 할당받은 λ©”λͺ¨λ¦¬ 곡간이닀.
  • 이 곡간은 μš©λ„μ— 따라 μ—¬λŸ¬ μ˜μ—­μœΌλ‘œ λ‚˜λˆ„μ–΄ κ΄€λ¦¬ν•œλ‹€.

  1. PC Register

    • Threadκ°€ μ‹œμž‘λ  λ•Œ, 각각의 Thread λ³„λ‘œ μƒμ„±λ˜λŠ” κ³΅κ°„μœΌλ‘œ ν˜„μž¬ μˆ˜ν–‰ 쀑인 JVM λͺ…λ Ήμ–΄ μ£Όμ†Œλ₯Ό κ°€μ§€κ²Œ λœλ‹€.
  2. JVM μŠ€νƒ μ˜μ—­

    • ν”„λ‘œκ·Έλž¨μ˜ μ‹€ν–‰ κ³Όμ •μ—μ„œ μž„μ‹œλ‘œ ν• λ‹Ήλ˜μ—ˆλ‹€κ°€ λ©”μ†Œλ“œλ₯Ό λΉ μ Έλ‚˜κ°€λ©΄ λ°”λ‘œ μ†Œλ©Έλ˜λŠ” νŠΉμ„±μ˜ 데이터λ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•œ μ˜μ—­μ΄λ‹€.
    • λ©”μ†Œλ“œμ˜ λ§€κ°œλ³€μˆ˜, 지역 λ³€μˆ˜ λ“± λ©”μ†Œλ“œμ˜ 정보λ₯Ό μ €μž₯ν•œλ‹€.
  3. Natvie Method Stack

    • Javaμ™Έμ˜ μ–Έμ–΄λ‘œ μž‘μ„±λœ λ„€μ΄ν‹°λΈŒ μ½”λ“œλ₯Ό μœ„ν•œ μ˜μ—­μ΄λ‹€.
    • μžλ°” ν”„λ‘œκ·Έλž¨μ΄ 컴파일 λ˜μ–΄ μƒμ„±λ˜λŠ” λ°”μ΄νŠΈ μ½”λ“œκ°€ μ•„λ‹Œ μ‹€μ œ μ‹€ν–‰ν•  수 μžˆλŠ” κΈ°κ³„μ–΄λ‘œ μž‘μ„±λœ ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰μ‹œν‚€λŠ” μ˜μ—­μ΄λ‹€.
  4. Method Area(Class Area, Static Area)

    • 클래슀 정보λ₯Ό 처음 λ©”λͺ¨λ¦¬ 곡간에 올릴 λ•Œ, μ΄ˆκΈ°ν™” λ˜λŠ” λŒ€μƒμ„ μ €μž₯ν•˜κΈ° μœ„ν•œ λ©”λͺ¨λ¦¬ 곡간.
    • λͺ¨λ“  μ“°λ ˆλ“œκ°€ κ³΅μœ ν•˜λŠ” λ©”λͺ¨λ¦¬ μ˜μ—­μ΄λ‹€. 클래슀, μΈν„°νŽ˜μ΄μŠ€, λ©”μ†Œλ“œ, ν•„λ“œ, Static λ³€μˆ˜ λ“±μ˜ λ°”μ΄νŠΈ μ½”λ“œλ₯Ό λ³΄κ΄€ν•œλ‹€.
    • Runtime Constant Poolμ΄λΌλŠ” 것이 μ‘΄μž¬ν•˜λ©°, μ΄λŠ” λ³„λ„μ˜ 관리 μ˜μ—­μœΌλ‘œ μƒμˆ˜ μžλ£Œν˜•μ„ μ €μž₯ν•˜μ—¬ μ°Έμ‘°ν•˜κ³  쀑볡을 λ§‰λŠ” 역할을 μˆ˜ν–‰ν•œλ‹€. (각 ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€μ˜ μƒμˆ˜, λ©”μ†Œλ“œμ™€ ν•„λ“œμ— λŒ€ν•œ λͺ¨λ“  레퍼런슀λ₯Ό λ‹΄κ³  μžˆλŠ” ν…Œμ΄λΈ”μ΄λ‹€.)
    • Java 7λΆ€ν„° String Constant Pool은 Heap μ˜μ—­μœΌλ‘œ λ³€κ²½λ˜μ–΄ GC의 관리 λŒ€μƒμ΄ λ˜μ—ˆλ‹€.
  5. Heap(νž™ μ˜μ—­)

    • 객체λ₯Ό μ €μž₯ν•˜λŠ” 가상 λ©”λͺ¨λ¦¬ 곡간이닀.
    • λŸ°νƒ€μž„μ‹œ λ™μ μœΌλ‘œ ν• λ‹Ήν•˜μ—¬ μ‚¬μš©ν•˜λŠ” μ˜μ—­.
    • new μ—°μ‚°μžλ‘œ μƒμ„±λœ 객체와 배열을 μ €μž₯ν•œλ‹€.
    • 클래슀 μ˜μ—­μ— 올라온 ν΄λž˜μŠ€λ“€λ‘œλ§Œ 객체둜 생성할 수 있으며, μ„Έ λΆ€λΆ„μœΌλ‘œ λ‚˜λˆŒ 수 μžˆλ‹€.
    • GC의 관리 λŒ€μƒμ— ν¬ν•¨λœλ‹€.

  • New/Young μ˜μ—­

    • Eden : 객체듀이 졜초둜 μƒμ„±λ˜λŠ” 곡간.
    • Survivor 0/1 : Edenμ—μ„œ μ°Έμ‘°λ˜λŠ” 객체듀이 μ €μž₯λ˜λŠ” 곡간.
  • Old μ˜μ—­

    • New μ˜μ—­μ—μ„œ 일정 μ‹œκ°„ 참쑰되고 살아남은 객체듀이 μ €μž₯λ˜λŠ” 곡간이닀.
    • Eden μ˜μ—­μ—μ„œ μΈμŠ€ν„΄μŠ€κ°€ κ°€λ“μ°¨κ²Œ 되면 첫 번째 GCκ°€ λ°œμƒν•œλ‹€. (minor GC)
    • Eden μ˜μ—­μ— μžˆλŠ” 값듀을 Survivor 1 μ˜μ—­μ— λ³΅μ‚¬ν•˜κ³ , 이 μ˜μ—­μ„ μ œμ™Έν•œ λ‚˜λ¨Έμ§€ μ˜μ—­μ˜ 객체λ₯Ό μ‚­μ œν•œλ‹€.
    • Eden μ˜μ—­μ—μ„œ GCκ°€ ν•œ 번 λ°œμƒν•œ ν›„ 살아남은 κ°μ²΄λŠ” Survivor μ˜μ—­μœΌλ‘œ μ΄λ™ν•œλ‹€. 이 과정을 λ°˜λ³΅ν•˜λ‹€κ°€ 살아남은 κ°μ²΄λŠ” Old μ˜μ—­μœΌλ‘œ μ΄λ™λœλ‹€.
  • Permanent Generation
    • μƒμ„±λœ κ°μ²΄λ“€μ˜ μ£Όμ†Œκ°’μ΄ μ €μž₯λ˜λŠ” 곡간이닀.
    • λ¦¬ν”Œλ ‰μ…˜μ„ μ‚¬μš©ν•˜μ—¬ λ™μ μœΌλ‘œ ν΄λž˜μŠ€κ°€ λ‘œλ”©λ˜λŠ” 경우 μ‚¬μš©λœλ‹€.
    • Old μ˜μ—­μ—μ„œ 살아남은 객체가 μ˜μ›νžˆ λ‚¨μ•„μžˆλŠ” 곳이 μ•„λ‹ˆλ‹€.
    • 이 μ˜μ—­μ—μ„œ λ°œμƒν•˜λŠ” GCλŠ” Major GC의 νšŸμˆ˜μ— ν¬ν•¨λœλ‹€.