ch19 : JVM

λͺ©μ°¨

  1. GC

JVM JRE JDK

image
  • JVM (Java Virtual Machine)

    • μžλ°” ν”„λ‘œκ·Έλž¨μ΄ μˆ˜ν–‰λ˜λŠ” ν”„λ‘œκ·Έλž¨μ΄λ‹€. μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ€ JVM μœ„μ—μ„œ λ™μž‘ν•œλ‹€.

  • JRE (Java Runtime Environment) :

    • (μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ 일반 μ‚¬μš©μžλ“€μ„ μœ„ν•œ) 싀행을 μœ„ν•œ ν™˜κ²½

    • μžλ°” 클래슀 라이브러리(Java class libraries) + μžλ°” 가상 λ¨Έμ‹ (JVM)

  • JDK (Java Develope Kit)

    • 개발자λ₯Ό μœ„ν•œ ν™˜κ²½

    • JRE에 μΆ”κ°€λ‘œ μžλ°” ν”„λ‘œκ·Έλž¨μ„ κ°œλ°œν•˜λŠ” 데 ν•„μš”ν•œ 컴파일러, 디버거와 같은 λͺ…λ Ήμ–΄ν–‰ 개발 도ꡬ도 ν¬ν•¨λœλ‹€.

μžλ°”λŠ” OS에 독립적이닀

  • μ–΄λ–€ OS둜 접근해도 JAVAλ₯Ό μ‚¬μš©ν•˜λ €λ©΄ JVMλ₯Ό ν†΅ν•΄μ„œ λ™μž‘ν•˜κΈ° λ•Œλ¬Έμ— (즉, OSμœ„μ— JRE/JDKλ₯Ό λ‹€μš΄ λ°›μ•„μ„œ λ™μž‘μ‹œν‚΄) OS에 λ…λ¦½μ μ΄κ²Œ μ½”λ”©ν•  수 μžˆλ‹€. (Write Once Run Anywhere)

  • c/c++λ“± μžλ°” μ΄μ „μ˜ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ“€μ˜ μ»΄νŒŒμΌλŸ¬λŠ” 기계어 μ½”λ“œλ‘œ λ³€ν™˜ν•  λ•Œ ν”„λ‘œκ·Έλž¨μ΄ 싀행될 λŒ€μƒ μ»΄ν“¨ν„°μ˜ cpu와 μš΄μ˜μ²΄μ œμ— 쒅속적인 μ½”λ“œλ‘œ λ³€ν™˜ν•˜λŠ” 과정을 κ±°μΉœλ‹€.

JIT 컴파일러

Interpreter (μΈν„°ν”„λ¦¬νŠΈ) 방식 : μ†ŒμŠ€μ½”λ“œλ₯Ό μ»΄νŒŒμΌμ‹œμ— λ³€ν™˜ν•˜μ§€ μ•Šκ³ , ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•  λ•Œ(λŸ°νƒ€μž„ μ‹œ)λ§ˆλ‹€ λ³€ν™˜ β†’ κ°„νŽΈν•˜λ‚˜ 속도가 느림 Static Complie (정적 컴파일) 방식 : μ‹€ν–‰ 전에 μ „λΆ€ κΈ°κ³„μ–΄λ‘œ λ³€ν™˜ν•œλ‹€.

JIT (Just-In-Time)λž€

  • μžλ°”μ—μ„œ μ‚¬μš©ν•˜λŠ” λ°”μ΄νŠΈμ½”λ“œλ₯Ό κΈ°κ³„μ–΄λ‘œ λ³€ν™˜ν•˜λŠ” λ°©μ‹μœΌλ‘œ, μΈν„°ν”„λ¦¬νŠΈμ™€ 정적 컴파일 방식을 ν˜Όν•©ν•œ 방식이닀.

  • 인터프리터에 μ˜ν•΄ μƒˆλ‘œμš΄ μ½”λ“œλ₯Ό κΈ°κ³„μ–΄λ‘œ λ³€ν™˜ν•˜λŠ” μž‘μ—…μ„ κ³„μ†ν•˜κ³  + ν•œλ²ˆ λ³€ν™˜λœ μ½”λ“œλŠ” μΊμ‹œμ— μ €μž₯ν•˜μ˜€λ‹€κ°€ ν•„μš”μ‹œ μž¬μ‚¬μš©ν•œλ‹€.

    • λ”°λΌμ„œ 반볡적으둜 μˆ˜ν–‰λ˜λŠ” μ½”λ“œλŠ” λΉ λ₯΄κ²Œ μˆ˜ν–‰λ˜κ³ , 처음 μ‹œμž‘ν•˜λŠ” μ½”λ“œλŠ” λ³€ν™˜ν•΄μ•Όν•˜λ―€λ‘œ 속도가 λŠλ¦¬λ‹€.

  • 동적 λ³€ν™˜μ΄λΌκ³ λ„ ν•˜λ©°, Java와 C#μ—μ„œ μ‚¬μš©ν•œλ‹€.

JVM λ™μž‘ κ³Όμ • - μ—¬κΈ°μ„œ JITλŠ” μ–Έμ œ?

image
  1. μžλ°” μ†ŒμŠ€(.java)λ₯Ό μžλ°” 컴파일러λ₯Ό 톡해 μžλ°” λ°”μ΄νŠΈ μ½”λ“œ(.class)둜 μ»΄νŒŒμΌν•œλ‹€.

  2. μžλ°”λŠ” 클래슀 νŒŒμΌμ„ λ™μ μœΌλ‘œ μ½μ–΄μ˜¨λ‹€. 즉, JVM이 λ™μž‘ν•˜λ‹€κ°€ 클래슀 νŒŒμΌμ„ μ°Έμ‘°ν•˜λŠ” μˆœκ°„ λ™μ μœΌλ‘œ μ½μ–΄μ„œ λ©”λͺ¨λ¦¬μ— λ‘œλ“œν•œλ‹€.

  3. μ‹€ν–‰ μ—”μ§„(Execution Engine)은 JVM λ©”λͺ¨λ¦¬(Runtime Data Area)에 올라온 λ°”μ΄νŠΈ μ½”λ“œλ“€μ„ λͺ…λ Ήμ–΄ λ‹¨μœ„λ‘œ ν•˜λ‚˜μ”© κ°€μ Έμ™€μ„œ μ‹€ν–‰ν•©λ‹ˆλ‹€.

μœ„ κ³Όμ •μ—μ„œ JVM의 Execution Engine이 λ°”μ΄νŠΈμ½”λ“œλ₯Ό κΈ°κ³„μ–΄λ‘œ λ³€ν™˜ν•˜λŠ” 방식이 JIT 컴파일러 방식이닀.

Hotspot

  • Hotspot JVM은 μ„±λŠ₯이 μ €ν•˜κ°€ λ λ§Œν•œ λΆ€λΆ„(HotSpot)을 μ°Ύκ³ , ν•΄λ‹Ή λΆ€λΆ„μ—μ„œ JIT 컴파일러 방식을 μ‚¬μš©ν•œλ‹€.

  • μ΄λ•Œ κΈ°κ³„μ–΄λ‘œ λ³€ν™˜ν•˜λŠ” 방법은 Client와 Server 두 κ°€μ§€κ°€ μžˆλ‹€.

    • HotSpot ν΄λΌμ΄μ–ΈνŠΈ 컴파일러

      • CPU μ½”μ–΄κ°€ ν•˜λ‚˜λΏμΈ μ‚¬μš©μžλ₯Ό μœ„ν•΄ λ§Œλ“€μ–΄μ‘Œλ‹€.

      • μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹œμž‘ μ‹œκ°„μ„ λΉ λ₯΄κ²Œν•˜κ³ , 적은 λ©”λͺ¨λ¦¬λ₯Ό μ μœ ν•˜λ„λ‘ ν•œλ‹€.

    • HotSpot μ„œλ²„ 컴파일러

      • μ½”μ–΄κ°€ λ§Žμ€ μž₯λΉ„μ—μ„œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ 돌리기 μœ„ν•΄ μ‚¬μš©ν•œλ‹€.

      • μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μˆ˜ν–‰ 속도에 초점이 맞좰져 μžˆλ‹€.

Last updated