본문 바로가기

개발/자바

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

목표

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

학습할 것

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

 

1. JVM이란 무엇인가

 

1.1 JAVA, JVM, JRE, JDK의 차이

 

위 네가지의 관계는 아래 그림으로 표현할 수 있다. 

# 자바

- 프로그래밍 언어

- JDK에 들어있는 자바 컴파일러(javac)를 사용하여 바이트 코드(.class 파일)을 만들 수 있다

 

# JVM (Java Virtual Machine, 자바 가상머신) 

- 자바 바이트 코드(.class 파일)을 OS(예. Linux, Window)에 특화된 기계어로 변경한다.

 - JVM은 다양한 밴더에 의해 제공된다. (예. 오라클, 아마존..)

- 자바뿐만 아니라 다양한 JVM언어(예. Kotlin, Scala, Jython.)이 존재. 

- GC(Garbage Collection)의 역할도 함

   -> C에서는 메모리 해제 직접 해줘야했음. 

 

# JRE  (Java Runtime Enviroment)

- JRE = JVM + 라이브러리 + 자바 런타임에서 사용되는 리소스,프로퍼티세팅

- 자바 애플리케이션을 실행할 수 있는 환경

 

# JDK (Java Development Kit)

- JRE + 개발에 필요한 모든 툴 (예.javac)

 

 

2. 컴파일 하는 방법 

a. java 파일을 만든다

 

b.  javac를 이용해 .claa 파일로 컴파일

c. javap를 이용하여 디컴파일. 결과물 확인

 

3. 실행하는 법

터미널창에서 java (예제파일이름).class 을 입력하면, JVM이 class의 바이트코드를 읽고 실행한다. 

**주의 .class 확장자명은 입력하지 말것. (Could not find class 에러 발생함)

 

4. 바이트 코드란

- OS에 무관하게, JVM만 설치되어있다면 실행 가능.

- 코드는 (1) 소스코드 -> (2)바이트코드 ->  (3)기계어(예.010101) 의 순으로 번역된다.

- 바이트코드의 명령어 크기는 1바이트. 따라서 바이트 코드라 불린다. 

 

5. JIT ( Just In Time) 컴파일러

바이트 코드에서 기계어로 바꾸는 방법은 두가지가 있다. 

(1) 컴파일 방식: 시작단계에서 소스코드를 모두 기계어(native language)로 변환 -> 빌드 때 느리다

(2) 인터프리터 방식: 빌드시 작업 없다. 대신 런타임에서 한줄씩 읽는다. -> 런타임때 느리다 

 

JAVA는 이 두가지 방식을 모두 사용. 이에 따라 JIT 컴파일러를 도입했다.

JIT 컴파일러는 인터프리터가 반복해서 읽어야할 코드는 저장소에 미리 번역하여 저장해둔다.

   

아래의 동작 방법을 참고하자. 

참고: https://catch-me-java.tistory.com/11?category=438116 

 

[Java-3] JVM과 JIT 컴파일러란?

전 글에서는 JAVA의 바이트 코드에 대해서 알았다. 이번에는 그 바이트코드를 가지고 어떻게 실행하는지 알아보기 위해, 기본적인 JVM의 JIT 에 대해서 알아보도록 하자. 먼저 실행을 하기 위해서

catch-me-java.tistory.com

 

 

5. JVM 구성 요소

-> 작성 예정

 

6. JDK와 JRE의 차이

-> 작성 예정