
1.소스코드에서 컴파일러가 컴파일해 바이너리 파일로만든다.(확장자 .class)
2.이 바이너리 파일을 JVM이 해석해 각 os에 호환가능하게 만들어 준다.

Class Loader:JVM으로 들어오는 Java 클래스 파일을 로드한다.
Execution Engine: 로드된 바이트코드를 실제 기계어로 변환하고 실행하는 역할
Garbage Collector:더 이상 사용되지 않는 객체를 자동으로 메모리에서 해제하여 메모리 관리
JNI - Java Native Interface : Java 코드가 C, C++ 등의 네이티브 코드를 호출할 수 있도록 인터페이스를 제공
Runtime Data Area : Java 애플리케이션이 실행되는 동안 필요한 데이터와 구조를 저장하는 메모리 영역입니다. 이 영역은 여러 세부 영역으로 나뉩니다.
Method Area: 클래스 메타데이터, 상수, 정적 변수, 메소드 코드 등이 저장됩니다.
Heap: 객체와 배열이 저장되는 공간입니다.
Stack: 각 스레드마다 생성되며, 스레드 실행 시 메소드 호출 정보를 저장합니다.
PC Register: 각 스레드마다 생성되며, 현재 실행 중인 명령의 주소를 저장합니다.
Native Method Stack: 네이티브 메소드 호출 시 사용됩니다.


이건 메모리 여역 메소드, 힙, 스택 영역을 생각해보면 쉽다.
우선 main에서 실행될 때 정적인 요소들이 method area에 읽혀진다. 그 다음에 코드상 객체생성이나 메서드 호출이 있을 때 동적요소들이 생성된다.
즉 자바프로그램은 기본적으로 정적인 요소들로 시작하고, 프로그램 실행 중에 동적인 요소들이 발생한다.