Java Virtual Machine의 줄임말인 JVM은 OS의 종속받지 않고 CPU가 JAVA를 인식, 실행할 수 이게 하는 가상 컴퓨터
따라서 JAVA 언어는 JVM에 의해 "운영체제에 독립적" 이라는 장점을 가진다.
Java 프로그램을 OS 대신 실행을 담당하는 역할 수행

위의 동작 처럼 java 소드 코드(원시코드)는 cpu가 인식하지 못하므로 기계어로 컴파일 하는 과정이 필요하다.
하지만, java는 이 jvm 이라는 가상 머신을 거쳐서 OS에 도달하기 때문에 OS가 인식할 수 있는 기계어로 바로 컴파일 되는게 아니라 JVM이 인식할 수 있는 바이트코드로 변환된다.
변환된 바이트코드는 기계어가 아니기 때문에 OS가 해석할 수 없다. 따라서 JVM을 통해 바이트코드를 OS가 해석할 수 있는 기계어로 변환한다.
java 언어로 작성한 소스파일은 바로 운영체제로 가는것이 아닌, JVM을 거쳐서 운영체제와 상호작용을 하는데, 이 때문에 개발자가 소스코드를 작성하는 것에 있어서 운영체제로부터 독립적일 수 있게 되는것

클래스 로더 + 실행 엔진(인터프리터, JIT 컴파일러, 가비지 콜렉터) + 런타임 데이터 영역
JVM 내로 클래스 파일(바이트코드)을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈
런 타임시 동적으로 클래스를 로드하고 jar 파일 내 저장된 클래스들을 JVM 위에 탑재한다.
즉, 클래스를 처음으로 참조할 때, 해당 클래스를 로드하고 링크하는 역할
클래스를 실행 시키는 역할
클래스 로더가 JVM 내의 런타임 데이터 영역에 바이트 코드를 배치시키면, 실행 엔진에 의해 실행 할 수 있다.
자바 바이트코드(.class)는 기계가 바로 수행할 수 잇는 언어가 아니기 때문에, 실행 엔진이 바이트 코드를 기계가 실행할 수 있는 언어로 변경한다.
JAVA 프로그램이 실행되는 동안 데이터를 저장하고 관리하는 메모리 영역
1. 메서드 영역: 클래스 정보와 관련된 데이터 저장
2. 힙 영역: Java 객체 및 배열이 동적으로 할당되는 메모리 공간
3. 스택 영역: 각 스레드에 대한 메서드 호출과 지역 변수를 저장하는 공간
4. 카운터 영역: java가 아닌 네이티브 메서드를 실행할 때 사용되는 공간
서로 다른 역할을 가지며 자바 애플리케이션 개발과 실행에 필요한 요소들
JDK는 자바 애플리케이션을 개발하기 위해 필요한 도구들의 모음. 이 도구들은 자바 개발자가 자바 코드를 작성하고 컴파일하여 실행 가능한 바이트 코드로 변환하는 데 사용된다.
JRE는 자바 애플리케이션을 실행하기 위해 필요한 최소한의 실행환경 제공
JRE에는 JVM과 Java 라이브러리들이 포함되어 있다.
JVM은 자바 바이트 코드를 실행하는 가상 머신. 바이트 코드는 자바 컴파일러에 의해 생성되어 JVM위에서 동작하여, OS에 독립적이라는 장점을 가짐