ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] JVMμ΄λž€? μžλ°” μ½”λ“œ μ‹€ν–‰
    Android/Java 2021. 1. 11. 01:28
    λ°˜μ‘ν˜•
    • 이 글은 "온라인 μžλ°” μŠ€ν„°λ”” λ‚΄μš©"을 μ •λ¦¬ν•œ κΈ€μž…λ‹ˆλ‹€.

    JVMμ΄λž€?

    • JavaλŠ” λ‹€λ₯Έ 언어와 달리 ν”Œλž«νΌμ— 쒅속적이지 μ•Šλ‹€λŠ” νŠΉμ§•μ„ 가지고 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ νŠΉμ§•μ„ κ°€μ§ˆ 수 있게 λ„μ™€μ£ΌλŠ” μ†Œν”„νŠΈμ›¨μ–΄κ°€ JVMμž…λ‹ˆλ‹€.

    • JVM은 Java Virtual Machine μ•½μ–΄λ‘œ μžλ°” ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰μ‹œν‚€κΈ° μœ„ν•΄ ν•„μˆ˜μ μΈ λŸ°νƒ€μž„ ν™˜κ²½μ„ μ œκ³΅ν•˜λŠ” ν”„λ‘œκ·Έλž¨μž…λ‹ˆλ‹€.

    • JVM의 μ£Όμš” μ—­ν• λ‘œ μžλ°” μ†ŒμŠ€μ½”λ“œκ°€ μ»΄νŒŒμΌμ„ ν•˜μ—¬ λ°”μ΄νŠΈμ½”λ“œλ‘œ λ³€ν•˜κ²Œ 되면 λ°”μ΄νŠΈμ½”λ“œλ₯Ό 각 μš΄μ˜μ²΄μ œμ— λ§žλŠ” κΈ°κ³„μ–΄λ‘œ λ‹€μ‹œ λ²ˆμ—­ν•˜λŠ” 역할을 λ‹΄λ‹Ήν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

    • κ·Έ 외에도 λ©”λͺ¨λ¦¬ 관리, Garbage Collection μ΄λΌλŠ” μ€‘μš”ν•œ 역할을 μˆ˜ν–‰ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.


    컴파일 방법

    μžλ°”λŠ” λΉŒλ“œ μ‹œ, μžλ°” 파일(.java)을 μžλ°” 컴파일러(javac.exe)λ₯Ό μ΄μš©ν•˜μ—¬ JVM이 이해할 수 μžˆλŠ” μ€‘κ°„λ‹¨κ³„μ˜ 언어인 λ°”μ΄νŠΈ μ½”λ“œ(.class)둜 λ°”κΏ”μ€λ‹ˆλ‹€.

    Java ν”„λ‘œκ·Έλž¨μ„ 컴파일 ν•˜λŠ” λŒ€ν‘œμ μΈ IDE둜 Intellj와 eclipseκ°€ μžˆμŠ΅λ‹ˆλ‹€. 이외에도 κ°„λ‹¨ν•œ μžλ°” ν”„λ‘œκ·Έλž¨ 같은 κ²½μš°λŠ” terminal, cmdμ—μ„œλ„ z컴파일이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

    public class Main {
        public static void main(String[] args) {
            System.out.println("Hello world");
        }
    }

    javac < program name > κ³Ό 같이 λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ν•˜λ©΄ terminalμ—μ„œλ„ 싀행이 κ°€λŠ₯ν•©λ‹ˆλ‹€.


    μ‹€ν–‰ 방법

    • 컴파일 ν•˜λŠ” κ³Όμ •μ—μ„œ λ§Œλ“€μ–΄μ§„ λ°”μ΄νŠΈ μ½”λ“œ(_.class)λ₯Ό *_java < class name >** λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ν•˜λ©΄ μ‹€ν–‰μ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

    • λ˜λŠ” java < argument > < program name > λͺ…λ Ήμ–΄λ₯Ό 톡해 μžλ°” ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰μ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.


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

    • μ»΄νŒŒμΌμ΄λž€ μ‚¬λžŒμ΄ 이해할 수 μžˆλŠ” μ–Έμ–΄λ₯Ό 컴퓨터가 이해할 수 μžˆλŠ” μ–Έμ–΄λ‘œ λ°”κΎΈλŠ” κ³Όμ •μœΌλ‘œ μ†ŒμŠ€μ½”λ“œμ—μ„œ λͺ©μ μ½”λ“œλ‘œ λ°”κΎΈλŠ” κ³Όμ •μž…λ‹ˆλ‹€.

    • C, C++ μ†ŒμŠ€μ½”λ“œλŠ” 컴파일 μ‹œ λͺ©μ  μ½”λ“œμΈ κΈ°κ³„μ–΄λ‘œ λ³€ν•˜κ²Œ 되고 javaλŠ” λ°”μ΄νŠΈ μ½”λ“œλ‘œ λ³€ν•˜κ²Œ λ©λ‹ˆλ‹€.

    • μžλ°”μ˜ λ°”μ΄νŠΈ μ½”λ“œλŠ” JVM이 μ‹€ν–‰ν•˜λŠ” λͺ…λ Ήμ–΄ μ§‘ν•©μœΌλ‘œ 컴파일 μ‹œ μƒμ„±λ˜λŠ” .class 파일이 λ°”μ΄νŠΈ μ½”λ“œλ₯Ό λ‹΄κ³  μžˆμŠ΅λ‹ˆλ‹€.

    • λ°”μ΄νŠΈ μ½”λ“œλŠ” OS에 쒅속적이지 μ•ŠλŠ” λͺ…λ Ήμ–΄ 집합을 μ‚¬μš©ν•˜λ©°, 이것이 μžλ°”μ˜ 크둜슀 ν”Œλž«νΌ λ™μž‘μ„ κ°€λŠ₯ν•˜κ²Œ ν•΄μ£ΌλŠ” λΆ€λΆ„μž…λ‹ˆλ‹€.

    • javap < class name > λͺ…λ Ήμ–΄ μž…λ ₯ μ‹œ λ°”μ΄νŠΈ μ½”λ“œλ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.


    JIT 컴파일러

    • λ°”μ΄νŠΈ μ½”λ“œλŠ” 기계가 λ°”λ‘œ 읽을 수 μžˆλŠ” ν˜•νƒœκ°€ μ•„λ‹ˆκ³  이 λ°”μ΄νŠΈ μ½”λ“œλŠ” μ‹€μ œ 싀행될 λ•Œ λ‹€μ‹œ ν•œλ²ˆ 기계가 읽을 수 μžˆλŠ” ν˜•νƒœ(native code)둜 인터프리터λ₯Ό 톡해 λ²ˆμ—­λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

    • μΈν„°ν”„λ¦¬ν„°λŠ” 반볡적인 μž‘μ—…μ΄λ”λΌκ³  계속 λ²ˆμ—­ν•˜λŠ” μž‘μ—…μ„ 거치기 λ•Œλ¬Έμ— 속도가 느릴 수 밖에 μ—†λŠ”λ° μ΄λŸ¬ν•œ 문제λ₯Ό ν•΄κ²°ν•˜λŠ” λ°©λ²•μœΌλ‘œ JIT μ»΄νŒŒμΌλŸ¬κ°€ λ“±μž₯ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

    • JIT μ»΄νŒŒμΌλŸ¬λŠ” 인터프리터 λ°©μ‹μœΌλ‘œ μ‹€ν–‰ν•˜λ‹€κ°€ μ μ ˆν•œ μ‹œμ μ— λ°”μ΄νŠΈμ½”λ“œ 전체λ₯Ό μ»΄νŒŒμΌν•˜μ—¬ 넀이티크 μ½”λ“œλ‘œ λ³€κ²½ν•˜κ³ , μ΄ν›„μ—λŠ” 인터프리킹 ν•˜μ§€ μ•Šκ³  λ„€μ΄ν‹°λΈŒ μ½”λ“œλ‘œ 직접 μ‹€ν–‰ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€. λ„€μ΄ν‹°λΈŒ μ½”λ“œλŠ” μΊμ‹œμ— λ³΄κ΄€ν•˜κΈ° λ•Œλ¬Έμ— ν•œλ²ˆ 컴파일된 μ½”λ“œλŠ” λΉ λ₯΄κ²Œ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    • JIT μ»΄νŒŒμΌλŸ¬κ°€ μ»΄νŒŒμΌν•˜λŠ” 과정은 λ°”μ΄νŠΈμ½”λ“œλ₯Ό μΈν„°ν”„λ¦¬νŒ…ν•˜λŠ” 것보닀 였래걸리기 λ•Œλ¬Έμ— JIT 컴파일러λ₯Ό μ‚¬μš©ν•˜λŠ” JVM은 ν•΄λ‹Ή λ©”μ†Œλ“œκ°€ μ–Όλ§ˆλ‚˜ 자주 μˆ˜ν–‰λ˜λŠ” 지 μ²΄ν¬ν•˜κ³ , 적정 μˆ˜μ€€μ„ λ„˜μ„ κ²½μš°μ— μ»΄νŒŒμΌμ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.


    JVM의 ꡬ성

    Class Loader

    JVM λ‚΄λ‘œ .classνŒŒμΌμ„ λ‘œλ“œν•˜κ³ , 링크λ₯Ό 톡해 λ°°μΉ˜ν•˜λŠ” μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” λͺ¨λ“ˆμž…λ‹ˆλ‹€.
    λŸ°νƒ€μž„ μ‹œ λ™μ μœΌλ‘œ 클래슀λ₯Ό λ‘œλ“œν•˜λŠ”λ° jar파일 λ‚΄ μ €μž₯된 ν΄λž˜μŠ€λŠ” JVM μœ„μ— νƒ‘μž¬ν•˜κ³  μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” ν΄λž˜μŠ€λŠ” λ©”λͺ¨λ¦¬μ—μ„œ μ‚­μ œν•©λ‹ˆλ‹€. 즉 클래슀λ₯Ό 처음으둜 μ°Έμ‘°ν•  λ•Œ, ν•΄λ‹Ή 클래슀λ₯Ό λ‘œλ“œν•˜κ³  λ§ν¬ν•˜λŠ” 역할을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.

    Exection Engine

    클래슀λ₯Ό μ‹€ν–‰μ‹œν‚€λŠ” μ—­ν• μž…λ‹ˆλ‹€. 클래슀 λ‘œλ”κ°€ JVMλ‚΄μ˜ λŸ°νƒ€μž„ 데이터 μ˜μ—­μ— λ°”μ΄νŠΈ μ½”λ“œλ₯Ό λ°°μΉ˜μ‹œν‚€κ³ , 싀행엔진에 μ˜ν•΄ μ‹€ν–‰λ©λ‹ˆλ‹€.
    싀행엔진은 λ°”μ΄νŠΈμ½”λ“œλ₯Ό μ‹€μ œλ‘œ JVMλ‚΄λΆ€μ—μ„œ 기계가 μ‹€ν–‰ν•  수 μžˆλŠ” ν˜•νƒœλ‘œ λ³€κ²½ν•©λ‹ˆλ‹€. 이 λ•Œ InterPreter와 JIT 방식이 μ‚¬μš©λ©λ‹ˆλ‹€.

    Garbage Collector

    λ©”λͺ¨λ¦¬ 관리 기법 쀑 ν•˜λ‚˜λ‘œ ν”„λ‘œκ·Έλž¨μ΄ λ™μ μœΌλ‘œ ν• λ‹Ήν–ˆλ˜ λ©”λͺ¨λ¦¬ μ˜μ—­ 쀑 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” μ˜μ—­μ„ ν•΄μ œν•˜λŠ” κΈ°λŠ₯μž…λ‹ˆλ‹€.



    JDK와 JRE의 차이

    https://medium.com/@mannverma/the-secret-of-java-jdk-jre-jvm-difference-fa35201650ca

    JRE

    JRE (Java Runtime Environment)λŠ” Java ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ‘œ μž‘μ„±λœ μ‘μš© ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜κΈ° μœ„ν•œ 라이브러리, Java Virtual Machine 및 기타 ꡬ성 μš”μ†Œλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

    JDK

    JDK (Java Development Kit)λŠ” JRE의 μƒμœ„ 집합이며 JRE에 μžˆλŠ” λͺ¨λ“  ν•­λͺ©κ³Ό μ‘μš© ν”„λ‘œκ·Έλž¨ κ°œλ°œμ— ν•„μš”ν•œ 컴파일러 및 디버거와 같은 도ꡬλ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€.

    λ°˜μ‘ν˜•
Designed by Tistory.