자바 프로그램의 실행 단계

- 자바 소스 파일 작성: 개발자는 자바 소스 파일(.java)을 작성합니다.
- 컴파일: 자바 컴파일러는 자바 소스 파일을 바이트 코드 형태의 클래스 파일(.class)로 변환합니다.
- 클래스 로딩: 클래스 로더는 클래스 파일을 읽어들여 JVM 메모리에 로드합니다.
- JVM 수행: 클래스 파일이 로드된 후, JVM은 이를 실행합니다.
JVM 구조
JVM은 크게 다음 네 가지로 구성됩니다.
-
Class Loader: JVM에서 클래스를 처음 참조할 때 해당 클래스를 동적으로 로드하여 메모리에 배치하는 역할을 합니다.
-
Runtime Data Area: JVM의 메모리 영역으로, 자바 프로그램 실행 중에 필요한 메모리를 제공합니다.
-
Execution Engine: Class Loader를 통해 JVM 내의 Runtime Data Area에 배치된 바이트 코드들을 명렁어 단위로 읽어서 실행합니다.
-
Garbage Collector: 힙 메모리 영역에 생성된 객체들 중에서 사용되지 않는 메모리를 지속적으로 찾아내어 제거합니다.
JVM 메모리 영역 (Runtime Data Areas)

1. PC 레지스터 (PC Register)
- 각 스레드가 실행 중인 JVM 명령의 주소를 저장하는 영역입니다.
- 스레드가 시작될 때 생성되며, 각 스레드마다 하나씩 존재합니다.
- 현재 실행 중인 명령의 주소를 기록하여 스레드가 어떤 명령을 실행해야 하는지 추적합니다.
2. 스택 영역 (Stack Area)
- 메서드 호출 시마다 생성되는 스택 프레임을 저장하는 영역입니다.
- 각 스택 프레임은 메서드의 지역 변수, 매개 변수, 리턴 값, 연산에 사용되는 임시 데이터 등을 저장합니다.
- 메서드 호출이 완료되면 해당 스택 프레임은 제거됩니다. 스택 영역은 각 스레드마다 별도로 생성됩니다.
3. 네이티브 메서드 스택 (Native Method Stack)
- 자바 외 언어(C, C++ 등)로 작성된 네이티브 코드를 실행하기 위한 메모리 영역입니다.
- 이 영역은 네이티브 메서드 호출 시 사용되며, 일반적으로 C 스택을 사용합니다.
- JNI(Java Native Interface)를 통해 자바 코드와 상호 작용할 수 있습니다.
4. 힙 영역 (Heap Area)
- 런타임에 동적으로 할당되는 객체와 배열을 저장하는 메모리 영역입니다.
- 모든 스레드가 공유하며, new 키워드로 생성된 객체와 배열이 여기에 저장됩니다.
- 가비지 컬렉터가 관리하는 영역이며, 더 이상 사용되지 않는 객체들을 자동으로 제거해 메모리 누수를 방지합니다.
5. 메서드 영역 (Method Area)
- JVM이 시작될 때 생성되며, 모든 스레드가 공유하는 메모리 영역입니다.
- JVM이 읽은 클래스와 인터페이스에 대한 런타임 상수 풀, 필드 및 메서드 코드, static 변수, 메서드의 바이트 코드를 보관합니다.
- 클래스 로더가 클래스를 로드할 때 이 영역에 배치됩니다.
ref.
https://adjh54.tistory.com/280
https://steady-coding.tistory.com/305
https://coding-factory.tistory.com/828#google_vignette