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

Shinho.Bang·2020년 11월 12일
0

live-study

목록 보기
1/3
post-thumbnail

🙆‍♂️ 목표

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


🤔 학습내용

  • JVM이란 무엇인가
  • 바이트코드란 무엇인가
  • 컴파일 하는 방법
  • JIT 컴파일러란 무엇이며 어떻게 동작하는가
  • (.java) 실행하는 방법
  • JVM 구성 요소
  • JDKJRE의 차이

JVM 이란 무엇인가

위키백과에 나온 내용을 보니 JVM은 어떤 방식을 통하여 자바 자바 바이트코드를 실행하게 만들어주는 무엇인것 같다.

😲 자바 가상 머신(Java Virtual Machine, JVM)은 자바 바이트코드를 실행할 수 있는 주체이다.
📖 위키백과

일반적으로 JVM 은 인터프리터나 JIT 컴파일 방식으로 다른 컴퓨터 위에서 자바 바이트코드를 실행할 수 있도록 구현된다.
자바 바이트코드는 플랫폼에 독립적이며, 모든 JVM 은 규격에 정의된 대로 자바 바이트코드를 실행한다. 따라서 표준 자바 API까지 동일한 동작을 하도록 구현한 상태에서는 이론적으로 모든 자바 프로그램은 CPU나 운영체제의 종류와 무관하게 동일하게 동작할 것을 보장한다.

쉽게 말해 JVM은 일련의 어떤 방식을 통해 자바 바이트코드로 변환된 .java를 실행하고 메모리를 관리해주는 역할을 하는 것이다.


JVM 구성 요소

다음은 JVM의 동작방식 그림이다.

[JVM 동작 방식 이미지 출처] : https://asfirstalways.tistory.com/158

jvm은 크게 3가지의 영역으로 나뉜다.

  • Class Loader
  • Excution
  • Runtime Data Area

Class Loader

Class Loader는 컴파일된 .class 파일들을 엮어서 OS에게 할당받은 메모리 영역, Runtime Data Area에 적재한다.

Excution

Runtime Data Area에 적재된 .class파일들을 컴퓨터가 이해할 수 있는 기계어(네이티브 코드)로 변경해 명령어 단위로 실행하는 역할을 한다.
이때 명령어를 하나씩 실행하는 interpreter 방식과 자바 바이트코드를 네이티브 코드로 변환하는 JIT방식이 있다.

🤓 Interpreter & JIT?
Interpreter : 자바 컴파일러에 의해 변환된 자바 바이트코드를 한 줄씩 읽고 해석하는 역할을 한다.
JIT (Just - In - Time) : 적절한 시점에 바이트코드 전체를 읽어 네이티브 코드로 캐싱해놓고 읽어오는 방식이다.

Runtime Data Area

.class파일들이 적재되어있는 장소인 Runtime Data Area는 다룰 내용이 많으므로 jvm이 OS로부터 할당 받은 메모리 공간이라고만 알고 넘어가자.

jvm은 아래와 같은 순서로 동작한다.

  1. 사용자가 작성한.java파일(Java Source code)이 자바 컴파일러에(javac) 의해 .class(자바 바이트코드)로 변환된다.
  2. Class Loader가 컴파일된 .class 파일들을 Runtime Data Area에 적재 시킨다.
  3. Excution이 메모리에 적재된 바이트코드를 해석(interpreter)하여 명령어 단위로 실행한다.

그렇다면 자바 바이트코드란 무엇인가

자바 바이트코드란 쉽게 말해 JVM이 이해할 수 있는 언어로 변환된 자바 소스 코드를 의미한다.
변환된 자바 바이트코드의 확장자는 .class이다.

🤔 그래서 왜 자바 바이트 코드라고 부르는건데??

자바 컴파일러에 의해 변환되는 코드의 명령어 크기가 1Byte라서 자바 바이트코드라고 한다.


컴파일 하는 방법

자바 바이트코드는 자바 컴파일러에 의해 변환된다고 되어있는데, 컴파일은 어떻게 하는걸까?
컴파일은 jdk 혹은 jre이 설치되어 있다면 javac 명령어로 직접 컴파일할 수 있다.

자바 바이트코드로 컴파일 되는 과정
자바 소스 코드 파일 (.java) -> 자바 컴파일러 (javac) -> 자바 바이트코드 (.class)


(.java) 실행하는 방법


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

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

interpreter의 단점을 보완하기 위해 도입되었으며, 한 번 컴파일된 코드는 계속 빠르게 수행된다.
JIT는 내부적으로 해당 메서드가 얼마나 자주 수행되는지 체크하고, 일정 정도를 넘을때에만 컴파일을 수행한다.


JDK와 JRE의 차이


[JDK와 JRE] : https://c10106.tistory.com/3135


🙇‍♂️ Ref.

profile
감성코더

0개의 댓글