Java
JVM(Java Virtual Machine)의 구조
딱구킴
2022. 10. 20. 15:17
이번 글에서는 JVM의 구조에 대해 다뤄보도록 하겠습니다.
JVM은 Java가 Write Once, Run Anywhere를 지킬 수 있도록 도와주는 가상 머신이며, OS에 대해 독립적으로 Java 애플리케이션을 실행할 수 있도록 도와주는 중요한 역할을 합니다.
클래스 로더
- .class 파일을 JVM에 로딩 (바이트 코드를 읽어 메모리에 저장)
- 크게 다섯 가지 과정을 거칩니다.
- 로딩 : .class 파일을 JVM 메모리에 로드
- 검증 : 자바 언어 명세 or JVM 명세에 명시된 대로 구성되었는지를 검증
- 준비 : 클래스가 필요로 하는 메모리를 준비하여 할당(필드, 메서드, 인터페이스...)
- 링크 : 클래스의 상수 pool 안의 모든 Symbolic reference를 분석하여 direct reference로 연결
- 초기화 : 클래스 변수들을 적절한 값으로 초기화
- Symbolic reference? Direct reference?
메모리
- JVM의 메모리에는 총 다섯가지의 메모리 영역이 있습니다. 크게 공유되지 않는 자원과 공유 자원으로 구분됩니다.
- 공유되지 않는 자원 (Managed per-thread)
- 스택 영역
- 쓰레드 마다 런 타임 스택을 만들고, 그 안에 메소드 호출을 스택 프레임이라고 부르는 블럭으로 쌓습니다.
- 쓰레드를 종료하면 런타임 스택도 사라집니다.
- 예외가 터지면 Stack Trace로 스택이 무엇이 실행되었는지 확인할 수 있습니다.
- 일반적인 메서드나 기본형 타입 변수가 해당 영역에 할당됩니다.
- StackOverFlowError, OutOfMemoryError가 발생되는 영역입니다.
- PC 레지스터(Program counter) 영역
- 새 쓰레드가 생성될 때마다 PC 레지스터가 생성됩니다.
- 쓰레드 마다 쓰레드 내 현재 실행할 스택 프레임을 가리키는 포인터가 생성됩니다.
- 네이티브 메서드 영역
- 네이티브 메서드에 사용됩니다.
- 실제 실행 가능한, 기계어로 작성된 프로그램을 실행시킵니다.
- 쓰레드 별로 생성됩니다.
- 스택 영역
- 공유 자원 (Shared with all threads)
- 힙 영역
- JVM 시작 시 할당됩니다.
- Object를 할당하는 영역입니다. (new 연산자로 생성된 것)
- 힙 메모리는 공유 자원이기 때문에, 여러 쓰레드에서 공유됩니다.
- 해당 영역에 Garbage Collection이 수행됩니다.
- 런타임에 할당된 메모리가 충분하지 않을 경우, OutOfMemoryError가 발생됩니다.
- 메서드 영역
- 클래스와 static 필드가 할당되는 영역입니다.
- JVM 시작 시 할당됩니다.
- 공유 자원이기 때문에, 여러 쓰레드에서 공유됩니다.
- 런타임에 할당된 메모리가 충분하지 않을 경우, OutOfMemoryError가 발생됩니다.
- 힙 영역
실행 엔진(Execution Engine)
- 실행 엔진에는 크게 2 가지의 엔진이 있습니다.
- 인터프리터
- 바이트 코드를 한 줄씩 실행합니다.
- 한 줄씩 이해하고 실행하고를 반복합니다.
- JIT 컴파일러
- Just-In-Time 컴파일러
- 인터프리터의 효율을 높이기 위해 만들어졌습니다.
- 인터프리터가 반복되는 코드를 발견할 경우, JIT 컴파일러로 반복되는 코드를 모두 네이티브 코드로 바꿉니다.
- 인터프리터가 네이티브 코드로 컴파일된 코드를 바로 사용합니다
- GC(Garbage Collector)
- 더이상 참조되지 않는 객체를 모아서 정리합니다.
- Heap 영역에서 Garbage Collection을 수행합니다.
- 인터프리터
JNI(Java Native Interface)
- 자바 애플리케이션에서 C, C++, 어셈블리로 작성된 네이티브 함수를 사용할 수 있는 방법을 제공합니다.
- Native 키워드를 사용한 메서드를 호출합니다.
네이티브 메서드 라이브러리
- C, C++로 작성된 라이브러리를 의미합니다.
참고
https://javapapers.com/core-java/java-jvm-run-time-data-areas/#Program_Counter_PC_Register
https://www.inflearn.com/course/the-java-code-manipulation/dashboard