본문 바로가기
Language/Java

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

by CleanCoder 2021. 2. 10.

 

목표

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

 

학습할 것

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

 

 

1. JVM이란 무엇인가

 JVM이란 Java Virtual Machine으로 실 운영체제 대신해서 자바 프로그램을 실행하는 가상의 운영체제 역할을 한다. 자바 프로그램은 완전한 기계어가 아닌, 중간 단계의 바이트 코드이기 때문에 운영체제가 자바 프로그램을 바로 실행할 수 없다. 하여, JVM을 이용하여 자바 프로그램이 여러 운영체제에서 동일한 실행 결과가 나오도록 하는 '자바를 실행시키는 가상의 기계'이다. 

 

https://romanticcode.tistory.com/44

 

다음과 같이 JVM은 운영체제에 종속적인 관계를 가지므로 본인의 환경에 맞게 JVM이 설치되어야 한다. 이러한 JVM은 JDK 또는 JRE를 설치하게 될 시 자동적으로 설치되는데 이러한 JDK와 JRE는 운영체제별로 설치할 수 있다.

 

 

2. 컴파일 하는 방법

 

 자바 개발자들이 Eclipse나 Intellij와 같은 개발 툴(IDE)을 사용해 자바 프로그램은 확장자가 .java 파일을 작성하는 것에서부터 시작한다.

 

그리고 Build 라는 작업을 하게 되면 Java Complier(javac.exe)의 javac라는 명령어를 사용해. class 파일을 생성하게 된다. 이 것은 아직 컴퓨터가 읽을 수 없는 자바 바이트코드(반 기계어)이다.

 

 

3. 실행하는 방법

 

 자바 프로그램의 개발은 다음의 순서로 진행된다.

1. .java 소스 파일 작성

2. 컴파일러(javac.exe)로 바이트 코드 파일(. class) 생성

3. JVM 구동 명령어(java.exe)로 실행

 

예로 명령 프롬프트에서 Hello.java 소스 파일을 다음과 같이 컴파일하면 Hello.java 파일이 생성된다.

javac Hello.java

다음의 과정을 통해 바이트 코드 파일(. class)이 생성되고 이제 이를 JVM을 구동시키는 명령어 java.exe를 통해 실행시킨다. 이때 .class 확장명을 제외한 이름을 입력해야 한다.

java Hello

java.exe 명령어를 통해 JVM은 바이트 코드 파일(Hello.class)을 메모리에 로드하고, 최적의 기계어로 변환한다. 그리고 main() 메서드를 찾아 실행시킨다. 

 

 

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

 

 바이트코드(Bytecode, portable code, p-code)는 특정 하드웨어가 아닌 가상 컴퓨터에서 돌아가는 실행 프로그램을 위한 이진 표현법이다. 하드웨어가 아닌 소프트웨어에 의해 처리되기 때문에, 보통 기계어보다 더 추상적이다. 코드의 명령어 크기가 1이라 바이트 코드라 불려진다.

 

 

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

 

 실행 엔진에는 Interpreter와 JIT(Just-In-Time) Compiler가 있는데 Interpreter의 경우 바이트 코드를 한 줄씩 읽기 때문에 실행 속도에서 JIT보다 느리다. 

 

. JIT 컴파일러는 런타임에 바이트 코드를 원시 기계 코드로 컴파일하여 Java 프로그램의 성능을 향상시킨다.

 

 JIT Compiler에 의해 해석된 코드는 캐시에 보관하기 때문에 한 번 컴파일된 후에는 빠르게 수행하는 장점이 있습니다. 하지만 인터 프리팅 방식보다는 훨씬 오래 걸리므로 한 번만 실행하면 되는 코드는 인터 프리팅 하는 것이 유리합니다.

 

Interpreter : 자바 바이트 코드를 한 줄씩 실행. 속도가 느림.

JIT Compiler : Interpreter의 단점을 보완. 전체 바이트 코드를 컴파일. 속도가 느림. 하지만 캐시 사용으로 한번 컴파일하면 다음에는 빠르게 수행됨



https://aboullaite.me/understanding-jit-compiler-just-in-time-compiler/

 

 

6. JVM 구성 요소

 

JVM은 Garbage collector, Execution Engine, Class Loader, Runtime Data Area 4가지 영역으로 나누어집니다.

 

https://sjh836.tistory.com/64

 

1. Class Loader

 

 .java 파일을 javac로 컴파일하면 바이트코드(.class)가 나온다. 이 파일을 컴파일 타임이 아닌 런타임에(동적으로) 메모리로 올려서 실행하는 부분이 Class Loader이다.

 

2. Garbage Collector

 

 Runtime Data Area 중 Heap영역에 더 이상 사용하지 않고 자리만 차지하고 있는 객체들을 제거하는 역할을 수행한다. 자동으로 실행되기 때문에 언제 정확히 언제 실행되는지 알기 어렵다. 기본적인 특징은 GC가 수행되는 동안 GC를 실행하는 스레드 외 모든 스레드가 일시정지된다.

 

 

3. Execution Engine

 

  Class Loader에 의해 Runtime Data Area에 적제 된 .class파일들을 하나의 명령 단위로 읽어서 컴퓨터가 이해할 수 있는 기계어로 번역하고 명령을 실행한다.

 

※ 실행 방식의 2가지

  • 인터프리터
  • JIT(Just In Time)

 

4. Runtime Data Area

 

JVM메모리 영역으로 OS로부터 별도로 메모리 공간을 할당받고 JAVA 애플리케이션을 실행할 때 사용된다. Method Area, Heap Area, Stack Area, PC register, Native Method Stack 총 5가지로 구분된다.

 

https://honbabzone.com/java/java-jvm/

 

 

4-1 Method Area(Static Area)

 

 Method Area(Static Area)는 java 애플리케이션이 실행되면 클래스 별로 클래스에서 필요한 패키지 클래스, 런타임 상수풀, 인터페이스, 상수, static변수, final 변수, 클래스 멤버 변수 등 필드데이터, 생성자를 포함한 모든 메서드 정보 등 한번 로드된 후 메모리에 항상 상주하고 있는 영역이다. 그래서 모든 스레드가 공유 가능하다. 예를 들어 Math.abs(-10) 같이 Math 클래스의 메서드를 초기화 없이 바로 사용할 수 있는 것은 해당 영역에 덕분이다.

 

 

4-2 Heap Area

 

 Heap Area은 메서드 안에서 사용되는 객체들을 위한 영역으로 new를 통해 생성된 객체, 배열, immutal 객체 등의 값이 저장된다. 해당 영역에서 생성된 객체들은 다음에 나올 JVM Stack Area의 변수나 다른 객체의 필드에서 참조 가능하다. 때문에 해당 객체를 참조하지 않으면 더는 쓸모가 없어 Garbage Collector에 의해 객체가 Heap 영역에서 제거된다.

 

 

4-3 Stack Area

 

 Stack Area은 스레드마다 하나씩 존재하며 스레드가 시작될 때 할당된다. 내부에는 매소드에서 직접 사용할 지역 변수, 파라미터, 리턴 값, 참조 변수일 경우 주소 값 들이 저장된다. 만약 프로그램에서 매소드가 호출되면 매소드와 매소드 정보는 차곡차곡 Stack에 쌓이면서(PUSH) 내부 과정을 실행한다. 매소드 호출이 종료되면 해당 매소드는 Stack Area에서 제거(POP) 된다.

 

 

4-4 PC register

 

 PC registerThread가 생성될 때마다 생성되는 영역으로 Program counter 즉 현재 쓰레드가 실행되는 부분의 주소와 해당 명령을 저장하고 있는 영역이다. 이것을 이용해 다수의 스레드들이 명령의 흐름을 잃지 않고 함수가 순차적으로 실행된다.

 

 

4-5 Native Method Stack

 

 Native Method Stack은 자바 외 다른 언어로 작성된 네이티브 코드를 수행하기 위한 메모리 영역이다. JAVA 이외의 다른 언어에서 제공되는 Method의 정보가 저장된다.

 

 

7. JDK와 JRE의 차이

 

 Java SE(Standard Edition)의 구현체는 두 가지의 버전이 존재하는데 이는 컴파일된 자바 프로그램을 실행시킬 수 있는 자바 환경인 JRE(Java Runtime environment)와 자바 프로그래밍 시 필요한 컴파일러, JVM, 라이브러리 API 등을 포함하고 있는 JDK(Java Development kit)가 있다. JRE에는 JVM과 라이브러리 API만 포함되어 있기 때문에 자바 프로그램을 개발할 것이 아닌 프로그램 실행 용도로 사용하는 도구이다.

 

오라클은 자바 11부터 JDK만 제공하며 JRE를 따로 제공하지 않는다.

 

한마디로 표현하면 다음과 같다.

 JRE = JVM + 표준 클래스 라이브러리

 JDK = JRE + 개발에 필요한 도구

 

 

출처 

책 : 이것이 자바다(한빛 미디어)

위키백과 : ko.wikipedia.org/wiki/%EB%B0%94%EC%9D%B4%ED%8A%B8%EC%BD%94%EB%93%9C

 

 

댓글