JVM이란?

2 minute read

Java Virtual Machine

What is JVM?

JVM의 역할 : Java Application을 클래스 로더를 통해 읽어들여 JAVA API와 함께 실행함. JAVA와 OS사이에서 중개자 역할을 수행하여 JAVA가 운영체제에 종속되지 않도록 한다.

가장 중요한 역할은 메모리관리, Garbage collection을 수행한다. 스택 기반으로 동작한다.

JAVA 프로그램의 실행과정

  1. 프로그램이 실행되면 JVM은 OS로부터 프로그램이 필요로 하는 메모리를 할당받음.
  2. 자바 컴파일러(javac)가 자바 소스코드(.java)를 읽어들여 자바 바이트코드(.class)로 변환시킨다.
  3. Class Loader를 통해 class파일들을 JVM으로 로딩.
  4. 로딩된 class파일들은 Execution engine을 통해 해석됨.
  5. 해석된 byte code는 runtime data areas에 배치되어 실질적인 수행이 이루어짐.

이러한 실행과정에서 JVM은 Thread Synchronization과 GC같은 관리작업을 수행한다.

JVM구성

Class Loader

JVM내로 클래스(.class file)을 로드하고, 링크를 통해 배치하는 작업 수행하는 모듈. Runtime시에 동적으로 클래스를 로드함. 자바는 클래스를 처음으로 참조할 때(런타임 시에) 클래스를 로드하고 링크하는데 그 역할을 클래스 로더가 수행함.

Execution Engine

클래스를 실행시키는 역할. 클래스 로더가 JVM내의 런타임 데이터 영역에 바이트 코드를 배치시키고 실행엔진에 의해 실행됨. 바이트 코드를 JVM내부에서 실행할 수 있는 실행파일 형태로 변경해야 하는데 이때 Interpreter와 JIT 방식을 사용하게 됨.

Interpreter : 자바 바이트 코드를 명령어 단위로 읽어서 실행하는데 한줄씩 수행하기 때문에 느림.

JIT (Just - In - Time) : 인터프리터 방식의 단점을 보완하기 위해 도입됨. 인터프리터 방식으로 실행하다가 적절한 시점에 바이트 코드 전체를 컴파일하여 네이티브 코드로 변경하고 직접 실행.

GC 프로그래머는 힙을 사용할 수 있는 만큼 자유롭게 사용하고 더 이상 사용되지 않는 오브젝트 들은 GC를 담당하는 프로세스가 자동으로 메모리에서 제거하도록 함. Heap영역의 오브젝트 중 stack에서 Unreachable한 오브젝트들읜 GC의 대상이 된다.



Runtime Data Area

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

1) PC Register Thread가 시작될 때 생성되며 생성될 때마다 생성되는 공간으로 스레드마다 하나씩 존재함. Thread가 현재 수행중인 JVM 명령의 주소를 갖는다.

2) JVM Stack 영역

  • Heap 영역에 생성된 오브젝트 타입의 데이터의 참조값이 할당됨.
  • 원시 타입(byte, short, int, long, double, float, boolean, char)의 데이터가 값과 함께 할당됨.
  • 지역변수들은 scope에 따른 visibility를 가짐.
  • Thread는 자신만의 stack을 가짐.

프로그램 실행과정에서 임시로 할당되었다가 메서드를 빠져나가면 바로 소멸되는 특성의 데이터를 저장하기 위한 영역. 각종 형태의 변수, 임시 데이터, 스레드나 메서드의 정보를 저장함. 메서드 수행이 완료되면 프레임별로 삭제. 호출된 메서드의 매개변수, 지역변수, 리턴 value 및 연산시 일어나는 값들을 임시로 저장함.

3) Method Area(Class area == Static Area) 클래스의 정보를 처음 메모리 공간에 올릴때 초기화되는 대상을 저장하기 위한 메모리 공간. 상수 자료형을 저장하여 참조하고 중복을 막는 역할을 수행함. 올라가는 정보 : 멤버변수(이름, 데이터 타입, 접근제어자에 대한 정보), 메소드(이름, 리턴타입, 매개변수, 접근제어자에 대한 정보), type information(class 인지 interface인지 여부 저장, type의 속성)

4) Heap 객체를 저장하는 메모리 공간, class area에 올라온 클래스들만 객체로 생성할 수 있음. Method Area는 클래스 데이터를 위한 공간이라면 Heap영역이 객체를 위한 공간이다.

  • 어플리케이션의 모든 메모리중 stack에 있는 데이터를 제외한 부분
  • 모든 Object타입(Integer, String, ArrayList…)는 heap에 생성됨
  • 스레드가 몇개가 존재하든 단 하나의 heap 영역에만 존재함.(스레드간의 공유)
  • heap영역에 있는 오브젝트들을 가리키는 레퍼런스 변수가 stack에 올라가게 됨.





출처 https://asfirstalways.tistory.com/158

Categories:

Updated: