[Java] JRE, JDK, JVM 구조
JVM은 자바 바이트코드(.class 파일)를 각 OS에 맞게 네이티브 코드로 변환해(인터프리터, JIT Compiler) 실행한다.
각 OS에 맞게 네이티브 코드로 바꾸기 때문에 특정 플랫폼에 종속적이다.
JRE(Java Runtime Environment): 자바 애플리케이션 실행이 목적, 프로퍼티 세팅, 리소스 파일 등이 포함
(여긴 개발 관련 툴이 포함되지 않음 ex) javac)
JDK(Java Development Kit): JRE + 개발툴, 자바 11부터 JDK만 제공해 JRE를 따로 제공하지 않는다.
Java: 프로그래밍 언어로 자바 컴파일러를 이용해 바이트코드로 컴파일 할 수 있다.
JVM 언어: JVM 기반으로 동작하는 프로그래밍 언어 - 클로저, 그루비, JRuby, Jython, Kotlin, Scala
컴파일 과정
1. 자바 소스 파일이 자바 컴파일러(javac)에 의해 컴파일 되어 class 파일(바이트코드)로 바뀜
2. 이걸 JVM이 실행함(어느 OS 위에서든 다 돌아감)
3. JVM이 바이트코드를 네이티브 머신 코드로 변환해 실행
JVM Architecture
와우 전에 포스팅 했던 JVM 아키텍처다.
좀 더 자세히 나온 자료가 있었다.
class loader system에서 loading(클래스 파일 읽어오기), linking(레퍼런스를 연결하는 과정), initialization(static 값들 초기화하고 변수에 할당) 의 과정이 이뤄진다. 이렇게 바이트코드를 읽어와서 메모리에 저장한다.
메모리에는
Method area에 클래스 수준의 정보들이 저장되며 이것들이 공유되며
Heap 영역에 객체가 저장, 이것도 공유되고,
PC(Program) Register: 쓰레드마다 쓰레드 내 현재 실행할 instruction의 위치를 가리키는 포인터가 생성된다.
네이티브 메소드 스택: https://javapapers.com/core-java/java-jvm-run-time-data-areas/#Program_Counter_PC_Register
Java JVM Run-time Data Areas - Javapapers
Understanding Java Virtual Machine (JVM) run-time data areas are critical to better Java programming. One of the most dreaded errors in Java is OutOfMemoryError and it is related to Java Virtual Machine (JVM) memory areas. We should have better understandi
javapapers.com
이거는 나중에 한 번 읽어봐야겠다.
실행 엔진에는
Interpreter가 바이트 코드를 한 줄씩 실행하고
JIT Compiler가 인터프리터 효율을 높이기 위해 프로파일러가 반복되는 코드를 발견하면 JIT 컴파일러로 반복되는 코드를 모두 네이티브 코드로 바꾼다. 그 다음부터 인터프리터는 네이티브 코드로 컴파일된 코드를 바로 사용한다.
GC(Garbage Collector): 더이상 참조되지 않는 객체를 모아서 정리한다.
JNI(Java Native Interface)
- 자바 애플리케이션에서 C, C++, 어셈블리로 작성된 함수를 사용할 수 있는 방법 제공
- Native 키워드를 사용한 메소드 호출
- https://medium.com/@bschlining/a-simple-java-native-interface-jni-example-in-java-and-scala-68fdafe76f5f
네이티브 메소드 라이브러리
- C, C++로 작성 된 라이브러리
출처
더 자바, 코드를 조작하는 다양한 방법
https://howtodoinjava.com/java/basics/jdk-jre-jvm/
https://dzone.com/articles/jvm-architecture-explained
The JVM Architecture Explained - DZone Java
This post explores the JVM architecture, what it is, how it operates, why it's useful, and presents a helpful diagram that highlights major JVM functionalities.
dzone.com