자바 가상 머신(JVM) 개념?

SEUNGJUN·2024년 2월 7일
post-thumbnail

JVM은 Java언어로 작성된 프로글매이 실행되는 환경을 제공하는 가상 머신이다. 플랫폼 독립적인 특성을 제공하며, 메모리 관리와 가비지 컬렉션을 담당한다.

JVM 구조


출처 나무위키

1. 클래스 로더 (Class Loader)

  • 클래스를 로딩하고 메모리에 적재하는 역할
    로딩: 클래스 파일(바이트 코드)을 찾아 읽어 들인다.

2. Runtime Data Area

  • 런타임 시 클래스 데이터와 같은 메타 데이터와 실제 데이터가 저장되는 공간(JAVA 메모리 공간)

3. Execution Engine

  • Java 프로그램의 바이트코드를 읽어서 기계어로 변환 실행함.
  • 인터프리터, JIT컴파일러

가비지 컬렉터(GC) : 프로그램에서 더 이상 참조되지 않는 메모리를 자동으로 식별하고 해제하는 역할을 하는 프로그램의 일부.

JVM의 역할

1. 플랫폼 독립성

  • Java는 한 번 작성하고 어디서든 실행하라라는 철학을 가지고 있다.
  • Java 언어는 JVM 위에서 동작하며, JVM은 중간 언어인 바이트코드(Java bytecode)를 실행한다.
  • JAVA 프로그램은 특정 플랫폼에 종속되지 않고 어디서든 실행이 가능하다.

예시로 Windows에서 개발된 JAVA 프로그램은 동일한 바이트 코드를 사용하여 macOS나 Linux에서 실행될수 있고, x86 아키텍처에서 개발안 애플리케이션은 ARM 아키텍처에서도 동작을 한다.

바이트 코드란 원래 프로그래밍을 할때 소스를 만들고 그 소스가 기계어로 변환되어 우리들의 OS에 맞게 실행이 되는데, JAVA에서는 Java 컴파일러가 소스 코드를 중간 언어인 바이트코드로 변환하고, JVM에서 바이트코드를 읽어서 그 코드를 다시 우리가 사용하는 어떤 OS(mac, window, linux)등의 기계어로 변환을 해준다.

Java 컴파일러 : Java 소스를 바이트 코드로 변환하고, 소스코드를 한 번만 컴파일 하고, 그 결과물인 바이트코드는 다양한 플랫폼에서 실행될 수 있다.
컴파일이 되면 .class 확장자를 가진 바이너리 형식의 파일로 저장되고, 만약 소스 코드를 수정하게 되면 재생성이 된다.

JIT(Just-In-Time) 컴파일러 : JVM에서 JIT컴파일러를 사용해서 바이트코드를 기계어로 변환해준다. 인터프리터 방식의 단점을 보안하기 위해 도입되었다.

인터프리터 방식 : 소스 코드를 한줄이 분석해서 기계어로 번역해주는 방식.

2. 메모리 영역

프로그램이 실행되는 동안 메모리를 여러 영역으로 나누어 관리한다.

1. 메서드 영역(Method Area)

  • 메서드 영역은 JVM이 클래스와 메서드의 정보를 저장하는 공간이다.

2. 힙(Heap)

  • 동적으로 생성된 객체와 배열이 저장되는 영역.
  • 프로그램 실행 중에 생성되는 인스턴스, 배열 등의 데이터가 할당되고 가비지 컬렉터에 의해 관리된다.

3. 스택(Stack)

  • 스택은 각 스레드마다 별도로 생성되고, 메서드 호출과 관련되 정보를 저장함.
  • 각 메서드 호출 시 지역 변수, 매개변수, 메서드 호출 및 복귀 주소 등이 스택 프레임(Stack Frame)에 저장된다.

4. PC 레지스터(Program Counter Register)

  • PC 레지스터는 현재 수행 중인 JVM 명령어의 주소를 가르킨다.
  • 각 스레드마다 별도로 존재하며, 스레드가 다른 명령어로 이동하거나, 메서드 호출 또는 복귀 시에 사용된다.

5. 네이티브 메서드 스택(Native Method Stack)

  • 네이티브 메서드는 Java 언어가 아닌 다른 언어(C, C++, ..)로 작성된 메서드를 말한다.
  • 네이티브 메서드 스택은 이러한 네이티브 메서드의 호출 정보를 저장하는 영역.

프로세스 : 운영 체제로 부터 할당받은 자원과 메모리 공간을 갖고 독립적으로 실행되는 프로그램단위. Ex) 계산기 프로세스
스레드 : 프로세스 내에서 실행되는 경량의 실행 단위. Ex) 더하기, 빼기, 나누기

profile
RECORD DEVELOPER

0개의 댓글