자바 스터디 1주차

JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가.

Posted by moo10 on March 1, 2021

목표

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


1. JVM이란 무엇인가

“자바 가상 머신(영어: Java Virtual Machine, JVM)은 자바 바이트코드를 실행할 수 있는 주체이다. 일반적으로 인터프리터나 JIT 컴파일 방식으로 다른 컴퓨터 위에서 바이트코드를 실행할 수 있도록 구현되나 jop 자바 프로세서처럼 하드웨어와 소프트웨어를 혼합해 구현하는 경우도 있다. “ (출처 : 위키백과)

위키백과의 설명으론 쉽게 JVM이 이해가지 않는다…
조금 더 쉽게 설명하자면 Java와 OS 사이에서 Java가 실행되도록 해주는 역할을 수행한다. 이 때문에 Java가 어떠한 기기/운영체제에 구애 받지않고 실행된다.
또한, 가장 중요한 역할중 중 하나는 가비지컬렉션(GC : Garbage Collection)을 통해 메모리를 관리하고 있다. </br></br>

JVM 아키텍처 (출처 : 위키백과)


2. 컴파일 하는 방법

  • 컴파일 과정

    자바를 단순히 컴파일 하는 과정은 _.java 파일이 자바 컴파일러를 통해 완전한 기계어로 변환되기 전 상태인 _.class 파일로 변환 된다.

  • 컴파일 방법

    컴파일을 하는 방법은 2가지가 있는데, 이클립스와 같은 개발도구에서 빌드 과정을 거쳐 컴파일을 하는 방법이 있고 두번쨰는 직접 터미널에서 javac 명령어를 활용해 컴파일하는 방법이 있다. javac 명령어를 활용해 컴파일 하는 과정은 다음과 같다.


    1. java 파일 생성

    • Hello.java 파일을 다음과 같이 생성한다.
    1
    2
    3
    4
    5
    
    public class Hello{
      public static void main(String[] args){
          System.out.println("Hello World");
      }
    }
    


    2. java 컴파일

    • 터미널에서 Hello.java 파일이 있는 디렉토리에서 **‘javac Hello.java’ 명령어를 입력하여 컴파일을 한다.


    3. 생성된 class 파일을 실행한다

    • class 파일이 생성된 디렉토리에서 **‘java Hello’ 명령어를 입력하여, 실행 결과를 확인한다.



3. 실행하는 방법

1) 생성된 class 파일을 Class Loader가 JVM 메모리 상에 로드를 하게되고, Byte verifier가 바이트 코드를 검증하는 과정을 거친다.

2) Execution Engine을 통해 바이트 코드를 기계어로 변환하는 과정을 거치게 된다. 이후 기계어로 변환된 파일은 Runtime Data area로 옮겨져 실행되게 된다.

(출처 : https://bit.ly/3b4EZ39)


3. 바이트 코드란 무엇인가

  • 개발자가 java 언어를 기계어로 변환하는 과정에서 JVM이 이해할 수 있는 중간코드
    ※ 바이너리 코드 : 0과 1로 구성된 이진코드 (이진코드가 기계어 임을 의미하는 것은 아니다.)


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

  • 이전 Java 파일이 실행되는 과정에서 설명한 바이트 코드가 기계어로 변환하는 과정에서 Execution Engine은 두가지 방법을 통해 기계어로 변환된다.


    1) 인터프리터(Interpreter) : 바이트 코드를 한줄 씩 읽고 해석하여, 실행한다. 각 하나의 실행은 빠른편이지만, 전체 프로그램 실행 속도가 느리다는 단점이 있다.


    2) JIT 컴파일러(Just-In-Time Compiler) : 인터프리터와는 반대로 바이트 코드 전체를 읽고, 바이너리 코드로 한번 더 컴파일하는 과정을 거친다. 이때 중요한 점은 매번 소스코드를 기계어로 변환하는 과정을 거치지 않고, 한번 변환한 코드를 저장하여 반복 사용 되는 코드는 바로 사용하도록 해준다.


5. JVM 구성 요소

  • 클래스 로더(Class Loader)
  • Execution Engine
  • Runtime Data Area
  • Garbate Collector

6. JDK와 JRE의 차이

  • JRE(Java Runtime Environment)

    • 컴파일된 자바 프로그램을 실행시킬 수 있는 자바환경
    • 자바 프로그램이 동작하기 위해 필요한 라이브러리 파일들을 가지고 있다.
  • JDK(Java Development Kit)

    • 자바 프로그램을 개발할 때 필요한 환경을 구성
    • 개발을 위해 필요한 도구(javac, java)가 가지고 있음.
    • JDK 설치시 JRE가 함께 설치가 된다.