만쥬의 개발일기
article thumbnail

자바의 실행 과정

자바를 실행하기 위한 머신 JVM

우선 JDK에 대해 알기 전에, 자바 코드가 컴파일되고 실행되는 과정을 먼저 알아보자.

JAVA는 실행시키는 운영체제에 독립적이라는 장점을 가지고 있다. 그리고 JVM은, 이를 위해 필요한 머신이다.

java의 경우 JVM,즉 컴퓨터가 이해할 수 있는 형태는 바이트 코드로 이루어진 .class 파일이다.

우리가 java로 작성한 코드는 .java 파일인데, 이를 java 컴파일러가 .java 파일을 .class 라는 자바 바이트 코드로 변환해 주는 것이다.

컴파일을 해주는 Java Compiler

java compiler는 자바를 실행하기 위해 필수인 JDK를 설치할 때에, bin 하위의 javac.exe를 말한다.

즉, javac 명령을 통해 .java를 .class파일로 컴파일 할 수 있는 것이다.

그러나 이렇게 변환된 바이트코드 또한 기계어가 아니기 때문에 OS에서는 이를 실행하지 못한다.

따라서 이때 JVM이 OS가 바이트코드를 이해할 수 있게 해석해주고, 이 덕분에 바이트코드 들은 JVM 위에서 OS 상관없이 실행될 수 있는 것이다.

JRE 자바 인터프리터 실행과정

JDK 디렉토리의 bin 폴더 하위의 java.exe는 JVM을 구동시키기 위한 명령 프로그램이고, 자바 인터프리터, 컴파일러가 생성한 바이트 코드를 해석 실행한다.

java 명령어로 JVM을 실행 가능하다.

그리고 JVM이 바이트 코드를 바이너리 코드로 변환함으로서, CPU가 이해할 수 있는 기계어가 되는 것이다.

프로그램을 실행하는 방식은 다음 두 가지가 있다.

1) 인터프리터 방식

2) 정적 컴파일 방식 (JIT 컴파일러)

인터프리터 방식은 프로그램을 실행할 때마다 기계어로 한줄씩 변환하는 작업으로, 간편하지만 성능이 매우 느리다.

정적 컴파일 방식실행하기 전에 미리 기계어로 변환하는 작업을 말한다.

따라서 변환작업은 딱 한번만 수행된다.

 

JVM은 인터프리터 방식만 이용하여 한줄 한줄 읽기 때문에 실행속도가 느린 단점이 있었다.

JIT 컴파일(just-in-time compliation)은 인터프리터 방식의 단점을 보완하기 위해 도입되었다.

JIT 컴파일러는 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일러이다.

 

기계어(컴파일된 코드)는 캐시에 보관하기 때문에 한 번 컴파일된 코드는 빠르게 수행하게 된다.물론 JIT 컴파일러가 컴파일하는 과정은 바이트 코드를 인터프리팅하는 것보다 훨씬 오래걸리므로 한 번만 실행되는 코드라면 컴파일 하지 않고 인터프리팅하는 것이 유리하다.

 

따라서 JIT 컴파일러를 사용하는 JVM들은 내부적으로 해당 메서드가 얼마나 자주 수행되는지 체크하고 일정 수준을 넘을 때에만 컴파일을 수행한다.

 

자바에선 자바 컴파일러가 자바 프로그램 코드를 바이트 코드로 변환한 다음,실제 바이트 코드를 실행하는 시점에서 자바 가상 머신(JVM, 정확히는 JRE)이 바이트 코드를 JIT 컴파일을 통해 기계어로 변환한다.

JavaC 컴파일러 vs JIT 컴파일러 요약
javac 컴파일러가 하는 일은 java파일을 어떤 OS에서도 수행 가능한 class파일(바이트코드)로 변환하는 것일 뿐이다.
JIT 컴파일러가 하는 일은 바이트코드를 컴퓨터가 이해하기 위한 언어(기계어)로 다시 변환작업을 한다.

 

JVM 구성요소

  1. Class Loader : 동적로딩(Dynamic Loading)을 통해 필요한 클래스들을 로딩 및 링크하여 런타임 데이터 영역(Runtime Data area), 즉 JVM의 메모리에 올린다.
  2. GC (Garbage Collector) : 더 이상 사용되지 않는 객체 / 메모리 누수로 접근할 수 없는 객체를 식별하고 제거하는 가비지 콜렉팅을 한다.
  3. Execution Engine : JVM 메모리에 올라온 바이트 코드를 명령어 단위로 하나씩 실행한다. 이때 실행은 인터프리터 JIT 두 가지 방식을 가진다.
  4. Runtime Data Area : JVM에서 메모리를 관리하는 영역. 데이터 및 메모리를 저장하는 공간이다.

JDK VS JRE

JDK

Java Development Kit (자바 개발 키트)

Java 를 사용하기 위해 필요한 모든 기능을 갖춘 Java용 SDK (Software Development Kit)이다.

JDK 는 JRE를 포함하고 있다.JRE에 있는 모든 것 뿐만 아니라 컴파일러(javac)와 jdb(자바용 디버거), javadoc(자바 코드의 주석을 기반으로 API 문서 생성)과 같은 도구도 있다. 즉, JDK는 프로그램을 생성, 실행, 컴파일할 수 있다.

JRE

Java Runtime Environment (자바 런타임 환경)

JVM + 자바 클래스 라이브러리(Java Class Library) 등으로 구성되어 있다.컴파일 된 Java 프로그램을 실행하는데 필요한 패키지이다.

요약

JDK는 자바 프로그램을 실행, 컴파일, 개발용 도구이고, JRE, JVM를 모두 포함하는 포괄적인 키트이다.

JRE는 자바 프로그램을 실행할 수 있게 하는 도구이다. JVM을 포함하고 있다.

profile

만쥬의 개발일기

@KangManJoo

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!