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

콜드펌킨·2020년 11월 17일
0

1. JVM이란 무엇인가

JVM(자바 가상 머신, Java Virtual Machine)이란 자바 프로그램을 실행하기 위한 가상 머신으로, 자바 바이트코드(.class)를 OS에 맞게 기계어로 해석하여 자바 프로그램이 OS에 독립적으로 수행될 수 있도록 돕는 역할을 한다.

2. JVM 구성요소

JVM※ 이미지 출처 : https://www.geeksforgeeks.org/how-many-types-of-memory-areas-are-allocated-by-jvm/

Class Loader

자바 컴파일러에 의해 컴파일된 바이트코드들을 엮어 Runtime Data Area로 로드하는 역할을 수행하는 모듈이다. 런타임에 동적으로 바이크코드들을 로드하고 링크한다.

Execution Engine

Class Loader가 로드해 준 바이트코드들을 OS가 이해할 수 있는 기계어로 해석하여 수행하는 모듈이다. 이 때, 자주 사용되는 코드를 내부적으로 캐싱해두고 재사용하는 JIT 컴파일러 방식을 활용한다.
메모리 관리를 위해 Garbage Collector를 수행하기도 한다.

Garbage Collector
Runtime Data Area의 Heap 메모리 영역의 객체들 중 더 이상 참조되지 않는 객체들을 찾아 제거하는 역할을 수행

Runtime Data Area

자바 프로그램 실행을 위해 OS로부터 할당받은 메모리 영역이다. 실행에 필요한 각종 데이터들이 적재된다.

  • Method Area
    클래스 변수, 메소드 관련 정보, 상수 풀, static 변수 등이 저장되는 영역. 모든 스레드가 공유한다.
  • Heap Area
    프로그램 실행 중 new 연산에 의해 생성된 객체들이 저장되는 영역. GC의 타겟이 되는 영역이다. 역시 모든 스레드가 공유한다.
  • Stack Area
    메소드 내에서 사용되는 데이터(파라미터, 지역변수, 리턴 값 등)이 저장되는 영역.
  • PC register
    현재 수행 주인 JVM 명령어의 주소값을 저장해두는 영역.
  • Native Method Stack
    자바 외의 언어로 작성된 네이티브 코드를 위한 영역.

Java 프로그램 실행 과정
1. 자바 프로그램이 실행되면 JVM이 OS로부터 실행에 필요한 메모리(Runtime Data Area)를 할당받는다.
2. 자바 컴파일러가 자바 소스코드(.java)를 읽어 JVM이 이해할 수 있는 바이트코드(.class)로 컴파일한다.
3. JVM의 Class Loader가 바이트코드를 JVM의 Runtime Data Area로 로드한다.
4. JVM의 Execution Engine이 OS에 맞게 바이트코드를 기계어로 해석하여 실행한다.

3. 자바 컴파일 및 실행 방법

컴파일
작성한 자바 소스파일(Hello.java)을 javac 명령어를 사용해 컴파일.

$ javac Hello.java

실행
컴파일된 바이트코드(Hello.class)를 java 명령어를 사용해 실행.

$ java Hello

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

자바로 작성한 소스 코드(.java)를 JVM이 이해할 수 있는 형태(.class)로 컴파일한 코드를 말한다. JVM은 바이트코드를 다시 하드웨어 아키텍처 및 OS가 이해할 수 있는 기계어로 해석(인터프리팅)한다. 이 과정을 통해 자바 프로그램은 OS에 종속적이지 않고 어떤 환경에서도 실행될 수 있게 된다.

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

JIT(Just-In-Time) 컴파일러는 프로그램을 실행하기 전에 전체를 컴파일 하는 방식이 아닌, 프로그램이 실제 실행되는 시점에 기계어로 번역하여 실행하는 방식을 사용하는 컴파일러이다.
JIT 컴파일러는 이 과정에서 자주 사용되는 코드를 JVM 안에 기계어로 캐싱해두고 반복 호출될 때마다 이를 재사용하며, 변경된 부분에 대해서만 다시 인터프리팅을 실행하는 기법을 사용하여 성능을 높였다.

6. JDK와 JRE의 차이

JDK & JRE※ 이미지 출처 : https://www.intexsoft.com/blog/post/jvm.html

JDK (Java Development Kit)

JDK는 자바 실행 환경(JRE)과 자바 프로그램 개발을 위해 필요한 모든 툴들을 모아놓은 소프트웨어 패키지이다. 대표적인 개발 툴들은 다음과 같다.

  • javac
    자바 컴파일러. 자바 소스 파일을 바이트코드를 컴파일.
  • java
    자바 응용 프로그램 로더. javac로 컴파일한 바이트코드를 해석 및 실행.
  • javap
    디스어셈블러. 바이트코드를 자바 소스 코드로 변환.
  • javadoc
    자동 문서 생성기. 소스 코드의 주석으로부터 자동으로 문서를 생성.
  • jar
    압축 툴. 관련있는 클래스 라이브러리들과 리소스들을 하나의 JAR 파일로 묶어줌.

이 외 수많은 개발 툴들이 JDK 안에 포함되어 있다.
※ 참고자료 : https://ko.wikipedia.org/wiki/자바_개발_키트

JRE (Java Runtime Environment)

자바 프로그램을 실행하기 위한 최소한의 환경으로, 바이트코드를 JVM으로 로드하는 역할을 수행한다. 위에서 설명한 JVM과 프로그램 실행에 필요한 라이브러리와 각종 기타 파일들이 포함되어 있다.

※ 참고자료 : https://www.itworld.co.kr/t/62076/%EA%B0%80%EC%83%81%ED%99%94/110768

profile
배우고 때때로 익히면 즐겁지 아니한가

0개의 댓글