ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Live Study - Java JVM 에 λŒ€ν•΄
    Hello, World πŸ’»/Java β˜•οΈ 2020. 11. 21. 21:47

    JVM, Java Virtual Machine

    • JVM μ΄λž€ Java Virtual Machine 의 μ•½μžλ₯Ό λ”°μ„œ 쀄여 λΆ€λ₯΄λŠ” μš©μ–΄μ΄λ‹€.
    • JVM 은 μžλ°” λ°”μ΄νŠΈμ½”λ“œλ₯Ό μ‹€ν–‰ν•  수 μžˆλŠ” 주체이닀.
    • μžλ°” λ°”μ΄νŠΈμ½”λ“œλŠ” ν”Œλž«νΌμ— 독립적이며 λͺ¨λ“  μžλ°” 가상 머신은 μžλ°” 가상 λ¨Έμ‹  κ·œκ²©μ— μ •μ˜λœ λŒ€λ‘œ μžλ°” λ°”μ΄νŠΈμ½”λ“œλ₯Ό μ‹€ν–‰ν•œλ‹€.
    • ν‘œμ€€ μžλ°” APIκΉŒμ§€ λ™μΌν•œ λ™μž‘μ„ ν•˜λ„λ‘ κ΅¬ν˜„ν•œ μƒνƒœμ—μ„œλŠ” 이둠적으둜 λͺ¨λ“  μžλ°” ν”„λ‘œκ·Έλž¨μ€ CPU, 운영체제의 μ’…λ₯˜μ™€ λ¬΄κ΄€ν•˜κ²Œ λ™μΌν•˜κ²Œ λ™μž‘ν•  것을 보μž₯ν•œλ‹€.
    Virtual Machine, 가상 머신은 μ»΄ν“¨νŒ… ν™˜κ²½μ„ μ†Œν”„νŠΈμ›¨μ–΄λ‘œ κ΅¬ν˜„ν•œ 것이닀. 컴퓨터 μ•ˆμ˜ 컴퓨터라고 μƒκ°ν•˜λ©΄ 쉽닀. 가상 머신에 OS, Application을 μ„€μΉ˜ & μ‹€ν–‰ν•  수 μžˆλ‹€.

    λ°”μ΄νŠΈμ½”λ“œ

    λ‹¨μˆœνžˆ μžλ°”μ—μ„œλ§Œ λ°”μ΄νŠΈμ½”λ“œλ₯Ό μ‚¬μš©ν•˜λŠ”κ²Œ μ•„λ‹ˆλ‹€. λ‹€λ₯Έ μ—¬λŸ¬ μ–Έμ–΄, ν™˜κ²½μ—μ„œλ„ λ°”μ΄νŠΈμ½”λ“œλ₯Ό μ‚¬μš©ν•˜κ³  μžˆλ‹€. μœ„ν‚€λ₯Ό μ°Έμ‘°ν•΄λ³΄λ‹ˆ λ¦¬μŠ€ν”„μ˜ νŠΉμ • κ΅¬ν˜„μ²΄, λ§ˆμ΄ν¬λ‘œμ†Œν”„νŠΈμ˜ CIL, 이λ§₯슀, 루아 등이 μ˜ˆμ΄λ‹€.

    κ°œλ…

    • λ°”μ΄νŠΈμ½”λ“œ(Byte Code, Portable Code, P - Code)λŠ” νŠΉμ • ν•˜λ“œμ›¨μ–΄κ°€ μ•„λ‹Œ 가상 μ»΄ν“¨ν„°μ—μ„œ λŒμ•„κ°€λŠ” μ‹€ν–‰ ν”„λ‘œκ·Έλž¨μ„ μœ„ν•œ 이진 ν‘œν˜„λ²•μ΄λ‹€.
    • λ°”μ΄νŠΈμ½”λ“œλŠ” νŠΉμ • ν•˜λ“œμ›¨μ–΄μ— λŒ€ν•œ μ˜μ‘΄μ„±μ„ 쀄이고, μΈν„°ν”„λ¦¬νŒ…λ„ μ‰¬μš΄ 결과물을 μƒμ„±ν•˜κ³ μž ν•˜λŠ” ν”„λ‘œκ·Έλž˜λ° 언어에 μ˜ν•΄ 좜λ ₯ μ½”λ“œμ˜ ν•œ ν˜•νƒœλ‘œ μ‚¬μš©λœλ‹€. 컴파일 된 λ°”μ΄νŠΈμ½”λ“œλŠ” νŠΉμ • ν•˜λ“œμ›¨μ–΄μ˜ 기계 μ½”λ“œλ₯Ό λ§Œλ“œλŠ” 컴파일러의 μž…λ ₯으둜 μ‚¬μš©λ˜κ±°λ‚˜, 가상 μ»΄ν“¨ν„°μ—μ„œ λ°”λ‘œ μ‹€ν–‰λœλ‹€.
    • μ†Œν”„νŠΈμ›¨μ–΄μ— μ˜ν•΄ 처리되기 λ•Œλ¬Έμ— 보톡 기계어보닀 더 좔상적이닀.
    • λ°”μ΄νŠΈμ½”λ“œλŠ” λŒ€λΆ€λΆ„μ˜ λͺ…λ Ή 집합이 0개 μ΄μƒμ˜ 맀개 λ³€μˆ˜λ₯Ό κ°–λŠ” 1λ°”μ΄νŠΈ 크기의 λͺ…λ Ή μ½”λ“œμ˜€κΈ° λ•Œλ¬Έμ— λ°”μ΄νŠΈμ½”λ“œλΌκ³  뢈리게 λ˜μ—ˆλ‹€κ³  ν•œλ‹€.

    λ°”μ΄νŠΈμ½”λ“œμ˜ μ‹€ν–‰

    • λ°”μ΄νŠΈμ½”λ“œ ν”„λ‘œκ·Έλž¨μ€ 보톡 인터프리터가 ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ λͺ…λ Ήμ–΄λ₯Ό 읽은 후에 μ‹€ν–‰ν•œλ‹€. μ΄λŸ¬ν•œ ν˜•νƒœμ˜ λ°”μ΄νŠΈμ½”λ“œ μΈν„°ν”„λ¦¬ν„°λŠ” 높은 이식성을 κ°–λŠ”λ‹€.
    • λ‹€λ₯Έ ν˜•νƒœλ‘œμ„œ JIT (Just In Time, JIT) 컴파일러라 λΆˆλ¦¬λŠ” μ‹œμŠ€ν…œμ€ μ‹€ν–‰ 쀑에 ν•„μš”μ— 따라 λ°”μ΄νŠΈμ½”λ“œλ₯Ό κΈ°κ³„μ–΄λ‘œ λ²ˆμ—­ν•œλ‹€. 이 방법은 가상 μ»΄ν“¨ν„°μ˜ 이식성을 μ—†μ• μ§€λ§Œ, λ°”μ΄νŠΈμ½”λ“œ μžμ²΄μ— λŒ€ν•œ 이식성을 μžƒμ§€λŠ” μ•ŠλŠ”λ‹€.

    μžλ°”μ˜ λ°”μ΄νŠΈμ½”λ“œλŠ”?

    • μžλ°” λ°”μ΄νŠΈμ½”λ“œλŠ” JVM이 μ‹€ν–‰ν•˜λŠ” λͺ…λ Ήμ–΄μ˜ ν˜•νƒœμ΄λ‹€.
    • 각각의 λ°”μ΄νŠΈμ½”λ“œλŠ” 1λ°”μ΄νŠΈλ‘œ κ΅¬μ„±λ˜μ§€λ§Œ, λͺ‡ 개의 νŒŒλΌλ―Έν„°κ°€ μ‚¬μš©λ˜λŠ” κ²½μš°κ°€ μžˆμ–΄μ„œ 1λ°”μ΄νŠΈ μ΄μƒμœΌλ‘œ κ΅¬μ„±λ˜λŠ” κ²½μš°λ„ μžˆλ‹€.

    JIT, Just In Time 컴파일러

    • JIT 컴파일 λ˜λŠ” 동적 λ²ˆμ—­μ€ ν”„λ‘œκ·Έλž¨μ„ μ‹€μ œ μ‹€ν–‰ν•˜λŠ” μ‹œμ μ— κΈ°κ³„μ–΄λ‘œ λ²ˆμ—­ν•˜λŠ” 컴파일 기법이닀.
    • ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜λ©΄μ„œ μ›μ‹œμ½”λ“œλ₯Ό ν•œ λ²ˆμ— ν•œ 쀄 μ”© μ½μ–΄μ„œ μ‹€ν–‰ν•˜λŠ” 인터프리터, ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 전에 λͺ¨λ“  μ›μ‹œ μ½”λ“œλ₯Ό κΈ°κ³„μ–΄λ‘œ λ²ˆμ—­ν•΄ μ‹€ν–‰ν•˜λŠ” 정적 컴파일 방식 쀑간쯀에 μœ„μΉ˜ν•˜λŠ” 방법이닀.
    • JIT 컴파일 방식은 인터프리터 λ°©μ‹μ˜ μ–Έμ–΄ κ΅¬ν˜„λ“€μ˜ μ„±λŠ₯ ν–₯상을 λͺ©μ μœΌλ‘œ λ„μž…ν•˜λŠ” κ²½μš°κ°€ λ§Žλ‹€. 맀번 같은 μ½”λ“œλ₯Ό ν•΄μ„ν•˜λŠ” λŒ€μ‹  처음 싀행될 땐 μΈν„°ν”„λ¦¬νŠΈλ₯Ό ν•˜λ©΄μ„œ 자주 μ“°μ΄λŠ” μ½”λ“œλ₯Ό μΊμ‹±ν•˜κ³ , μ΄ν›„μ—λŠ” μΊμ‹±λœ μ½”λ“œλ₯Ό κ°€μ Έλ‹€ μ“°λ©΄μ„œ μΈν„°ν”„λ¦¬ν„°μ˜ 느린 μ‹€ν–‰ 속도λ₯Ό κ°œμ„ ν•  수 μžˆλ‹€κ³  ν•œλ‹€.
    • JVM 은 λ°”μ΄νŠΈμ½”λ“œλ₯Ό κΈ°κ³„μ–΄λ‘œ λ²ˆμ—­ν•  λ•Œ JIT 컴파일러λ₯Ό μ‚¬μš©ν•œλ‹€.
    • JVM 은 λ‚΄λΆ€μ μœΌλ‘œ μ–΄λ–€ μ½”λ“œκ°€ 자주 μˆ˜ν–‰λ˜λŠ”μ§€ μ²΄ν¬ν•˜κ³ , μ μ ˆν•œ μ‹œμ μ— 컴파일 ν•œλ‹€κ³  ν•œλ‹€.
    • 자주 ν˜ΈμΆœλ˜μ§€ μ•ŠλŠ” μ½”λ“œλŠ” μΈν„°ν”„λ¦¬νŒ…μ„ ν•˜κ³ , 자주 ν˜ΈμΆœλ˜λŠ” μ½”λ“œλ“€μ€ 맀번 λ²ˆμ—­ν•˜κΈ° 보닀 κΈ°κ³„μ–΄λ‘œ λ²ˆμ—­ν•΄ μΊμ‹±ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” 방식이라고 정리할 수 μžˆκ² λ‹€.

    JVM의 κ΅¬μ„±μš”μ†Œ

    JVM은 크게 μ„Έ λΆ€λΆ„μœΌλ‘œ λ‚˜λˆŒ 수 μžˆλ‹€. ν΄λž˜μŠ€λ‘œλ”(Class Loader), μ‹€ν–‰ 엔진(Execution Engine), Runtime Data Area (JVM Memory)

     

    # Class Loader, 클래슀 λ‘œλ”

    • μžλ°” 클래슀λ₯Ό JVM으둜 동적 λ‘œλ“œν•œλ‹€. ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 쀑에 클래슀λ₯Ό λ‘œλ“œν•˜λŠ” 것이닀.

    • ν΄λž˜μŠ€λ‘œλ”κ°€ 라이브러리λ₯Ό μœ„μΉ˜μ‹œν‚€κ³  λ‚΄μš©λ¬Όμ„ μ½μœΌλ©΄μ„œ λΌμ΄λΈŒλŸ¬λ¦¬λ“€ μ•ˆμ— ν¬ν•¨λœ ν΄λž˜μŠ€λ“€μ„ μ½λŠ” 역할을 ν•œλ‹€.

    • 일반적으둜 ν΄λž˜μŠ€λ“€μ€ μš”μ²­ μ‹œ ν•œ μ°¨λ‘€λ§Œ λ‘œλ“œλœλ‹€. 즉, ν”„λ‘œκ·Έλž¨μ— μ˜ν•΄ 호좜될 λ•ŒκΉŒμ§€ λ‘œλ“œν•˜μ§€ μ•ŠλŠ”λ‹€.

    • μžλ°”μ˜ λŸ°νƒ€μž„ μ‹œμŠ€ν…œμ€ ν΄λž˜μŠ€λ‘œλ” λ•Œλ¬Έμ— 파일과 파일 μ‹œμŠ€ν…œμ— λŒ€ν•΄ μ•Œ ν•„μš”κ°€ μ—†λ‹€.

    • 3개의 클래슀 λ‘œλ”λ“€μ΄ μžˆλ‹€.

      • λΆ€νŠΈμŠ€νŠΈλž© 클래슀 λ‘œλ” (<JAVA_HOME>/jre/lib)

      • ν™•μž₯ 클래슀 λ‘œλ”((<JAVA_HOME>/jre/lib/ext, java.ext.dirs)

      • μ‹œμŠ€ν…œ 클래슀 λ‘œλ” (java.class.path μ—μ„œ λ³Ό 수 μžˆλŠ” μ‹œμŠ€ν…œ 클래슀 λ‘œλ”λŠ” CLASSPATH ν™˜κ²½λ³€μˆ˜μ— λ§€ν•‘λœλ‹€)

    • μžλ°” 클래슀 λ‘œλ”λŠ” μžλ°”λ‘œ μž‘μ„±λ˜μ–΄ 있기 λ•Œλ¬Έμ— μ‚¬μš©μž μ •μ˜ 클래슀 λ‘œλ”λ₯Ό μž‘μ„±ν•˜λŠ” 것이 κ°€λŠ₯ν•˜λ‹€. λͺ¨λ“  μžλ°” 클래슀 λ‘œλ”λŠ” λΆ€λͺ¨ 클래슀 λ‘œλ”κ°€ 있고, μ΅œμƒμœ„ 클래슀 λ‘œλ”λŠ” λΆ€νŠΈμŠ€νŠΈλž© 클래슀 λ‘œλ”μ΄λ‹€.

    • 클래슀 λ‘œλ”κ°€ 클래슀λ₯Ό λ‘œλ“œν•  λ•Œ, λ‹€μŒκ³Ό 같은 과정을 κ±°μΉœλ‹€

      1. λ‘œλ“œ: 클래슀λ₯Ό νŒŒμΌμ—μ„œ 가져와 JVM λ©”λͺ¨λ¦¬μ— λ‘œλ“œν•œλ‹€.

      2. 검증: 읽어듀은 ν΄λž˜μŠ€κ°€ Java Spec κ³Ό JVM Spec 에 λͺ…μ‹œλœ λŒ€λ‘œ 잘 κ΅¬μ„±λ˜μ–΄ μžˆλŠ”μ§€ κ²€μ‚¬ν•œλ‹€.

      3. μ€€λΉ„: ν΄λž˜μŠ€κ°€ ν•„μš”λ‘œ ν•˜λŠ” λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•œλ‹€. ν΄λž˜μŠ€μ—μ„œ μ •μ˜λœ ν•„λ“œ, λ©”μ„œλ“œ, μΈν„°νŽ˜μ΄μŠ€λ“€μ„ λ‚˜νƒ€λ‚΄λŠ” 데이터 ꡬ쑰λ₯Ό μ€€λΉ„ν•œλ‹€.

      4. 뢄석: 클래슀의 μƒμˆ˜ ν’€ λ‚΄μ˜ λͺ¨λ“  심볼릭 레퍼런슀λ₯Ό λ‹€μ΄λ ‰νŠΈ 래퍼런슀λ₯Ό λ³€κ²½ν•œλ‹€.

      5. μ΄ˆκΈ°ν™”: 클래슀 λ³€μˆ˜λ“€μ„ μ μ ˆν•œ κ°’μœΌλ‘œ μ΄ˆκΈ°ν™”ν•œλ‹€.

     

    # Runtime Data Area

    • Runtime Data Area λŠ” JVM이 OS μœ„μ—μ„œ μ‹€ν–‰λ˜λ©΄μ„œ ν• λ‹Ήλ°›λŠ” λ©”λͺ¨λ¦¬ μ˜μ—­μ΄λ‹€.
    • Runtime Data Area 은 λ‹€μŒκ³Ό 같이 Thread, Heap, Method Area 둜 λ‚˜λ‰˜κ³  각 μ˜μ—­ λ‚΄μ—μ„œ 더 μƒμ„Ένžˆ λ‚˜λˆŒ 수 μžˆλ‹€.
      • Thread
        • PC Register
        • JVM Stack
        • Native Method Stack
      • Heap
      • Method Area
        • Runtime Constant Pool

    • Thread λ§ˆλ‹€ PC Register, JVM Stack, Native Method Stack 이 μƒμ„±λœλ‹€.
    • Heap, Method Area λŠ” λͺ¨λ“  Thread κ°€ κ³΅μœ ν•΄μ„œ μ‚¬μš©ν•œλ‹€.

     

    Thread

    PC Register

    • PC Register λŠ” ν˜„μž¬ μˆ˜ν–‰ 쀑인 JVM λͺ…λ Ήμ˜ μ£Όμ†Œλ₯Ό 가지고 μžˆλ‹€.

    JVM Stack

    • Stack Frame μ΄λΌλŠ” ꡬ쑰체λ₯Ό μ €μž₯ν•˜λŠ” μŠ€νƒμœΌλ‘œ, JVM은 였직 JVM Stack에 Stack Frame 을 μΆ”κ°€ν•˜κ³  μ œκ±°ν•˜λŠ” λ™μž‘λ§Œ μˆ˜ν–‰ν•œλ‹€.

    • μ˜ˆμ™Έ λ°œμƒ μ‹œ printStackTrace() λ“±μ˜ λ©”μ„œλ“œλ‘œ λ³΄μ—¬μ£ΌλŠ” Stack Trace의 각 라인은 ν•˜λ‚˜μ˜ Stack Frame 을 ν‘œν˜„ν•œλ‹€.

    • Stack Frame 은 

      • JVM λ‚΄μ—μ„œ λ©”μ„œλ“œκ°€ μˆ˜ν–‰λ  λ•Œλ§ˆλ‹€ ν•˜λ‚˜μ˜ Stack Frame 이 μƒμ„±λ˜μ–΄ ν•΄λ‹Ή Thead의 JVM Stack에 μΆ”κ°€λ˜κ³  λ©”μ„œλ“œκ°€ μ’…λ£Œλ˜λ©΄ μ œκ±°λœλ‹€.

      • Stack Frame은 μ§€μ—­λ³€μˆ˜λ°°μ—΄, ν”Όμ—°μ‚°μž μŠ€νƒ, ν˜„μž¬ μ‹€ν–‰ 쀑인 λ©”μ„œλ“œκ°€ μ†ν•œ 클래슀의 λŸ°νƒ€μž„ μƒμˆ˜ 풀에 λŒ€ν•œ 레퍼런슀λ₯Ό κ°–λŠ”λ‹€.

        • μ§€μ—­λ³€μˆ˜λ°°μ—΄

          • 0 λΆ€ν„° μ‹œμž‘ν•˜λŠ” 인덱슀λ₯Ό 가진 λ°°μ—΄

          • 0 은 λ©”μ„œλ“œκ°€ μ†ν•œ 클래슀 μΈμŠ€ν„΄μŠ€μ˜ this 레퍼런슀

          • 1 λΆ€ν„°λŠ” λ©”μ„œλ“œμ— μ „λ‹¬λœ νŒŒλΌλ―Έν„°λ“€

          • λ©”μ„œλ“œ νŒŒλΌλ―Έν„° 이후뢀턴 λ©”μ„œλ“œμ˜ μ§€μ—­λ³€μˆ˜λ“€

        • ν”Όμ—°μ‚°μž μŠ€νƒ

          • λ©”μ„œλ“œμ˜ μ‹€μ œ μž‘μ—… 곡간

          • λ©”μ„œλ“œλŠ” ν”Όμ—°μ‚°μž μŠ€νƒ <-> μ§€μ—­λ³€μˆ˜λ°°μ—΄ μ‚¬μ΄μ—μ„œ 데이터λ₯Ό κ΅ν™˜ν•˜κ³ , λ‹€λ₯Έ λ©”μ†Œλ“œ 호좜 κ²°κ³Όλ₯Ό μΆ”κ°€, μ œκ±°ν•œλ‹€.

    Native Method Stack

    - μžλ°” μ™Έμ˜ μ–Έμ–΄λ‘œ μž‘μ„±λœ λ„€μ΄ν‹°λΈŒ μ½”λ“œλ₯Ό μœ„ν•œ μŠ€νƒμ΄λ‹€. 즉, JNI(Java Native Interface)λ₯Ό 톡해 ν˜ΈμΆœν•˜λŠ” C/C++ λ“±μ˜ μ½”λ“œλ₯Ό μˆ˜ν–‰ν•˜κΈ° μœ„ν•œ μŠ€νƒμ΄λ‹€.

     

    Heap

    • μΈμŠ€ν„΄μŠ€λ‚˜ 객체λ₯Ό μ €μž₯ν•˜λŠ” κ³΅κ°„μœΌλ‘œ 가비지 μ»¬λ ‰μ…˜ λŒ€μƒμ΄λ‹€.
    • JVM μ„±λŠ₯ λ“±μ˜ μ΄μŠˆμ—μ„œ κ°€μž₯ 많이 μ–ΈκΈ‰λ˜λŠ” 곡간이닀.

     

    Method Area

    • λͺ¨λ“  Thead κ°€ κ³΅μœ ν•˜λŠ” μ˜μ—­μœΌλ‘œ JVM이 μ‹œμž‘λ  λ•Œ μƒμ„±λœλ‹€.
    • λ‹€μŒκ³Ό 같은 정보λ₯Ό λ³΄κ΄€ν•œλ‹€.
      • ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€μ— λŒ€ν•œ Runtime Constant Pool
      • ν•„λ“œμ™€ λ©”μ„œλ“œ 정보
      • Static λ³€μˆ˜
      • λ©”μ„œλ“œμ˜ λ°”μ΄νŠΈμ½”λ“œ

    Runtime Constant Pool

    • Method Area 에 ν¬ν•¨λ˜λŠ” μ˜μ—­μ΄μ§€λ§Œ, JVM λ™μž‘μ—μ„œ κ°€μž₯ 핡심적인 역할을 μˆ˜ν–‰ν•œλ‹€.
    • 각 ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€μ˜ μƒμˆ˜ 뿐 μ•„λ‹ˆλΌ, λ©”μ„œλ“œμ™€ ν•„λ“œμ— λŒ€ν•œ λͺ¨λ“  λ ˆνΌλŸ°μŠ€κΉŒμ§€ λ‹΄κ³  μžˆλŠ” ν…Œμ΄λΈ”μ΄λ‹€.
    • 즉, μ–΄λ–€ λ©”μ„œλ“œλ‚˜ ν•„λ“œλ₯Ό μ°Έμ‘°ν•  λ•Œ JVM은 Runtime Constant Pool 을 톡해 μ‹€μ œ λ©”λͺ¨λ¦¬ μƒμ˜ μ£Όμ†Œλ₯Ό μ°ΎλŠ”λ‹€.

     

    # Execution Engine, μ‹€ν–‰ 엔진

    • 클래슀 λ‘œλ”λ₯Ό 톡해 JVM 내에 Runtime Data Area 에 배치된 λ°”μ΄νŠΈμ½”λ“œλŠ” μ‹€ν–‰ 엔진에 μ˜ν•΄ μ‹€ν–‰λœλ‹€.

    • μ‹€ν–‰ 엔진은 μžλ°” λ°”μ΄νŠΈμ½”λ“œλ₯Ό λͺ…λ Ήμ–΄ λ‹¨μœ„λ‘œ μ½μ–΄μ„œ μ‹€ν–‰ν•œλ‹€.

    • μ‹€ν–‰ 엔진은 λ°”μ΄νŠΈμ½”λ“œλ₯Ό JVM λ‚΄λΆ€μ—μ„œ 기계가 μ‹€ν–‰ν•  수 μžˆλŠ” ν˜•νƒœλ‘œ λ³€κ²½ν•œλ‹€. κ·Έ 방식은 λ‹€μŒ 두 가지가 μžˆλ‹€.

      • 인터프리터

        • λ°”μ΄νŠΈμ½”λ“œ λͺ…λ Ήμ–΄λ₯Ό ν•˜λ‚˜μ”© μ½μ–΄μ„œ ν•΄μ„ν•˜κ³  μ‹€ν–‰ν•œλ‹€.

        • λ°”μ΄νŠΈμ½”λ“œλ₯Ό ν•˜λ‚˜μ”© μ‹€ν–‰ν•˜κΈ° λ•Œλ¬Έμ— 해석은 λΉ λ₯΄μ§€λ§Œ, 이 결과의 싀행은 λŠλ¦¬λ‹€λŠ” 단점이 μžˆλ‹€.

      • JIT (Just In Time) 컴파일러

        • μΈν„°ν”„λ¦¬ν„°μ˜ 단점을 λ³΄μ™„ν•˜κΈ° μœ„ν•΄ λ„μž…λ˜μ—ˆλ‹€.

        • 인터프리터 λ°©μ‹μœΌλ‘œ μ‹€ν–‰ν•˜λ‹€κ°€ μ μ ˆν•œ μ‹œμ μ— λ°”μ΄νŠΈμ½”λ“œ 전체λ₯Ό μ»΄νŒŒμΌν•œλ‹€.

        • 이후엔 더 이상 인터프리터 λ°©μ‹μœΌλ‘œ μ‹€ν–‰ν•˜μ§€ μ•Šκ³  λ„€μ΄ν‹°λΈŒ μ½”λ“œλ‘œ 직접 μ‹€ν–‰ν•œλ‹€.

        • λ„€μ΄ν‹°λΈŒ μ½”λ“œλŠ” μΊμ‹±ν•˜κΈ° λ•Œλ¬Έμ— ν•œλ²ˆ 컴파일된 μ½”λ“œλŠ” 계속 λΉ λ₯΄κ²Œ μˆ˜ν–‰λ  수 μžˆλ‹€.

        • JIT μ»΄νŒŒμΌλŸ¬κ°€ 컴파일 ν•˜λŠ” 과정은 λ°”μ΄νŠΈμ½”λ“œλ₯Ό ν•˜λ‚˜μ”© μΈν„°ν”„λ¦¬νŒ…ν•˜λŠ” 것보닀 훨씬 였래 걸리기 λ•Œλ¬Έμ— ν•œλ²ˆλ§Œ μ‹€ν–‰λ˜λŠ” μ½”λ“œλΌλ©΄ μ»΄νŒŒμΌν•˜μ§€ μ•Šκ³  μΈν„°ν”„λ¦¬νŒ…μ„ ν•˜λŠ” 것이 더 μœ λ¦¬ν•˜λ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— JIT 컴파일러λ₯Ό μ‚¬μš©ν•˜λŠ” JVM 은 λ‚΄λΆ€μ μœΌλ‘œ ν•΄λ‹Ή λ©”μ„œλ“œμ˜ 호좜 λΉˆλ„ 등을 체크해 μ μ ˆν•œ μ‹œμ μ— μ»΄νŒŒμΌμ„ μˆ˜ν–‰ν•œλ‹€.


     Java 컴파일 ν•˜λŠ” 방법 & μ‹€ν–‰ν•˜λŠ” 방법 

    • 보톡(거의 100%..)은 IDE λ₯Ό μ‚¬μš©ν•΄ μ»΄νŒŒμΌν•˜κ³  μ‹€ν–‰ν•˜μ§€λ§Œ λ‹€μŒμ€ 터미널을 μ‚¬μš©ν•΄ Java λ₯Ό μ»΄νŒŒμΌν•˜κ³  μ‹€ν–‰ν•˜λŠ” 방법을 정리해보렀고 ν•œλ‹€.
    • JDK λ₯Ό μ„€μΉ˜ν•˜λ©΄ javac 와 java κ°€ ν•¨κ»˜ μ„€μΉ˜λœλ‹€.
    • javac λŠ” Java μ½”λ“œλ₯Ό μ»΄λ°”μΌν•˜λŠ” λͺ…λ Ήμ–΄λ‹€. javac 둜 μ»΄νŒŒμΌν•œ .class νŒŒμΌμ„ java λͺ…λ Ήμ–΄λ‘œ μ‹€ν–‰ν•œλ‹€.
    public class HelloJava {
    	public static void main(String[]args) {
    		System.out.println("Hello, World!");
    	}
    }

     

    javac HelloJava.java ## HelloJava.class 생성
    java HelloJava ## Hello, World!
    • Java 14 둜 μž‘μ„±ν•œ java μ½”λ“œλ₯Ό Java 8 μ—μ„œλ„ μ‹€ν–‰ κ°€λŠ₯ν•˜λ„λ‘ ν•˜λ €κ³  ν•˜λ©΄ target μ˜΅μ…˜μ„ μ‚¬μš©ν•΄ 컴파일 ν•΄μ•Όν•œλ‹€.

    • --target <release>, -target <release>  Generate class files suitable for the specified Java SE release. Supported releases: 7, 8, 9, 10, 11, 12, 13, 14

    javac --target 8 filename

    JDK와 JRE의 차이

    • Java Runtime Environment, JRE λŠ” Java ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ μ‹œν‚¬ 수 μžˆλŠ” ν™˜κ²½μ΄λ‹€. JRE 만 κ°€μ§€κ³ λŠ” μžλ°” ν”„λ‘œκ·Έλž¨μ„ κ°œλ°œν•  μˆ˜λŠ” μ—†λ‹€.
    • Java Development Kit, JDK λŠ” Java ν”„λ‘œκ·Έλž¨μ„ 개발, μ‹€ν–‰ν•˜κΈ° μœ„ν•œ 도ꡬ 등이 λͺ¨λ‘ ν¬ν•¨λ˜μ–΄ μžˆλ‹€.
    • JDK λ₯Ό μ„€μΉ˜ν•˜λ©΄ JRE도 ν•¨κ»˜ μ„€μΉ˜λœλ‹€.
    • Java 9 λΆ€ν„° JREλŠ” λ”°λ‘œ λ°°ν¬ν•˜μ§€ μ•ŠλŠ”λ‹€κ³  ν•œλ‹€.

     

    Reference

     

Designed by Tistory.