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 버전부터 상용으로 사용할 때 유료.
-
- 오라클에서 만든 Oracle open jdk는 11버전은 무료
- 오라클에서 만들지 않은 open jdk
- https://medium.com/@javachampions/java-is-still-free-3-0-0-ocrt-2021-bca75c88d23b
JVM 언어
최초의 JVM은 자바만을 지원하기 위해 만들어졌는데 자바와 직접적으로 연관이 있는 것이 아니기 때문에 의존성이 타이트하지 않다.
어떠한 다른 프로그래밍 언어로 코딩하더라도, 컴파일 했을 때 클래스 파일이 만들어진다거나 java 파일이 만들어진다면 JVM을 사용하면 된다.
JVM이 쌓아온 노하우, 프로파일링 툴, 성능 최적화, JVM에 있는 인터프리터와 JIT 컴파일러를 사용할 수 있는 것이다.
- JVM 기반으로 동작하는 프로그래밍 언어
- 클로저, 그루비, JRuby, Jython, Kotlin, Scala, ...
참고
- JIT 컴파일러: https://aboullaite.me/understanding-jit-compiler-just-in-time-compiler/
- JDK, JRE 그리고 JVM: https://howtodoinjava.com/java/basics/jdk-jre-jvm/
- https://en.wikipedia.org/wiki/List_of_JVM_languages
'공부방 > JAVA' 카테고리의 다른 글
클래스로더 시스템 (0) | 2023.03.25 |
---|---|
JVM 구조 (0) | 2023.03.24 |
다양한 종류의 Garbage Collection(가비지 컬렉션) 알고리즘 (2/2) (0) | 2023.03.23 |
[Java] Garbage Collection(가비지 컬렉션)의 개념 및 동작 원리 (1/2) (0) | 2023.03.22 |
equals, hashcode (0) | 2023.03.10 |