[JAVA] JVM

This is JAVA :)

JVM이란?

JVM(Java Virtual Machine, 자바 가상 머신)은 자바 바이트 코드를 실행할 수 있는 주체이다.

JVM의 역할

  • Java와 OS를 연결하며, Java가 OS에 독립적으로 실행되도록 한다.
    (대신 JVM이 운영체제에 종속적이다)
  • Java 애플리케이션을 Class Loader를 통해 읽어들여 Java API와 함께 실행
  • 메모리 관리(Garbage Collection)을 수행

JVM 실행과정

  1. 프로그램이 실행되면 OS에서 JVM에 메모리를 할당한다.
    JVM은 할당받은 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.
  2. 자바 컴파일러(javac)가 자바 소스(.java)를 읽어 자바 바이트코드(.class)로 변환시킨다.
  3. 자바 바이트코드를 Class Loader를 통해 JVM 메모리 영역(Runtime Data Areas)으로 로딩한다.
  4. 자바 바이트코드는 Execution engine을 통해 해석된다.
  5. 해석된 바이트코드는 Runtime Data Areas에 배치되어 실질적인 수행이 이루어진다.
    이러한 과정에서 JVM은 필요에 따라 Thread Synchronization과 GC같은 관리 작업을 수행한다.

JVM 내부 모듈

1. Class Loader

  • JVM내로 클래스를 Load해서 Runtime Data Areas에 배치
  • 동적으로 클래스를 로드(컴파일 타임이 아닌 런타임에 클래스를 참조할 때 해당 클래스를 로드)

2. Runtime Data Areas

  • JVM이라는 프로그램이 OS에서 실행되면서 할당받는 메모리 영역
  • PC Register, JVM Stack, Native Method Stack은 스레드마다 생성, Heap, Method Area는 모든 스레드가 공유

  • PC Register
    • 레지스터는 스레드마다 생성
    • 스레드가 어떤 명령어로 실행되어야 할지를 기록하는 부분으로 현재 수행중인 JVM 명령의 주소를 갖는다.
  • Stack Area
    • 스택은 스레드마다 생성
    • 지역변수, 매개변수, 메소드 정보, 연산 중 발생하는 임시 데이터 등을 저장
    • 메서드가 호출될 때마다 스택 프레임을 생성
  • Native Method Stack
    • Java가 아닌 다른 언어(바이트코드가 아닌 실제 실행할 수 있는 기계어)로 작성된 코드를 위한 영역
    • JNI(Java Native Interface)를 통해 호출하는 C/C++ 등의 코드를 실행
  • Heap Area
    • 모든 스레드가 공유하는 영역
    • Runtime에 동적으로 할당되는 데이터가 저장되는 영역 (객체, 배열 등)
    • Heap에 할당되는 데이터는 GC의 대상
    • JVM 성능 등의 이슈에서 가장 많이 언급되는 영역
  • Method Area (Class Area, Code Area, Static Area)
    • 모든 스레드가 공유하는 영역
    • JVM이 시작될 때 생성
    • 각 클래스와 인터페이스에 대한 런타임 상수 풀, 필드와 메서드 static 변수, 메서드의 바이트 코드 등을 보관
  • Runtime Constant Pool
    • Method Area 내부에 존재하는 영역
    • 어떤 메서드나 필드를 참조할 때 런타임 상수 풀을 통해 해당 메서드나 필드의 실제 메모리상 주소를 찾아서 참조하여 중복을 막는 역할

3. Execution Engine

  • Load된 클래스의 바이트코드를 실행하는 Runtime Module
  • Class Loader를 통해 JVM 내의 Runtime Data Areas에 배치된 바이트 코드를 기계어로 변환 후 실행
  • 바이트 코드를 기계어로 변환하는 방식
    • 1) Interpreter
      • 바이트 코드를 한줄씩 실행해서 속도가 느림
      • 한번만 실행하는 코드에 적합
    • 2) JIT(Just-In-Time) Compiler
      • Interpreter의 단점을 보완
      • 바이트 코드 전체를 컴파일하고 해석한 코드를 캐시에 보관해서 재실행시 빠르게 실행

4. Java Native Interface (Native Method Interface)

  • Java와 다른 언어를 연동하는 솔루션
    • Java가 다른 언어로 만들어진 애플리케이션과 상호 작용할 수 있는 인터페이스 제공
    • JVM이 원시 메소드(native method)를 적재(locate)하고 수행(invoke)할 수 있도록 한다.
    • 운영체제의 고유기능을 Java로 해결하는 것이 아닌 운영체제가 구현된 언어(보통 C, C++)로 운영체제의 고유기능을 만든다.
    • JVM이 C, C++로 만들어진 고유 기능, 즉 함수를 Java 메서드와 연결해준다.
  • JNI를 사용하는 이유
    • 1) Java가 Native Code(플랫폼에 종속적인 기계어 코드)에 비해 느리다.
    • 2) Java에서 지원되지 않는 OS의 특정 기능
      • OS에서 제공하는 모든 기능을 JVM에서 제공할 수 없기 때문에

5. Native Method Libraries

  • 네이티브 메소드 실행에 필요한 라이브러리

참고

Java, JVM 이란
Java 가상 머신(JVM)이란?
JVM Internal JVM Explained
#자바가상머신, JVM(Java Virtual Machine)이란 무엇인가? JNI (Java Native Interface) 란 ?
JAVA - JNI 사용하기

알기쉽게 정리한 JAVA의 컴파일과정 및 JVM 메모리 구조, JVM GC
자바 메모리 관리 - 스택 & 힙
[JAVA/자바] 메모리 구조(static, stack, heap)
[Java] JVM 메모리 구조
자바의 메모리 구조 1. 메소드 영역
[JVM Internal] JVM 메모리 구조

Categories:

Updated:

Leave a comment