ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] 1주차 과제 : 자바 소스 파일(.java)을 JVM으로 실행하는 과정
    Java/온라인 자바 스터디 2020. 11. 15. 10:02
    반응형

    목표

    자바 소스 파일(.java)을 JVM으로 실행하는 과정 이해하기


    학습할 것

     - JVM이란 무엇인가

     - 컴파일 하는 방법

     - 실행하는 방법

     - 바이트코드란 무엇인가

     - JIT 컴파일러란 무엇이며 어떻게 동작하는지

     - JVM 구성 요소

     - JDK와 JRE의 차이


    JVM이란 무엇인가

    JVM 'Java virtual machine'을 줄인 것으로 직역하면 '자바를 실행하기 위한 가상 기계'라고 할 수 있다.

    자바로 작성된 어플리케이션은 모두 이 가상 컴퓨터(JVM)에서만 실행되기 때문에, 자바 어플리케이션이 실행되기 위해서는 반드시 JVM이 필요하다.

    일반 어플리케이션의 코드는 OS만 거치고 하드웨어로 전달되는데 비해 Java어플리케이션은 JVM을 한 번 더 거치기 때문에, 그리고 하드웨어에 맞게 완전히 컴파일된 상태가 아니고 실행 시에 해석(interpret)되기 때문에 속도가 느리다는 단점을 가지고 있다. 그러나 요즘엔 바이트코드(컴파일된 자바코드)를 하드웨어의 기계어로 바로 변환해주는 JIT컴파일러와 향상된 최적화 기술이 적용되어서 속도의 격차를 많이 줄였다.

    일반 어플리케이션은 OS와 바로 맞붙어 있기 때문에 OS종속적이다. 그래서 다른 OS에서 실행시키기 위해서는 어플리케이션을 그 OS에 맞게 변경해야한다. 반면에 Java 어플리케이션은 JVM하고만 상호작용을 하기 때문에 OS와 하드웨어에 독립적이라 다른 OS에서도 프로그램의 변경없이 실행이 가능한 것이다. , JVM OS에 종속적이기 때문에 해당 OS에서 실행가능한 JVM이 필요하다.

    그래서 썬에서는 일반적으로 많이 사용되는 주요 OS JVM을 제공하고 있고, 이렇게 함으로써 자바의 중요한 장점 중인 하나의 “Write once, run anywhere.(한 번 작성하면 어디서든 실행된다.)”이 가능하게 되는 것이다.

    출처 : 자바의 정석


    컴파일 하는 방법

    1.자바 소스코드 작성 (Hello.java 작성)

    1
    2
    3
    4
    5
    6
    7
    class Hello
    {    
        public static void main(String[] args)
        {        
            System.out.println("Hello, World.");    
        }
    }
    cs


    2.javac.exe를 실행 (Hello.class 생성)


    실행하는 방법

    java.exe를 실행

     

    내부적인 진행순서

    1.프로그램의 실행에 필요한 클래스(*.class 파일)를 로드한다.

    2.클래스파일을 검사한다. (파일형식, 악성코드 체크)

    3.지정된 클래스(Hello)에서 main(String[] args)를 호출한다.


    JDK bin디렉토리에 있는 주요 실행파일

    javac.exe

    자바 컴파일러, 자바 소스코드를 바이트코드로 컴파일한다.

    java.exe

    자바 인터프리터, 컴파일러가 생성한 바이트코드를 해석하고 실행한다.

    javap.exe

    역어셈블러, 컴파일된 클래스파일을 원래의 소스로 변환한다.

    jar.exe

    압축프로그램, 클래스파일과 프로그램의 실행에 관련된 파일을 하나의 jar파일(.jar)로 압축하거나 압축해제한다.


    바이트코드란 무엇인가

    자바 바이트코드(Java bytecode)란 자바 가상 머신(JVM)이 실행하는 명령어의 형태이다. 각각의 바이트코드는 1바이트로 구성되지만 몇 개의 파라미터가 사용되는 경우가 있어 총 몇 바이트로 구성되는 경우가 있다. 256개의 명령의코드 모두가 사용되지는 않는다.

    컴파일 시 생성되는 .class 파일이 자바 바이트코드이다.

    출처 : 위키백과


    JIT 컴파일러란 무엇이며 어떻게 동작하는지

    IT 컴파일(just-in-time compilation) 또는 동적 번역(dynamic translation)은 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법이다.

    전통적인 입장에서 컴퓨터 프로그램을 만드는 방법은 두 가지가 있는데, 인터프리트 방식과 정적 컴파일 방식으로 나눌 수 있다. 이 중 인터프리트 방식은 실행 중 프로그래밍 언어를 읽어가면서 해당 기능에 대응하는 기계어 코드를 실행하며, 반면 정적 컴파일은 실행하기 전에 프로그램 코드를 기계어로 번역한다.

    JIT 컴파일러는 두 가지의 방식을 혼합한 방식으로 생각할 수 있는데, 실행 시점에서 인터프리트 방식으로 기계어 코드를 생성하면서 그 코드를 캐싱하여, 같은 함수가 여러 번 불릴 때 매번 기계어 코드를 생성하는 것을 방지한다.

    최근의 자바 가상 머신 .NET, V8(node.js)에서는 JIT 컴파일을 지원한다. , 자바 컴파일러가 자바 프로그램 코드 바이트코드로 변환한 다음, 실제 바이트코드를 실행하는 시점에서 자바 가상 머신이 바이트코드를 JIT 컴파일을 통해 기계어로 변환한다.

    출처 : 위키백과

    JVM 구성 요소

    1. 자바 인터프리터(interpreter)

    2. 클래스 로더(class loader)

    3. JIT 컴파일러(Just-In-Time compiler)

    4. 가비지 컬렉터(garbage collector)


    JDK JRE의 차이

    JDK - 자바개발도구(Java Development Kit)

    JRE - 자바실행환경(Java Runtime Environment), 자바로 작성된 응용프로그램이 실행되기 위한 최소환경

    JDK = JRE + 개발에 필요한 실행파일(Javac.exe )

    JRE = JVM + 클래스라이브러리(Java API)


    참조 : https://github.com/whiteship/live-study/issues/1

    반응형

    댓글

Designed by Tistory.