JDK,JRE,JVM

JDK (Java Development Kit) : 자바로 개발하는 데 사용되는 SDK 키트
- 자바 개발 시 필요한 라이브러리들과 javac,Javadoc 등의 개발 도구들을 포함하며 자바 프로그램을 실행을 위한 JRE도 포함
JRE : 자바 프로그램을 실행시킬 때 필요한 라이브러리 API를 함께 묶어서 배포되는 패키지
JVM : 자바를 돌리는 프로그램
- 자바로 작성된 모든 프로그램은 JVM에서만 실행되고, 이 때문에 자바 프로그램을 모든 플랫폼에서 제약 없이 동작 할 수 있고, 이는 OS에 종속적이지 않게 된다,
컴파일 과정

- 개발자가 자바 소스코드 작성
- 자바 컴파일러가 자바 소스파일 컴파일(자바 가상 머신이 이해할 수 있는 코드-클래스 파일)
- 컴파일된 바이트 코드를 JVM의 클래스 로더에게 전달
- 클래스 로더는 동적로딩을 통해 JVM 메모리에 올림
- 클래스 로더 세부동작
1.로드 : 클래스 파일을 가져와서 JVM의 메모리에 로드
2.검증 : 자바 언어 명세 및 JVM 명세에 명시된 대로 구성되어 있는지 검사
3.준비 : 클래스가 필요로 하는 메모리 할당.(필드,메서드,인터페이스 등등)
4.분석 : 클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변경
5.초기화 : 클래스 변수들을 적절한 값으로 초기화
- 실행엔진 : JVM 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와서 실행하며 이때, 실행 엔진은 두가지 방식(인터프리터,JIT 컴파일러)
컴파일 언어 vs 인터프리터 언어


JVM 메모리 구조

- 자바로 개발된 프로그램을 실행하면 JVM은 OS로부터 메모리 할당
- 자바 컴파일러(javac)가 자바 소스코드(.java)를 자바 바이트코드(.class)로 컴파일
- Class Loader를 통해 JVM Runtime Data Area로 로딩
- Runtime Data Area에 로딩 된 .class들은 Execution Engine을 통해 해석
- 해석된 바이트 코드는 Runtiome Data Area의 각 영역에 배치되어 수행하며 이 과정에서 Execution Engine에 의해 GC의 작동과 스레드 동기화가 이루어짐
- 클래스 로더(Class Loader) : 자바는 동적으로 클래스를 읽어오므로, 프로그램이 실행 중인 런타임에서야 모든 코드가 자바 가상 머신과 연결된다. 이렇게 동적으로 클래스를 로딩해주는 역할을 하는 것이 클래스 로더
- 실행 엔진(Execution Engine) : 로드된 바이트코드를 실행하는 런타임 모듈이 실행 엔진(Execution Engine)
- 가비지 컬렉터(Garbage Collector) : 더 이상 사용하지 않는 메모리를 자동으로 회수 Heap 메모리 영역에 생성된 객체들 중에 참조되지 않은 객체들을 탐색 후 제거
Java 8 특징 vs java 11과의 차이점
