1주차 과제: JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가?

2020. 12. 15. 15:522021/JOB DA STUDY

목표

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


학습할 것

  • JVM이란 무엇인가?
  • 컴파일 하는 방법
  • 실행하는 방법
  • 바이트코드란 무엇인가?
  • JIT 컴파일러란 무엇이며 어떻게 동작하는지
  • JVM 구성 요소
  • JDK와 JRE의 차이

 

1. JVM이란 무엇인가?

JVM (Java Virtual Machine)이란, 자바 바이트 코드를 OS에 맞게 해석해 주는 역할을 한다.
자바 컴파일러(javac.exe)는 .java파일을 .class라는 자바 바이트 코드로 변환시켜 주지만 바이트 코드는 기계어가 아니기 때문에 OS에서 바로 실행되지 않는데, JVM이 OS가 바이트 코드를 이해할 수 있도록 해석해주는 역할을 한다.
하지만 JVM의 해석을 거치기 때문에 속도가 느려진다는 단점이 생기는데, 이는 JIT(Just In Time) 컴파일러를 구현함으로써 극복 할 수 있다.
참고: 바이트 코드는 JVM위에서 OS에 관계없이 실행 가능한데, OS에 종속적이지 않고 .java파일 하나만 만들면 어느 디바이스던 JVM위에서 실행 가능하다.

 

2. 컴파일 하는 방법

    1. 자바 파일(ex - java.java) 작성
    2. javac 명령어로 컴파일(자바 컴파일러)
 $ javac test.java 
  1. 클래스 파일이 생성(ex - Hello.class)

 

3. 실행 하는 방법

    1. 클래스 파일(.class)을 java 명령어로 실행
 $ java Hello 

 

4. 바이트 코드란 무엇인가?

자바 컴파일러에 의해 JVM이 이해할 수 있는 언어로 변환된 자바 소스 코드를 의미

  • 변환되는 코드의 명령어 크기 = 1바이트
  • 자바 바이트 코드의 확장자는 .class
  • JVM만 설치되어 있으면 어떤 OS에서도 실행 가능

 

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

    1. 자바 컴파일러(javac)에 의해 java source(.java)로 부터 바이트코드(.class)가 생성된다.
    2. JVM에 있는 Class Loader에 의해 바이트 코드는 JVM내로 로드되고, Excution Engine에 의해 기계어로 해석되어 Runtime Data Areas에 배치된다.
    3. 실행 엔진에는 인터프리터와 JIT(Just In Time) 컴파일러가 있는데, 인터프리터에 의해 바이트코드를 한줄씩 읽어 실행하다가 적절한 시점에 바이트코드 전체를 컴파일하고 더이상 인터프리팅 하지 않고 해당 코드 직접 실행

JIT 컴파일러: 전체 바이트 코드를 컴파일하고 캐시에 보관해 두고 직접 실행하므로 한번 컴파일 된 이후에는 빠르게 실행이 가능하다는 장점이 있음

인터프리터: 자바 바이트 코드를 한 줄 씩만 실행하여 전체 성능면에서는 불리함

 

6. JVM 구성 요소

Class Loader를 통해 JVM내의 Runtime Data Areas에 배치된 바이트 코드는 Excution Engine에 의해 실행

1. Class Loader

RunTime시점에 클래스를 로딩하게 해주며, 클래스의 인스턴스를 생성하면 클래스 로더를 통해 메모리에 로드하게 된다.

2. Runtime Data Areas

JVM이 프로그램을 수행하기 위해 OS로부터 별도로 할당받은 메모리 공간 (크게 5가지 영역을 관리)

PC Register CPU내의 기억장치인 레지스터와는 다르게 Register-Base가 아닌, Stack-Base로 동작하게 된다. PC Register는 각 Thread별로 하나씩 존재하며, 현재 수행중인 Java Virtual Machine Instruction(JVM 명령어)의 주소를 가지게 된다.
이 PC Register에 저장되는 Instruction의 주소는 Native Pointer일 수도 있고 Method Bytecode일 수도 있다. 만일 Native Method를 수행한다면 PC Register는 Undifiend 상태가 되며, Native Method를 수행할 때는 JVM을 거치지 않고 API를 통해 바로 수행하게 된다.
이는 Java는 Platform에 종속되지 않는 다는 것을 보여준다.
JAVA Virtual Machine Stack Tread 가 시작할 때 생성되며, 각 Thread의 수행 정보를 frame을 통해 저장하게 된다. 또한 Tread별로 생성되기 때문에 다른 Thread는 접근 할 수 없다.
Method가 호출되면 Method와 Method의 정보(해당 Method의 매개변수, 지역변수, 임시변수, 메소드 호출한 주소(어드레스))는 Stack에 쌓이게 되며, Method 호출이 종료되면 Stack Point에서 제거된다.
Native MAthod Stack JAVA 외의 언어로 작성된 Native 코드들을 위한 Stack으로, JNI(Java Native Interface)를 통해 호출되는 C/C++등의 코드를 수행하기 위한 Stack
Native Method를 위해 Native Method Stack이라는 메모리 공간을 갖게된다. Application에서 Native Method를 호출하게되면 Native Method Stack에 새로운 Stack Frame을 생성하여 Push한다.
이는 JNI를 이용함으로써 JVM내부에 영향을 주지 않기 위함
Method Area 모든 스레드가 공유하는 메모리 영역으로 클래스, 인터페이스, 메소드, 필드, Static변수 등의 바이트 코드를 보관
Heap 프로그램 상에서 런타임시 동적으로 할당하여 사용하는 영역으로 .class를 이용해 instance를 생성하면 Heap에 저장된다.
classA a = new ClassA();

3. Excution Engine

로드된 클래스의 바이트코드를 명령어 단위로 읽어서 실행하는 Runtime Module

 

7. JDK와 JRE의 차이

JVM(Java Virtual Machine -.class 파일을 OS에 맞는 machine 코드로 변환 (인터프리터 & JIT컴파일러)
-플랫폼(OS)에 종속적
JRE(Java Runtime Environment) - 컴파일된 자바 프로그램을 실행시킬 수 있는 자바 환경
- JVM이 자바 프로그램을 동작시킬 때 필요한 라이브러리 파일들과 기타 파일들을 가지고 있음
- JVM의 실행환경을 구현해놓은 것(자바 실행을 위해서 JRE 반드시 설치
- 자바 프로그래밍 도구는 포함되어 있지 않기 때문에 JDK가 꼭 필요
JDK(Java Development Kit) - JRE + 개발 툴(javac, java 등)
- 자바 프로그래밍시 필요한 컴파일러 등을 포함
- 자바11부터는 JDK단위 배포하며, 자바9부터는 JRE를 따로 배포하지 않음<
JAVA - 자바 언어 자체는 플랫폼에 독립적
- 개발 툴인 javac에 의해 .class로 만들어짐
- JVM은 .class만 다루므로 JVM 자체에 연관이 깊지 않음

 

 

참고 URL

 

JVM 이란?

# JIT

medium.com

 

JAVA-STUDY #1 - JVM, 컴파일과 실행, 바이트코드, JDK와 JRE

개요 해당 포스팅은 백기선님 온라인 자바 스터디에 참여하며 과제로 작성한 글입니다. 백기선님 온라인 자바 스터디 Github 주소 : https://github.com/whiteship/live-study 원본 Github 주소 : https://github...

mmsesang.tistory.com

 

'2021 > JOB DA STUDY' 카테고리의 다른 글

Argument 와 Parameter  (0) 2020.12.21
Map  (0) 2020.12.18
Queue 와 Thread의 관계  (0) 2020.12.16
메모리 구조  (0) 2020.12.15
2주차 과제: 자바 데이터 타입, 변수 그리고 배열  (0) 2020.12.15