1. JVM 구조
1.1. 클래스 로더 (Class Loader)
- JVM 내로 클래스파일 (.class) 을 동적으로 로드
- 링크를 통해 메모리에 바이트코드를 배치
• 메모리에 로딩할 때, 모든 코드를 한번에 올리는 것이 아니라 어플리케이션에서 필요한 경우 동적으로 로딩
1.2. 실행 엔진 (Execution Engine)
- 메모리에 로딩된 바이트 코드를 기계어(Binary Code)로 변경하여 명령어 단위로 실행
- 인터프리터(Interpreter)와 JIT(Just-In-Time) 컴파일러 두 가지 방식을 혼합하여 사용
• Interpreter : 명령어를 하나씩 실행
• JIT : 바이트 코드 전체를 컴파일하여 Native Code로 변경하여 캐싱해 두었다가 실행
- GC (Garbage Collector)
• Heap 메모리 영역에서 더 이상 사용하지 않는(참조되지 않는) 메모리를 자동 회수
1.3. 런타임 데이터 영역 (Runtime Data Area)
- JVM의 메모리 영역
- 자바 어플리케이션을 실행할 때 사용되는 데이터를 적재하는 영역
- 아래 2. 에서 메모리 영역에 대해 자세히 다뤄볼 것이다!
2. JVM 메모리 영역
JVM 런타임 데이터 영역
2.0. 메인 클래스 동작과 static / none-static 멤버
1. JVM이 실행할 클래스를 찾는다
2. static 키워드가 붙은 멤버들을 Method Area에 로딩
- static 멤버는 클래스 생성 시점에 메모리에 자동으로 로딩된다
- none-static 멤버는 객체를 생성하여 메모리에 로딩한 후, 사용해야 한다
- main 메서드는 static으로 선언하기 때문에 클래스 실행 시점에 메모리에 자동 로딩
3. JVM이 Method Area의 static zone에서 main 메서드를 호출
4. 호출된 메서드를 Stack Area에 push한 뒤 동작 시작
2.1. Method Area
- 메서드의 바이트코드가 할당되는 공간 (클래스, 인터페이스 메소드, 필드, static 변수 등)
- static-zone / none-static-zone 으로 나뉜다
- Runtime Constant Pool (Literal Pool) : 상수 값이 할당되는 메모리 공간
2.2. Heap Area
- 객체와 배열이 생성되는 메모리 영역 (new 연산자)
- GC(Garbage Collector)에 의해 메모리가 수집된다
2.3. Stack Area
- 메서드에서 사용되는 값 + 지역변수, 매개변수 등 임시 데이터 저장
- 메서드 호출 시 마다 스택 프레임 생성
- LIFO 구조
2.4. PC Register
- 현재 쓰레드가 실행되는 부분의 주소와 명령 저장
- 쓰레드마다 하나씩 존재하는 영역
- PC(Program Counter) : 현재 실행 중인 프로그램의 주소를 가리킨다
2.5. Native Method Area
- Java 외 언어로 작성된 Native 코드를 위한 메모리
📌 References
- https://steady-coding.tistory.com/305
'Programming > Java' 카테고리의 다른 글
[Java] Model : DTO / VO / DAO / Utility (0) | 2024.01.31 |
---|---|
[Java] Reflection API 알아보기 (0) | 2024.01.10 |
[Java] 자바 실행 환경 JDK / JRE / JVM (0) | 2024.01.03 |
[Java] 자바 플랫폼 종류 (Java SE / EE / ME) (0) | 2024.01.02 |
[Java] 자바 버전 확인 및 설치하기(버전 낮추기 Java 15 -> Java 11) / 환경 변수 설정 (1) | 2021.08.13 |