JVM과 자바 코드의 실행과정을 알아보자!

학습 목표 : 자바 소스 파일(.java)을 JVM으로 실행하는 과정을 이해해보자!

한줄로 요약해보자면 아래와 같다.

J

.java(사람이해 언어) →javac.exe→ .class(중간 언어) →JVM→ 실행(기계어)

  1. 컴파일 : javac.exe로 사람이 읽을 수 있는 코드(.java)를 가상 머신이 이해할 수 있는 코드인 바이트코드(.class)로 바꾼다.
  2. JVM : 바이트 코드를 해당 운영체제에 맞는 기계어로 해석하여 실행시켜준다.

JDK와 JRE의 차이

JVM

JDK란?

Java Development Kit의 약자로 자바 애플리케이션 개발에 필요한 여러 툴을 제공하는 모음집이다.

JRE란?

Java Runtime Environment의 약자로 자바 애플리케이션의 실행 환경이다. 이미 컴파일된 자바 애플리케이션의 모듈(JAR 파일,클래스 파일 등)을 이용하여 실행할 수 있다.

  • JVM이 자바 프로그램을 동작시킬 때 필요한 라이브러리 파일들과 기타 파일들을 포함하고있다.

    [참고]자바 11부터는 JRE가 포함된 형태로 배포되고 있기때문에 JDK만 설치해도 무관하다.


컴파일 및 실행하는 방법

컴파일이란?

사람이 이해할 수 있는 코드를 기계가 이해할 수 있는 언어로 바꿔주는 작업이다.

  • 바이트 코드란?

    • 고급 언어로 작성된 소스 코드(.java)를 가상머신이 이해할 수 있는 중간 코드(.class)로 컴파일한 이진코드를 의미한다.
    • 가상머신은 이 바이트코드를 각각의 하드웨어 아키텍처에 맞는 기계어로 다시 컴파일한다.
  • 바이너리 코드란?

    • 0과 1로 구성되어 있는 CPU가 이해할 수 있는 이진코드
    • C언어로 작성 된 .c 파일을 컴파일한 .obj파일이 바이너리 코드
    • 기계어가 바이너리코드로 이루어졌을 뿐이지 모든 이진코드가 기계어인 것은 아니다.

컴파일 하는 방법

  • cmd로 컴파일 하는 방법
    1. 작성된 java파일이 있는 경로를 확인 (workspace → 프로젝트 → src → main.java)
    2. cmd창 열고 경로를 입력

      cd java파일이 있는 경로
      
    3. javac와 해당 파일 이름 입력

      javac 소스파일명.java
      

    .java파일(사람이 이해할 수 있는 코드)→ .class파일(JVM이 이해할 수 있는 코드)이 만들어진다.

    이렇게 컴파일 된 바이트 코드는 어떤 JVM에서도 동작시킬 수 있게 된다.

    • 실행하는 방법 java.exe 파일을 사용해서 바이트코드로 컴파일 된 .class를 실행한다.

      (바이트 코드 → 기계어)

         java 소스파일명
      

      주의) 확장자명을 붙이지 않는다.


JVM이란 무엇인가?

JAVA Virtial Machine의 약자로 코드가 운영체제에 상관없이 실행될 수 있도록 도와주는 가상머신이다.

JVM은 자바 바이트코드(중간언어)를 운영체제에 맞는 기계어로 변경하여 실행하는 프로그램이다.

즉, JVM이 설치되어 있다면 다른 운영체제에서도 코드를 실행할 수 있다.

JVM의 탄생배경

디바이스마다 운영체제가 다르기 때문에 그에 맞춰 컴파일하는 번거로운 작업이 필요했다.

그래서 코드를 한 번만 작성하면 모든 플랫폼에서 실행될 수 있도록 대신 컴파일해주는 역할을 하는 JVM이 탄생했다.

즉, JVM 덕분에 어떤 상황에서도 같은 의도를 가진 소스코드를 작성할 수 있게 된것이다.

JVM의 구성 요소

j

1. ClassLoader

자바 클래스들은 시작 시 한번에 로드되지 않고, 애플리케이션에서 필요할 때 로드된다.

클래스 로더는 JRE의 일부로써 Runtime 시점에 .class 파일을 동적으로 JVM에 로드 하는 역할을 수행하는 모듈이다.

자바의 큰 장점 중 하나로, Compile Time이 아닌 Runtime시점에 Class를 로딩할 수 있게 해주는 기술이다.

2. Runtime Data Areas

JVM이 프로그램을 수행하기 위해서 OS로 부터 별도로 할당받은 메모리 공간이다.

JVM%E1%84%80%E1%85%AA%20%E1%84%8C%E1%85%A1%E1%84%87%E1%85%A1%20%E1%84%8F%E1%85%A9%E1%84%83%E1%85%B3%E1%84%8B%E1%85%B4%20%E1%84%89%E1%85%B5%E1%86%AF%E1%84%92%E1%85%A2%E1%86%BC%E1%84%80%E1%85%AA%E1%84%8C%E1%85%A5%E1%86%BC%E1%84%8B%E1%85%B3%E1%86%AF%20%E1%84%8B%E1%85%A1%E1%86%AF%E1%84%8B%E1%85%A1%E1%84%87%E1%85%A9%E1%84%8C%E1%85%A1!%20ce32ba718e85453dac47eba0edfe7d60/KakaoTalk_20210226_231828175.jpg

  • Method Area : JVM이 시작될 때 생성되는 공간. 바이트 코드가 이 영역에 저장된다.
    • 클래스 정보, 변수 정보, static으로 선언한 변수가 저장되고 모든 스레드가 공유하는 영역이다.
  • Heap : 동적으로 생성된 객체가 저장되는 영역으로 GC의 대상이 되는 공간이다.
    • New 연산으로 동적 생성된 인스턴스 변수가 저장된다.(ex)배열)
    • 쉽게 소멸되는 데이터가 아니다.
  • Stack : 지역변수,메서드의 매개변수, 임시적으로 사용되는 변수,메서드의 정보가 저장되는 영역
    • 쉽게 소멸되는 데이터이다.
  • PC Registers : 스레드가 시작될 때 생성되며, 현재 수행중인 JVM의 명령어 주소를 저장하는 공간
    • 즉, 스레드가 어떤 부분을 어떤 명령어로 수행할지를 저장하는 공간
  • Native Method Stack : Java가 아닌 다른 언어로 작성된 코드를 위한 공간
    • 즉,JNI(Java Native Interface)를 통해 호출하는 C/C++등의 코드를 수행하기 위한 공간

3. Execution Engine

로드된 class파일의 바이트코드를 실행하는 엔진이다.(Runtime Module)

  • 바이트 코드 → 기계어로 바꾸고 실행한다.
    1. Interpreter 방식 : 한 행씩 읽어 기계어로 바꾼다.
    2. JIT Compiler 방식 : 바뀐 부분만 컴파일하고 나머지는 캐싱된 코드를 사용한다.
      • 기계어로 해석된 것들이 다시 Runtime Data Area에 배치되어 스레드 동기화,가비지 컬렉션을 수행한다.
      • Garbage Collector : Heap에서 더이상 사용하지 않는 객체들을 없앤다.

JIT compiler란 무엇인가?

Just In Time의 약자로 프로그램을 실제 실행하는 시점(Runtime)에 기계어로 번역하는 컴파일 방식이다.

Interpreter 방식이란?

자바 바이트 코드를 명령어 단위로 읽어서 실행한다.

  • 이 방식은 한줄씩 수행하기 때문에 느리다는 단점을 가지고 있다. 이러한 단점을 개선하기 위한 방식이 바로 JIT방식이다.

JIT 방식이란?

(처음 실행할 때) 처음 기계어를 생성할 때, 인터프리터 방식으로 컴파일을 하면서 해당 코드를 캐싱한다. 이후에 실행할 땐, 바뀐 부분만 컴파일 하고 나머지는 캐싱된 코드를 사용한다.

  • 변경된 부분만 컴파일 하기 때문에 interpreter방식에 비해 수행속도가 더 빠르다.

JIT 동작 방식

JVM%E1%84%80%E1%85%AA%20%E1%84%8C%E1%85%A1%E1%84%87%E1%85%A1%20%E1%84%8F%E1%85%A9%E1%84%83%E1%85%B3%E1%84%8B%E1%85%B4%20%E1%84%89%E1%85%B5%E1%86%AF%E1%84%92%E1%85%A2%E1%86%BC%E1%84%80%E1%85%AA%E1%84%8C%E1%85%A5%E1%86%BC%E1%84%8B%E1%85%B3%E1%86%AF%20%E1%84%8B%E1%85%A1%E1%86%AF%E1%84%8B%E1%85%A1%E1%84%87%E1%85%A9%E1%84%8C%E1%85%A1!%20ce32ba718e85453dac47eba0edfe7d60/Untitled%202.png

JVM%E1%84%80%E1%85%AA%20%E1%84%8C%E1%85%A1%E1%84%87%E1%85%A1%20%E1%84%8F%E1%85%A9%E1%84%83%E1%85%B3%E1%84%8B%E1%85%B4%20%E1%84%89%E1%85%B5%E1%86%AF%E1%84%92%E1%85%A2%E1%86%BC%E1%84%80%E1%85%AA%E1%84%8C%E1%85%A5%E1%86%BC%E1%84%8B%E1%85%B3%E1%86%AF%20%E1%84%8B%E1%85%A1%E1%86%AF%E1%84%8B%E1%85%A1%E1%84%87%E1%85%A9%E1%84%8C%E1%85%A1!%20ce32ba718e85453dac47eba0edfe7d60/Untitled%203.png

time

참고 [이론] 컴파일러, 인터프리터, JIT

https://www.intexsoft.com/blog/post/jvm.html

https://miro.medium.com/

https://superblo.tistory.com/entry/커맨드cmd에서-자바-컴파일하기-및-실행-방법2

https://www.geeksforgeeks.org/

https://miro.medium.com/

Categories:

Updated:

Leave a comment