본문 바로가기
프로그래밍/자바(Java)

JAVA JDK , JRE 차이점 및 JVM

by imfireguy 2020. 9. 30.
반응형

 

JAVA JDK , JRE 차이점 및 JVM

목차

 - JAVA JDK는 무엇일까요?

 - JAVA JRE는 무엇일까요?

 - JVM은 무엇일까요?

 - JVM 구성

 - JDK, JRE, JVM 관계

 

JAVA JDK는 무엇일까요?

JDK는 Java Development Kit의 약자로 말그대로 자바 개발시 필요한 툴킷을 제공하는 도구 모음 입니다.

개발할려면 당연히 실행도 되어야 함으로 JDK안에는 JRE가 포함 됩니다.

 

JAVA JRE는 무엇일까요?

JRE는 Java Runtime Enviroment의 약자로 자바 프로그램을 실행시켜주는 환경을 구성해주는 도구 입니다.

즉, JAVA로 개발할 필요는 없는데 실행이 필요한 경우에 꼭 JRE가 있어야 합니다.

반면에 JAVA 개발 시 꼭 필요한 것이 있는데 그게바로 JDK 입니다.

 

JVM은 무엇일까요?

JVM이란 JAVA Virtual Machine 즉 자바 가상머신의 약자를 부르는 용어 입니다.

가상머신이란 프로그램을 실행하기 위해 물리적 머신과 유사한 머신을 소프트웨어로 구현한것 입니다.

 

JVM의 역활은 자바 어플리케이션을 클래스 로더를 통해 읽어 들여 자바API와 함께 실행하는것 입니다.

그리고 JVM은 JAVA와 OS사이에서 중개자 역할을 수행하여 JAVA가 OS에 구애받지 않고 재사용을 가능하게 해줍니다.

 

그리고 가장 중요한 메모리관리  GC(Garbage Collection)를 수행 합니다.

JVM은 스택기반의 가상 머신 입니다. ARM 아키텍처같은 하드웨어는 레지스터 기반으로 동작하는데에 비해 JVM은 스택기반으로 동작 합니다.

 

그리고 자바 가상머신을 알아야 하는 이유는 한정된 메모리를 효율적으로 사용하여 최고의 성능을 내기 위해서라고 생각 하시면 될거 같습니다.

 

메모리 효율성을 위해서 메모리 구조를 알아야 하기 때문 입니다. 동일한 기능의 프로그램이라고 하더라도 메모리 관리에 따라 성능이 좌우될 수 있습니다.

 

메모리 관리가 되지 않은 경우 속도저하 현상이나 튕김현상등이 일어날 수 있습니다. 

그래서 가상머신을 알아야 하는것 입니다.

 

자바 프로그램 실행과정

 

1. 프로그램이 실행되면 JVM은 OS로부터 이프로그램이 필요로 하는 메모리를 할당 받습니다.

JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리 합니다.

 

2. 자바 컴파일러(javac)가 자바 소스코드 예를들어 Test.java를 읽어들여 자바 바이트코드 Test.class로 변환 시킵니다.

 

3. Class Loader를 통해 Class파일들을 JVM으로 로딩 합니다.

 

4. 로딩된 Class파일들은 Execution Engine을 통해 해석 됩니다.

 

5. 해석된 바이트코드는 Runtime Data Area에 배치되어 실질적인 수행이 이루어지게 됩니다.

 

이러한 실행과정속에서는 JVM은 필요에 따라 Thread Synchronization과 같은 GC(Garbage Collection)) 같은 관리작업을 수행 합니다.

 

JVM 실행순서

 

JVM 구성

1. Class Loader(클래스 로더)

 

클래스( .class)파일을 로드하고 링크를 통해 배치하는 작업을 수행하는 모듈입니다.

Runtime 시에 동적으로 클래스를 로드 합니다.

 

jar 파일 내 저장된 클래스들을 JVM위에 탑재하고 사용하지 않는 클래스들은 메모리에서 삭제 합니다.(컴파일러 역할)

자바는 동적코드, 컴파일 타임이 아니라 런타임에 참조 합니다.

 

즉 달리 말해서 클래스를 처음으로 참조할 때 해당클래스를 로드하고 링크한다는것 입니다.

그리고 그역할을 Class Loader가 수행하게 됩니다.

 

2. Execution Engine(실행 엔진)

 

클래스를 실행시키는 역할을 하게 됩니다. Class Loader가 JVM 내의 런타임 데이터 영역에 바이트 코드를 배치시키면 이것을 실행엔진이 실행시키게 되는것 입니다. 

 

자바 바이트코드는 기계가 바로 수행할 수 있는 언어보다는 비교적 인간이 보기 편한 형태로 기술된것 입니다.

그래서 실행엔진은 이와같은 바이트코드를 실제로 JVM내부에서 기계가 실행할 수 있는 형태로 변경 합니다.

이때 2가지(Interpreter, JIT) 방식을 사용하게 됩니다.

 

3. Interpreter(인터프리터)

 

실행엔진은 자바 바이트 코드를 명령어 단위로 읽어서 실행하게 됩니다.

하지만 이방식은 Interpreter 언어의 단점을 가지고 있습니다.

그것은 한줄씩 읽어서 수행하기 때문에 느린것 입니다.

 

4. JIT(Just In Time)

 

Interpreter 방식의 단점을 보완하기 위해 도입된 JIT 컴파일러 입니다. 

 

Interpreter 방식으로 실행하다가 적절한 시점에 바이트코드 전체를 컴파일하여 네이티브 코드로 변경하고 이후에는 더이상 Interpreter를 하지 않고 네이티브 코드로 직접 실행하는 방식 입니다.

 

네이티브 코드는 캐시에 보관하기 때문에 한번 컴파일된 코드는 빠르게 수행하게 됩니다.

물론 JIT 컴파일러가 컴파일하는 과정은 바이트코드를 Interpreter하는 것보다 훨씬 오래 걸리니 한번만 실행되는 코드라면 컴파일하지 않고 Interpreter하는것이유리합니다.

 

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

 

JDK, JRE, JVM 관계

관계로는 JDK > JRE > JVM 입니다.

 

 

반응형

댓글