본문 바로가기

공부방/JAVA

자바, JVM, JDK 그리고 JRE

JVM (Java Virtual Machine)

  • 자바 가상 머신
  • 자바 바이트 코드를 어떻게 실행할 지에 대한 표준 스펙
  • 자바 바이트 코드(.class 파일)를 OS에 특화된 코드로 변환(인터프리터와 JIT 컴파일러)하여 실행한다.
  • 바이트 코드를 실행하는 표준(JVM 자체는 표준)이자 구현체(특정 밴더가 구현한 JVM)다.
  • JVM 스팩: https://docs.oracle.com/javase/specs/jvms/se11/html/
  • JVM 밴더: 오라클, 아마존, Azul, ...
  • 특정 플랫폼에 종속적. (네이티브 코드로 바꿔서 실행해야 하는데 네이티브 코드가 OS에 맞춰서 실행해야 하기 때문에)
  • 구현체는 다양하다.

컴파일

javac HelloJava.java

HelloJava.class <- 클래스 파일 안에 들어있는게 바이트 코드이다.

 

바이트 코드를 실행하는게 인터프리터와 JIT 컴파일러를 써서 native os (mac...)에 맞춰 machine code로 맞춰서 100100 뭐 이런 코드로 변환하고 실행디는 것이다.

 

클래스 읽고

메모리에 올리고 실행해야하고,

 

JVM은 여러 벤더에서 spec만 맞춰서 구현하고 있다.

 

 

 

 

JRE (Java Runtime Environment): JVM + 라이브러리


JVM은 홀로 제공되지 않는다.

최소한의 배포 단위가 JRE이다.

 

  • 자바 애플리케이션을  java application을 실행할 수 있는, 실행하는데 필요한 것만 들어있는 배포판이다.
  • JVM과 핵심 라이브러리 및 자바 런타임 환경에서 사용하는 프로퍼티 세팅이나 리소스 파일을 가지고 있다.
    • 핵심 라이브러리 : rt.jar, characterset.jar 등등..
  • 개발 관련 도구는 포함하지 않는다. (그건 JDK에서 제공)
    • 컴파일 할 때 사용하는 javac 같은 것은 존재하지 않는다.

 

JDK (Java Development Kit): JRE + 개발 툴


  • JRE + 개발에 필요할 툴
  • 소스 코드를 작성할 때 사용하는 자바 언어는 플랫폼에 독립적.
  • 오라클은 자바 11부터는 JDK만 제공하며 JRE를 따로 제공하지 않는다.
    • java9 version 부터 module system을 이용하여 JRE를 구성할 수 있다. (jlink) 그래서 따로 제공을 하지 않는 것 같음.
    • 대부분 JDK를 다운받아서 사용함.
  • Write Once Run Anywhere

 

자바


  • 프로그래밍 언어
  • JDK에 들어있는 자바 컴파일러(javac)를 사용하여 바이트코드(.class 파일)로 컴파일 할 수 있다.
  • 자바 유료화? 오라클에서 만든 Oracle JDK 11 버전부터 상용으로 사용할 때 유료.

 

JVM 언어


최초의 JVM은 자바만을 지원하기 위해 만들어졌는데 자바와 직접적으로 연관이 있는 것이 아니기 때문에 의존성이 타이트하지 않다.

어떠한 다른 프로그래밍 언어로 코딩하더라도, 컴파일 했을 때 클래스 파일이 만들어진다거나 java 파일이 만들어진다면 JVM을 사용하면 된다. 

JVM이 쌓아온 노하우, 프로파일링 툴, 성능 최적화, JVM에 있는 인터프리터와 JIT 컴파일러를 사용할 수 있는 것이다.

  • JVM 기반으로 동작하는 프로그래밍 언어
  • 클로저, 그루비, JRuby, Jython, Kotlin, Scala, ...

 

참고