
JVM 메모리구조
- 모든 자바 프로그램은 자바 가상 머신(JVM)을 통해 실행된다.
- JVM은 운영 체제로부터 해당 프로그램을 수행할 수 있도록 필요한 메모리를 할당받는다.
- JVM은 자바 바이트 코드를 실행할 수 있는 환경을 제공해준다.

- Class Loader (클래스로더)
- 런타임 시에 클래스를 동적으로 JVM 내로 클래스 파일을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈
- Execution Engine (실행 엔진)
- 메모리(runtime data area)에 할당된 byte code를 실행하는 역할
- byte code를 한 줄마다 읽으며 변환 작업
- Interpreter (인터프리터)
- byte code 명령어를 하나씩 읽어 해석하고 실행하는 역할
- 하나하나 실행은 빠르나 전체적인 실행 속도는 느리다.
- JIT Compiler
- 자바 컴파일러가 생성한 byte code를 런타임에 바로 기계어로 변환하는데 사용
- Garbage Collector (가비지 컬렉터)
- Heap 영역에 생성된 객체들 중 참조되지 않은 객체들을 탐색해 자동적으로 정리해주는 역할
- Runtime Data Area
- JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역

1) PC Register
- 스레드가 시작될 때 생성되며 생성될 때마다 생성되는 공간으로 스레드마다 하나씩 존재한다.
- 스레드 : 프로세스 안에서 실행되는 단위
- 프로세스 : 실행 중인 프로그램
2) Stack Area
- 메소드의 매개변수, 지역변수, return 주소, 임시변수 등의 정보를 기로하는 영역
- 메소드 호출이 종료되면 스택에서 정보들이 제거된다.
- 각 스레드 별로 생성되기 때문에 다른 스레드는 접근할 수 없다.
3) Native Method Stack
- 자바 외의 언어로 작성된 네이티브 코드들을 위한 영역
4) Method Area
- 모든 스레드가 공유하는 메모리 영역으로 클래스, 인터페이스, 메서드, 필드, Static 변수 등의 바이트 코드를 보관하는 영역
5) Heap Area
- 모든 스레드가 공유하며 new 키워드로 생성된 객체와 배열이 생성되는 영역
- Garbage Collector가 참조되지 않는 메모리를 확인하고 제거하는 영역
JAVA 컴파일 과정

- 개발자가 자바 소스 코드(.java)를 작성한다.
- 자바 컴파일러가 자바 소스코드(.java)파일을 읽어 바이트 코드(.class)로 컴파일한다.
- 컴파일된 바이트 코드(.class)를 JVM의 클래스로더에게 전달한다.
- 클래스로더는 동적 로딩을 통해 필요한 클래스들을 로딩 및 링크하여 런타임 데이터 영역 즉, JVM의 메모리에 올린다.
- 실행 엔진은 JVM 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와 실행한다. 이 때 실행 엔진은 두가지 방식으로 변경한다.
--> 인터프리터
--> JIT 컴파일러