JVM이란?

이규은·2021년 9월 9일
1

JVM이란 JAVA Virtual Machine(자바 버츄얼 머신)의 줄임말로 Java와 OS사이에 존재하는 가상머신이다. JVM은 자바 애플리케이션을 클래스 로더를 통해 읽어 들여서 자바 API와 함께 실행하는 역활을 한다. 또한 JVM은 메모리 관리에도 관여한다. 가비지 컬랙션을 이용해 메모리를 관리한다.

JVM의 특징

1. 스택기반의 가상머신

대표적인 아키텍처인 인텔x56과 ARM은 레지스터 기반으로 동작하지만 JVM은 스택 기반으로 동작한다.

2. 가비지 컬렉션

기본 자료형을 제외한 모든 타입을 명시적인 메모리 주소 기반의 레퍼런스가 아닌 심볼릭 레퍼런스를 통해 참조한다.

3. 기본 자료형을 명확하게 정의하여 플랫폼 독립성 보장

C/C++는 플랫폼에 따라 int형의 크기가 변하지만 JVM은 기본 자료형을 명확하게 정의하여 호환성을 유지하고 플랫폼 독립성을 보장한다.

4. 네트워크 바이트 오더

클래스 파일은 네트워크 바이트 오더를 사용한다. 리틀 엔디안이나 빅 엔디안 사이에서 플랫폼 독립성을 유지하려면 고정된 바이트 오더를 유지해야 하므로 네트워크 바이트 오더를 사용한다.

JVM의 구조


클래스 로더가 컴파일된 자바 바이트코드를 런타임 데이터 영역에 로드하고 실행 엔진이 자바 바이트 코드를 실행한다.

클래스 로더

자바는 컴파일 타임이 아니라 런타임에 클래스를 처음으로 참조할 때 해당 클래스를 로드하고 링크하는 특징이 있다. 이 동적 로드를 담당하는 부분이 JVM의 클래스 로더이다.

런타임 데이터 영역

런타임 데이터 영역은 JVM이 OS위에 실행되면서 할당받는 메모리 영역이다. 런타임 데이터 영역은 6개의 영역으로 나눌 수 있다.
PC레지스터, JVM스택, 네이티브 메서드 스택은 스레드마다 하나씩 생성된다.
힙, 메서드 영역, 런타임 상수 풀은 모든 스레드가 공유해서 사용한다.

실행 엔진

클래스 로더를 통해 JVM내의 런타임 데이터 영역에 배치된 바이트코드는 실행 엔진에 의해 실행된다. 실행 엔진은 자바 바이트 코드를 명령어 단위로 읽어서 실행한다.
바이트코드의 각 명령어는 1바이트짜리 OpCode와 추가 피연산자로 이루어져 있으며, 실행 엔진은 하나의 OpCode를 가져와서 피연산자와 함께 작업을 수행한다.

profile
안녕하세요

0개의 댓글