JVM(Java Virtual Machine)
- OS에 종속받지 않고 CPU 가 Java를 인식, 실행할 수 있게 하는 가상 컴퓨터
- JVM이 인식할 수 있는 bytecode로 컴파일하는 과정 필요
- 원시코드(*.java) -> Java bytecode(*.class) -> JVM -> 기계어(Binary Code)
구성
- 클래스 로더(Class Loader)
- 실행 엔진(Execution Engine)
- 인터프리터(Interpreter)
- JIT 컴파일러(Just-in-Time)
- 가비지 콜렉터(Garbage collector)
- 런타임 데이터 영역 (Runtime Data Area)
클래스 로더(Class Loader)
- JVM 내로 클래스 파일(*.class)을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈
- 런타임시 동적으로 클래스를 로드하고 jar 파일 내 저장된 클래스들을 JVM 위에 탑재
- 클래스를 처음으로 참조할 때, 해당 클래스를 로드하고 링크하는 역할
- 세 가지로 구분
- 부트스트랩 클래스 로더, 플랫폼 클래스 로더, 시스템 클래스 로더
- 계층 구조를 가지고 있음
- 시스템 클래스 로더는 플랫폼 클래스 로더를 부모로 가지고
플랫폼 클래스 로더는 부트스트랩 클래스 로더를 부모로 가짐
- 시스템 클래스 로더는 플랫폼 클래스 로더를 부모로 가지고
실행 엔진( Execution Engine )
- 클래스를 실행시키는 역할
- 클래스 로더가 JVM내의 런타임 데이터 영역에 바이트 코드를 배치시키고, 이것은 실행 엔진에 의해 실행
- 바이트 코드를 실제로 JVM 내부에서 기계가 실행할 수 있는 형태로 변경
인터프리터( Interpreter )
- 바이트코드 명령어를 하나씩 읽어서 해석하고 실행
- 단점: 바이트코드 하나하나의 해석은 빠른 대신 인터프리팅 결과의 실행은 느림
JIT(Just-In-Time) 컴파일러
- 인터프리터의 단점을 보완하기 위해 도입
- 인터프리터 방식으로 실행하다가 적절한 시점에 바이트코드 전체를 컴파일하여 네이티브 코드로 변경하고, 이후에는 해당 메서드를 더 이상 인터프리팅하지 않고 네이티브 코드로 직접 실행하는 방식
- 장점: 인터프리터 방식보다 빠르고, 네이티브 코드는 캐시에 보관하기 때문에 한 번 컴파일된 코드는 계속 빠르게 수행가능
가비지 콜렉터(Garbage collector)
- 더이상 사용되지 않는 인스턴스를 찾아 메모리에서 삭제
런타임 데이터 영역 (Runtime Data Area)
- 프로그램을 수행하기 위해 OS에서 할당받은 메모리 공간
PC Register
- Thread가 시작될 때 생성되며 생성될 때마다 생성되는 공간으로, 스레드마다 하나씩 존재
- Thread가 어떤 부분을 어떤 명령으로 실행해야할 지에 대한 기록을 하는 부분으로 현재 수행 중인 JVM 명령의 주소를 가짐
Stack
- 프로그램 실행과정에서 임시로 할당되었다가 메소드를 빠져나가면 바로 소멸되는 특성의 데이터를 저장하기 위한 영역
Native Method Stack
- 자바 프로그램이 컴파일되어 생성되는 바이트 코드가 아닌 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역
Method Area (= Class Area = Static area)
- 클래스 정보를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간
Heap
- 객체를 저장하는 가상메모리 공간. new 연산자로 생성되는 객체와 배열을 저장
'Java > Java' 카테고리의 다른 글
[Java(자바)] 오버라이딩과 오버로딩 (0) | 2024.05.22 |
---|---|
[Java(자바)] Stream(스트림) (0) | 2024.05.21 |
[Java(자바)] Java 21 - Virtual thread (0) | 2024.05.12 |
[Java(자바)] 자바의 Thread(쓰레드) (0) | 2024.05.12 |
[Java(자바)] 메모리 관리와 가비지 컬렉션 (0) | 2024.05.12 |