JAVA::JVM에 대한 이해
공부방/JAVA

JAVA::JVM에 대한 이해

이 글은 '백기선의 더 자바, 코드를 조작하는 다양한 방법' 강좌를 듣고 해당 내용을 공부하며 정리한 글입니다.

JVM에 대한 이해

자바를 사용할 때 사용하게 되는 JVM, JRE, JDK 그리고 자바에 대해서 알아보려고 한다.

JVM이란? Java Virtual Machine의 약자.
자바 애플리케이션을 클래스 로더를 통해 읽어 들여 자바 API와 함께 실행하는 것으로 JAVA와 OS사이에서 중개자 역할을 수행하여 JAVA가 OS의 영향을 받지 않고 재사용할 수 있게 해준다.

 


자바, JVM, JRE, JDK

JVM(Java Virtual Machine)

  • 자바 가상 머신으로 자바 바이트 코드(.class파일)를 OS에 특화된 코드로 변환(인터프리터와 JIT 컴파일러)하여 실행
  • 바이트 코드를 실행하는 표준(JVM 자체는 표준)이자 구현체(특정 벤더가 구현한 JVM)
  • JVM 밴더 : 오라클, 아마존, Azul 등등
  • 플랫폼에 종속적

JVM의 스팩의 경우 'The Java® Virtual Machine Specification (oracle.com)'을 참고하면 된다.

위에서 정리한것처럼 자방 가상머신이고 바이트코드를 어떻게 실행할 수 있는지에 대한 스팩이며, 구현체는 다양하고 플랫폼에 종속적임을 알 수있습니다.

 

JVM은 다만 최소한의 배포단위가 JRE이기 때문에 JRE를 통해 JVM과 Library가 한번에 배포된다.

JRE(Java Runtime Environment)

  • 자바 애플리케이션을 실행할 수 있도록 구성된 배포판
  • JVM과 핵심 라이브러리 및 자바 런타임 환경에서 사용하는 프로퍼티세팅이나 리소스파일을 가지고 있습니다.(JVM+라이브러리)
  • 개발 관련 도구를 포함하고 있지 않습니다.(JDK에 포함)

JRE의 경우 java 컴파일러인 javac가 들어있지 없기 때문에 실행은 할수 있지만 

JDK(Java Development Kit)

개발자로서 JRE를 설치해서는 따로 컴파일을 할 수 없기 때문에 JDK를 따로 설치해줘야했습니다. 

하지만, 오라클의 경우 java 11부터는 jre를 따로 제공하지 않기 때문에 크게 신경 쓸 필요가 없으며, 굳이... 구분이 의미가 없어졌지만 대충 무엇인지는 알아둘 필요가 있습니다.

  • JRE+개발에 필요한 Tool
  • 소스코드를 작성할 때 사용하는 자버 언어는 플랫폼에 독립적

자바

  • C와 같은 프로그래밍 언어
  • JDK에 들어있는 자바 컴파일러(javac)를 사용하여 바이트코드(.class 파일)로 컴파일이 가능

자바 유로화가 한창 이슈가 된적이 있었는데 그 유료화의 조건이 꽤나 복잡했습니다.

오라클이 만든 jdk를 상용화로 사용할 경우에만 적용되기 때문에 개인이 상용화를 목적으로 사용하지 않거나 오라클 jdk가 아닌 다른 openJdk를 사용할 경우에는 유료화가 적용되지 않기때문에 자바 유료화는 맞는 말이 아니다.

즉 자바 유료화가 아닌 오라클 JDK의 상용화의 유료화 이다.

JVM 언어

jvm은 자바만을 목적으로 만들어 졌으나 중간에 바이트코드(.class 파일)만 만들어지면 컴파일이 가능

즉, 어떠한 언어를 사용하더라도 바이트코드(.class 파일)만 만들어지면 JVM를 활용할 수 있다.

 

JVM이 갖고 있는 오랫동안 축적된 노하우, 프로파일링 툴, 성능최적화, 인터프리터, 컴파일러등을 활용해서 빠르게 실행할 수 있다.

  • jvm기반으로 동작하는 프로그래밍 언어 :: 바이트코드(.class파일)를 만들어내는 프로그래밍 언어
  • 클로저, 그루비, JRuby, Jython, Kotlin 등등

JVM 구조

JVM, JRE, JDK에 대해서 알아보았다. 그렇다면 JVM의 구조에 대해서 정리해보면 다음과 같습니다.