
JDK, JRE, JVM 구조

JVM (Java Virtual Machine)
- 자바 가상 머신으로 자바 바이트코드(.class 파일)를 os에 특화된 코드로 변환(인터프리터와 JIT컴파일러)하여 실행한다.
- 바이트 코드를 실행하는 표준(JVM 자체는 표준)이자 구현체다.(특정 밴더가 구현한 JVM)
- JVM 밴더: 오라클, 아마존, Azul... etc..
- 어느 환경에서든 자바 코드를 실행 할 수 있다.
- 메모리 관리, Garbage Collection(GC)등 많은 고급 기술을 사용하여 Java 애플리케이션에 최적의 성능을 제공
자바프로그램 실행과정
- 프로그램이 실행되면 JVM은 OS로부터 이 프로그램이 필요로 하는 메모리를 할당받음, JVM은 이 할당받은 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.
- 자바 컴파일러(javac)가 자바 소스코드(.java)를 읽어들여 자바 바이트 코드(.class)로 변환시킨다.
- Class Loader를 통해 class파일들을 JVM으로 로딩한다.
- 로딩된 class파일들은 Execution engine을 통해 해석된다.
- 해석된 바이트 코드는 Runtime Data Areas에 배치되어 실직적인 수행이 이루어지게 된다.
이러한 실행과정 속에서 JVM은 필요에 따라 Thread Synchronization과 GC같은 관리작업을 수행한다.

JVM 구성
- 클래스 로더(Class Loader)
- JVM내로 클래스(.class파일)를 로드하고 메모리에 저장
- 로딩(Loading) : 클래스를 읽어오는 과정
- 링크(Linking) : 레퍼런스를 연결하는과정
- 초기화(Initialization) : static값들 초기화 및 변수에 할당
- 메모리(Runtime Data Area)
- 프로그램을 수행하기 위해 OS에서 할당받은 메모리 공간
- 힙(Heap) 영역 : 객체를 저장, 공유자원이다.
- 스택 영역 : 프로그램 실행과정에서 임시로 할당되었다가 메소드를 빠져나가면 바로 소멸되는 특성의 데이터를 저장하기 위한 영역이다.
- 네이티브 메소드 스택 : 자바 프로그램이 컴파일 되어 생성되는 바이트 코드가 아닌 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역이다.
- 이부분을통해 C code를 실행시켜 Kernel에 접근할 수 있다.
- PC(Program Counter) 레지스터 : 쓰레드가 어떤 부분을 어떤 명령으로 실행해야할지에 대한 기록을 하는 부분
- Method Area : 클래스 정보를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간.

- 실행 엔진(Execution Engine)
- 클래스를 실행시키는 역할
- 인터프리터(Interpreter) : 바이트 코드를 명령어 단위로(한줄씩)실행
- JIT 컴파일러 : 인터프리터 효율을 높이기 위해 사용, 인터프리터가 반복되는 코드를 발견하면 JIT컴파일러로 반복되는 코드를 모두 네이티브 코드로 바꿔둔다. 그 다음부터 인터프리터는 네이티브 코드로 컴파일된 코드를 바로 사용한다.
- GC(Garbage Collector) : 더이상 참조되지 않는 객체를 모아서 정리한다.
JRE (Java Runtime Environment) : JVM + 라이브러리
- 자바 애플리케이션을 실행할 수 있도록 구성된 배포판
- 자바 애플리케이션을 실행하려면 시스템에 JRE가 설치되어 있어야함
- JVM과 핵심 라이브러리 및 자바 런타임 환경에서 사용하는 프로퍼티 세팅이나 리소스파일을 가지고 있다.
- 개발 관련 도구는 JDK에서 제공
JDK(Java Development Kit) : JRE + 개발 툴
- JRE + 개발 툴
- 소스 코드를 작성할 때 사용하는 자바 언어는 플랫폼에 독립적.
- 오라클은 자바 11부터 JDK만 제공하며 JRE를 따로 제공하지 않는다.
자바
- 프로그래밍 언어
- JDK에 들어있는 자바 컴파일러(javac)를 사용하여 바이트코드(.class 파일)로 컴파일 할 수 있다.
- 자바 유료화는 오라클에서 만든 Oracle JDK 11버전부터 상용으로 사용할 때 유료이다.
- openJDK, amazon Corretto.... <- 무료!!
참고 : https://howtodoinjava.com/java/basics/jdk-jre-jvm/
출처 : https://asfirstalways.tistory.com/158
'Backend > JAVA' 카테고리의 다른 글
객체지향 5원칙 (SOLID) (0) | 2021.07.28 |
---|---|
객체지향 프로그래밍(OOP) (0) | 2021.07.27 |
JAVA JWT payload 가져오는 방법 / 만료시간 체크 (0) | 2021.06.09 |
[Tibero/Geometry 에러 처리] Data is too long for the column 에러/ tbClob/tbBlob 처리 방법(feat. GIS) (0) | 2021.05.13 |
[JAVA] Null/NaN/공백/문자열 처리 (0) | 2021.05.06 |