JVM

- JDK(Java Development Kit)
- 자바 프로그램 실행을 위한 JRE와 자바 개발 시 필요한 라이브러리들이 포함되어 있다.
- 대표적으로 Oracle JDK(유료), Open JDK(무료)가 있다.
- Java Development Tools
- javac : 자바 컴파일러(소스코드 → 바이트코드)
- java : 자바 인터프리터(바이트코드를 해석하여 실행)
- javadoc : API document 생성
- jar : jar 압축 파일을 생성하는 프로그램
- 등의 여러 프로그램을 포함한다.
- JRE(Java Runtime Environment)
- JVM과 자바 프로그램을 실행시킬때 필요한 라이브러리로 구성되어 있다.
- 자바 프로그램을 실행시키려면 JRE가 필요하다.
- JVM(Java Virtual Machine)
- 자바를 돌리는 프로그램이다. 모든 자바 프로그램은 JVM에서만 실행될 수 있다.
- JVM을 사용하면, 자바 프로그램을 모든 플랫폼에서 제약 없이 동작하도록 할 수 있다.
- JVM 덕분에, Java는 OS에 종속적이지 않다.
- JVM은 컴파일된 코드와 OS 중간에서, 컴파일 코드를 해당 OS 환경에 맞게 변환해준다.
- 자바 컴파일러가 자바 소스코드를 바이트 코드로 컴파일한다.
- JVM이 바이트 코드를 기계어(바이너리)로 변환한다.
- 컴파일된 기계어는 바로 CPU에서 실행되어 사용자에게 서비스를 제공한다.
JVM 내부 구조

- 클래스 로더(Class Loader)
- 클래스파일을 JVM 내로 로드하고, 링크를 통해
Runtime Data Area
에 배치시키는 작업을 한다. - Loading : 클래스 파일을 가져와 JVM 메모리에 로드한다.
- Linking : 클래스 파일을 사용하기 위해 검증한다.
- Initialization : 클래스 변수들을 적절한 값으로 초기화한다.
- 실행 엔진(Execution Engine)
- 런타임 영역에 배치된 바이트 코드를 명령어 단위로 읽어 실행한다.
인터프리터
,JIT 컴파일러
두 방식을 혼합하여 바이트 코드를 실행한다.인터프리터
- 바이트 코드를 하나씩 읽어 해석하고 실행한다.
JIT 컴파일러
- 바이트 코드를 컴파일하여 네이티브 코드(C/C++, 어셈블리)로 변경 후 네이티브 코드로 직접 실행한다.
가비지 컬랙터
- 런타임 데이터 영역(Runtime Data Area)
- JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터를 적재하는 영역이다.
- 메소드, 힙 영역은 모든 쓰레드가 공유하고, 나머지 PC 레지스터, 스택, 네이티브 메서드는 각 쓰레드마다 개별 생성된다.
메소드 영역
- 바이트코드를 메모리에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간
- 정적 필드, 클래스 구조
힙 영역
- 런타임 시 동적으로 할당하여 사용하는 영역
new
로 생성된 클래스나 변수, 래퍼런스 타입 등- 더 이상 사용되지 않으면 GC 대상이 된다.
스택 영역
- 기본 자료형을 생성할 때 저장하는 공간
- 임시적인 변수나 정보 등
PC Register
- 현재 수행중인 JVM 명령어 주소를 저장하는 공간
네이티브 메서드
- 자바 코드를 컴파일하여 생성한 바이트 코드가 아닌, 기계어로 작성된 프로그램을 실행시키는 영역
- 자바 이외의 네이티브 코드(C/C++, 어셈블리)를 실행시키는 공간
Share article