기록하는 습관을 들이자

[Java] JVM(Java Virtual Machine)의 구조와 원리 본문

알고리즘/Java

[Java] JVM(Java Virtual Machine)의 구조와 원리

myeongmy 2020. 9. 23. 22:16
반응형

* CS(Computer Science) 스터디를 진행하며 공부하게 된 내용을 정리한 내용입니다.

 

JVM이란?

JVM이란 Java Virtual Machine의 약자로, 자바 가상 머신을 뜻하는 용어이다.

JVM의 역할은 자바 프로그램을 클래스 로더를 통해 읽어들여 자바 API와 함께 실행하는 것이다.

 

일반적인 윈도우 프로그램과 Java 프로그램의 실행구조

 

일반적인 윈도우 프로그램과 Java 프로그램의 차이

Java가 OS에 상관없이 동작할 수 있도록 중계자 역할을 한다.

GC(Garbage Collection)등의 기능을 제공한다.

 

자바 프로그램 실행 과정

JVM 구조

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

(해당 과정을 진행하면서 JVM은 필요에 따라 GC같은 관리작업 추가 실행)

 

참고> Java 외 일반적인 윈도우 프로그램 실행 과정

  1. 작성한 소스코드 파일이 컴파일러에 의해 어셈블리 언어로 구성된 파일로 변환된다.
  2. 어셈블리 파일이 어셈블러에 의해 기계어 파일(binary code)로 변환된다.(.obj 파일)
  3. 미리 컴파일된 라이브러리(헤더) 파일과 .obj 파일을 linking 하여 .exe 파일이 생성된다.
  4. .exe 파일이 loader에 의해 메모리에 올라가면, CPU를 할당받아 실행할 수 있게 된다.

 

 

JVM 구성

Class Loader

JVM 내로 .class파일들을 Load한다. Runtime 시에 동적으로 클래스를 로드한다.

Execution Engine

클래스를 실행시키는 역할이다. 클래스 로더가 JVM 내의 런타임 데이터 영역에 바이트 코드를 배치시키고, 이것은 실행엔진에 의해 실행된다. 자바 바이트코드는 기계가 바로 수행할 수 있는 언어보다도 비교적 인간이 보기 편한 형태로 기술된 것이다. 그래서 실행 엔진은 이와 같은 바이트코드를 실제로 JVM 내부에서 기계가 실행할 수 있는 형태(= 바이너리 코드(010101...))로 변경한다.

Interpreter ( in Execution Engine)

실행 엔진은 자바 바이트 코드를 명령어 단위로 한줄씩 읽어서 실행한다. 하지만 이 방식은 인터프리터 언어의 단점을 그대로 가지고 있다. 한줄씩 수행하기 때문에 느리다.

Garbage Collector ( in Execution Engine)

GC를 수행하는 모듈(스레드)이 있다.

Runtime Data Area

프로그램을 수행하기 위해 OS에게 할당받은 메모리 공간이다.

Runtime Data Area 영역

 

1) PC Register

Thread가 시작될 때 생성되며 생성되며 생성될 때마다 생성되는 공간으로 스레드마다 하나씩 존재한다. Thread가 어떤 부분을 어떤 명령으로 실행해야할 지에 대한 기록을 하는 부분으로 현재 수행 중인 JVM 명령의 주소를 갖는다.

2) JVM 스택 영역

프로그램 실행과정에서 임시로 할당되었다가 메소드를 빠져나가면 바로 소멸되는 특성의 데이터를 저장하기 위한 영역이다. 각종 형태의 지역 변수나 임시 데이터가 저장된다.

3) Native method stack

자바 프로그램이 컴파일되어 생성되는 바이트 코드가 아닌 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역이다. JAVA가 아닌 다른 언어로 작성된 코드를 위한 공간이다.

4) Method area

클래스 정보를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간이다. 클래스 파일, static 변수 등이 저장되는 공간이다.

5) Heap area

객체를 저장하는 가상 메모리 공간이다. new 연산자로 생성된 객체와 배열을 저장한다. GC(Garbage Collector)의 관리 대상이다.

반응형
Comments