JDK, JRE, JVM의 차이

이태현·2024년 1월 14일
0
post-thumbnail

Java의 WORA 원칙

WORA는 write once run anywhere의 약자로

한 번 쓰고, 모든 곳에서 실행한다

라는 원칙을 가지고 있습니다.

자바의 WORA원칙을 설명할 때 가장 쉽게 비교되는 것이 C언어입니다.
C언어로 작성된 프로그램은 실행되는 OS환경에 종속적이라고 할 수 있습니다.

C언어로 작성된 프로그램이 종속적인 이유

  1. cpu마다 기계어가 다르다.
    기계어는 java나 python처럼 통일된 문법이 없으며, 각 cpu제조사마다 다른 기계어 규칙을 따른다.
  2. 다양한 cpu환경에서 실행할 수 있도록, 각 cpu 제조사에 맞는 기계어로 번역 가능한 프로그램을 개발해야한다.
  3. OS마다 API가 다르다.
    a. cpu마다 기계어가 다르듯이 OS마다 애플리케이션에 OS에 내리는 명령어가 달라진다.
    b. OS가 동일하다면 하드웨어가 변경되더라도 코드를 수정할 필요가 없다.
  4. OS마다 실행파일 형식이 다르다.

과거에는 다양한 OS가 존재함에 따라, 기존의 방식대로라면 모든 OS에 맞는 프로그램을 각각 개발해야했습니다. 비슷한 코드를 반복적으로 작성해야하는 문제를 해결하고자 Java가 등장했습니다.

자바는 JVMbyte code를 이용하여 실행되기 때문에, 플랫폼(OS)이나 HW와 상관없이 실행될 수 있도록 하였습니다.
이러한 java의 특징을 WORA라고 하며, 한번 코드를 작성하면, 어떤 환경에서도 동작한다는 것을 의미합니다.

JVM(Java Virtual Machine)

자바 가상 머신이라고 부르며, 자바 바이트 코드를 실행시키기 위한 가상의 기계라고 생각할 수 있습니다.
자바는 JVM환경 위에서만 동작할 수 있으며, 어떤 운영체제인지와는 상관 없이 JVM이 설치되어 있다면 언제든지 실행될 수 있습니다. 반면에 JVM의 경우, 각 운영체제에 맞는 JVM을 설치해야 합니다.

JVM의 구성

  1. 자바 인터프리터
    자바 컴파일러에 의해 변환된 바이트코드(.class파일)을 읽고 해석하는 역할을 합니다.
  2. 클래스 로더
    자바는 동적으로 클래스를 읽어 옵니다. 프로그램이 실행중인 런타임에 모든 코드가 가상머신과 연결되며, 이렇게 동적으로 클래스를 로딩하는 역할을 클래스 로더가 합니다.
  3. JIT 컴파일러
    프로그램이 실행 중인 런타임에 실제 기계어로 변환해주는 컴파일러를 의미합니다. 동적 번역 기법은 프로그램의 실행속도를 향상시키기 위해 고안되었고, JIT컴파일러는 자바 컴파일러가 생성한 자바 바이트 코드를 런타임에 기계어로 변환되는데 사용됩니다.
  4. 가비지 컬렉터
    개발자 대신 더이상 사용되지 않는 메모리를 자동으로 회수하는 역할을 합니다.

java의 실행 순서

출처 : https://tcpschool.com/java/java_intro_programming

  1. .java형식의 java파일을 작성한다.
  2. java compiler(javac.exe)가 java파일을 JVM의 클래스 로더에게 전달하며 byte code로 이루어져있는 .clss파일로 변환한다.
    (.class파일은 기계어가 아닌 JVM이 이해할 수 있는 형식)
  3. 클래스 로더는 동적 로딩을 통해 필요한 클래스를 런타임 데이터 영역(JVM의 메모리)에 올린다.
  4. 실행 엔진은 JVM 메모리에 올라온 바이트 코드들을 명령어 단위로 가져와서 실행한다.
    (이때 실행 엔진은 byte code를 인터프리터 방식과 JIT 컴파일러 방식을 통해 기계어로 변환되며, 실행된다.)

** JIT 컴파일러 방식이란?
just-in-time 컴파일의 약자입니다.
인터프리터 방식을 사용하는 언어에서 실행속도를 향상시키기 위해 고안된 컴파일러 방식입니다.
많은 코드를 인터프리터 방식으로 실행하게되면 실행 속도가 매우 느려지기 때문에, 같은 코드를 매번 해석하는 대신 처음 실행될 때 인터프리트를 하면서 자주 쓰이는 코드를 캐싱한뒤,
이후에는 캐싱된 코드를 가져다 사용하며, 인터프리터의 느린 실행속도를 보완할 수 있다는 장점이 있습니다.
반면에 초기 구동 시에는 소스코드를 실행하는 단계에서 컴파일하는데 시간과 메모리를 소모하기 때문에 정적 컴파일된 프로그램에 비해서 실행속도면에서 손해본다는 단점이 있습니다.

JDK, JRE, JVM의 차이

업로드중..
출처: https://velog.io/@fe1/JDK-JRE-JVM

이 셋의 관계는 다음과 같이 나타낼 수 있다
JDKJREJVMJDK \supset JRE \supset JVM

JDK : Java Development Kit

JDK는 java프로그램을 개발하기 위해 필요한 도구 모음입니다. JDK는 JRE를 포함하고 있으며, JRE는 JVM을 포함하고 있습니다.
JDK안에는 자바를 개발할 때 필요한 라이브러리와 javac, javadoc등의 개발 도구를 포함하고 있으며, 앞서 언급했듯이 자바 프로그램을 실행시키기 위한 JRE를 포함하고 있습니다.

JRE : Java Runtime Environment

JVM과 자바 프로그램을 실행시킬 때 필요한 라이브러리 API를 함께 묶어서 배포하는 패키지입니다. JRE에는 자바 클래스 라이브러리, 자바 클래스 로더, 자바 가상머신이 포함됩니다. 추가적으로 자바 런타임 환경에서 사용하는 프로퍼티 셋팅과 리소스 파일을 가지고 있습니다.
개발 관련 도구를 포함하지 않기 때문에 JRE만 가지고는 자바파일을 컴파일 할 수는 없습니다.

JVM : Java Virtual Machine

자바 프로그램을 컴파일하여 만들어진 바이트 코드를 실행해주는 가상 머신을 의미합니다.
자바는 프로그램의 수정없이 어떠한 운영체제에서도 동일한 형태로 실행 가능함을 보장합니다. 자세한 설명은 상단의 JVM part를 참조해주시면 됩니다.

참고

https://ar-tec.tistory.com/802
https://t0pli.tistory.com/51
https://www.itworld.co.kr/news/110768
https://tcpschool.com/java/java_intro_programming

profile
할까말까 고민된다면, 일단 시작하자!

0개의 댓글