본문 바로가기

java

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

목표

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

JVM이란 무엇인가

 

(출처 :  https://helloworld-88.tistory.com/16 )

JAVA Virtual Machine의 약자로 자바 가상 머신의 약자를 줄여 부르는 용어이다.
( 가상 머신이란, 프로그램의 실행을 위해 물리적 머신과 유사한 머신을 소프트 웨어로 구현한 것이다. )
JVM의 역할은 자바 애플리케이션을 클래스 로더를 통해 읽어 자바 API와 함께 실행하는 것이다.
그리고 JVM은 JAVA와 OS 사이에서 중개자 역할을 수행하여 JAVA가 OS에 구애받지 않고 재사용을 가능하게 해 준다.
그리고 가장 중요한 메모리 관리, Garbage collection을 수행한다.
JVM은 스택 기반의 가상 머신이다.

. class 파일을 OS에 맞는 machine code로 변환해준다. ( 인터프리터 & JIT 컴파일러 )

컴파일하는 방법

자바 컴파일러는 자바를 가지고 작성한 자바 소스 코드를 자바 가상 머신이 이해할 수 있는 자바 바이트 코드로 변환한다. 자바 컴파일러는 자바를 설치하면, javac.exe라는 실행 파일 형태로 설치된다. 이후,

1.. java에서. class 가 생성된다.

2. byte code는 반 기계어 상태로 컴퓨터가 읽을 수 없고 JVM에 의해 변환이 또 필요하다.

3. java.exe로 실행하면 클래스 로더를 통해. class를 JVM으로 가져온다.

4. Byte code Verifier에서 Byte code를 검증한다.

인터프리터가 byte code를 binary code로 변환해준다.

( 이때 변환된 binary code는 JVM의 클래스 영역에 저장된다. )

 

실행하는 방법

1. interpreter 방식 :  명령어를 하나씩 수행하는 방식이다.

2. JIT ( Just in Time compiler ) 방식 : 전체 바이트 코드를 네이티브 코드로 변환하고 그 이후에는 네이티브 코드로 실행하는 방식이다.

바이트코드란 무엇인가

자바 가상 머신이 이해할 수 있는 언어로 변환된 자바 코드로 자바 컴파일러로 변환되는 코드의 명령어 크기가 1바이트라서 바이트 코드라고 불린다.

자바는 OS에 종속적이지 않기 위해서 JVM이 이해할 수 있는 언어인 바이트 코드 형태로 제공되고 바이트 코드와 JVM 이 있으면 어느 운영체제에 종속적이지 않고 실행된다고 이해할 수 있다.

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

기존 클래스 파일( 바이트 코드 )을 실행하는 방법은 Interpreter 방식이 기본인데 Interpreter 방식은 명령어 한 줄 한 줄을

 하나씩 처리해서 해석하는 개념이기 때문에 속도가 전체적으로 느린 단점이 있다.

그래서 JIT 컴파일러를 둬서 런타임 시 클래스 파일 ( 바이트 코드 )를 네이티브 기계어로 한 번만에 컴파일 후 사용하는 개념이다. 자주 사용하는 부분은 한꺼번에 컴파일해서 캐싱해두고 계속 사용하면 interpreter 방식보다는 훨씬 빠르다는 장점이 있다.

JVM 구성 요소

(출처 :  https://j4bez.tistory.com/14 )

1. 클래스 로더

- JRE의 일부로, 바이트 코드를 실행할 때, class 객체를 메모리에 생성하는 요소이다.

- 클래스의 인스턴스를 생성하면 class loader를 통해 메모리에 로드한다.

로딩, 링크, 초기화 순서로 진행되며, 클래스 로더라는 이름 그대로 클래스 파일을 적재하는 역할을 한다.

Event.java 자바 소스파일을 컴파일하면 바이트 코드 (. class 파일)이 생성되며 이런 파일들을 모아,

클래스 로더가 메모리에 적재시킨다.

 

- 로딩 : 클래스 로더가. class 파일을 읽고 그 내용에 따라 적절한 바이너리 데이터를 만들고 메서드 영역에 저장한다.

로딩이 끝나면 해당 클래스 타입의 Class 객체를 생성하여 힙 영역에 저장한다.

 

- 링크 : Verify, Prepare, Resolve 세 단계로 나누어져 있다. 검증은. class 파일 형식이 유효한지 체크한다.

Preparation 은 클래스 변수와 기본값에 필요한 메모리, Resolve는 심볼릭 메모리 레퍼런스를 메서드 영역에 있는 실제 레퍼런스로 교체한다.

 

- 초기화 : static 변수의 값을 할당한다.

 

2. Execution Engine ( Interpreter / JIT Compiler )

 

Class Loader에 의해 Runtime Data Area에 적재된 클래스 ( 바이트 코드 ) 들을 컴퓨터가 이해할 수 있는 기계어로 변경해 명령어 단위로 실행하는 역할을 한다. 이때, 명령어 하나씩 실행하는 인터프리터 방식과, 바이트 코드를 네이티브 코드로 변환하는 JIT Compiler 방식이 있다.

 

3. 가비지 컬렉터

 

가비지 컬렉터는 힙 영역에 생성된 객체들 중 참조되지 않는 객체들을 메모리에서 제거하는 역할을 한다.

역할을 하는 시간은 정확히 언제인지 알 수 없다. ( 참조가 없어지자마자 해제되는 것을 보장하지 않는다 )

또 다른 특징은 가비지 컬렉터가 수행되는 동안 가비지 컬렉터를 수행하는 쓰레드가 아닌 다른 쓰레드가 일시 정지된다.

 

JDK와 JRE의 차이

JDK는 Java Development Kit이다.

자바 SE, 자바 EE, 또는 자바 ME 플랫폼 중 하나를 구현한 것으로 소프트웨어 개발 키트이다.

javac, javadoc, jdb 등 다양한 툴들이 있다.

 

JRE + 개발 툴

JDK 안에 JRE 가 포함되어 있다.

 

출처 : medium.com/webeveloper/jvm-java-virtual-machine-architecture-94b914e93d86

JRE - Java Runtime Environment

JRE  - 자바가 실제로 동작하는데 필요한 JVM, 라이브러리, 각종 파일들이 포함되어 있다.

자바로 만들어진 프로그램을 구동하려고 한다면 이것을 설치한다.

런타임 환경은 다른 소프트 웨어를 실행하기 위해 고안되는 일종의 소프트 웨어다.

자바용 런타임 환경인 JRE는 자바 클래스 라이브러리와 자바 클래스 로더, 자바 가상 머신이 포함된다.

'java' 카테고리의 다른 글

오버로딩과 오버라이딩  (0) 2021.01.19
자바 메모리 관리 ?  (0) 2021.01.19
4주차 제어문  (0) 2021.01.12
3주차 과제 연산자  (0) 2021.01.12
2주차 과제 자바 데이터 타입, 변수 그리고 배열  (0) 2021.01.10