EFUB 퍼비톡 자료로, 모든 사진의 출처는 EFUB 퍼비톡 입니다.
문제) 호스트 머신과 타켓 머신의 플랫폼이 다른 경우, 프로그램 실행이 불가능
해결) 자바 바이트코드는 JVM 위에서 동작한다. ➡️ JVM만 있다면 어디서든 실행할 수 있다.
Java virtual machine (JVM) 은 자바 프로그램, 그리고 자바 바이트코드로 컴파일된 프로그램을 실행할 수 있게 하는 가상 머신이다.

JDK : 자바 프로그램 개발을 위한 도구를 포함하고 있는 구성요소. 자바 프로그램을 JRE, JVM에서 실행 가능하도록 변환해주는 역할
JRE: 코드를 실행하기 위한 JVM, JVM에 필요한 클래스 라이브러리와 여러 파일이 포함되어 있는 구성요소
JVM: 코드 실행을 위한 런타임 환경을 제공하는 구성요소. 바이트코드를 플랫폼에 맞는 기계어로 번역하고 실행
JVM 내부 구조
1. Class Loader Subsystem
2. Runtime Data Areas
3. Execution Engine
동적 로딩을 통해 필요한 클래스들을 로딩, 링크, 초기화하여 메모리(Runtime Data Area)에 올린다.
1. Loading
• 클래스 로더가 .class 파일을 읽고 메모리에 로드하는 단계
• 이때 시점은 컴파일 타임이 아닌 런타임에 처음으로 해당 클래스를 참조하는 시점

Method Area
• 로딩한 바이트코드(.class)를 저장하기 위한 공간
• Class-level 데이터를 저장
(ex: 클래스의 구조, 정적 필드)
Heap Area
• 객체를 저장하기 위한 공간
• 인스턴스 변수, 배열 등 Reference Type을 저장
• 가비지 콜렉터의 대상
Stack Area
• 메소드 호출에 필요한 데이터를 저장하기 위한 공간
• 메소드를 호출할 때마다 새 Stack Frame을 생성하고, 호출이 완료되면 삭제
PC Registers
• 현재 실행 중인 명령어 주소를 가리키는 레지스터
Native Method Stack
• 네이티브 코드 실행을 위한 스택
• 기계어로 컴파일된 코드, C/C++로 작성된 코드 등
실행할 때 사용
Interpreter
바이트코드 명령어를 하나씩 읽고 실행
JIT Compiler
바이트코드 전체를 네이티브 코드로 컴파일하여 캐싱해 두었다가 실행
Garbage Collection (Garbage Collector)
JVM의 Heap area에서 더 이상 참조되지 않는 객체를 제거