JVM 이란?

정태규·2024년 3월 7일
0

java

목록 보기
7/7

JVM이란 자바를 실행하기 위한 가상 기계라고 할 수 있다.
JVM의 장점은 OS에 종속받지 않고 Java를 실행시킬 수 있다는 특징이 있다.
이 글에서는 JVM의 구조와 java의 실행과정이 어떻게 이루어지는지 알아보겠다.

JVM의 구조

Class Loader

JVM내로 클래스 파일을 로드하고, 링크를 통해 배치하는 작업을 수행한다.
런타임시 한번에 모든 클래스 파일을 로드하는 것이 아니라, 필요한 클래스 파일의 바이트 코드를 JVM 메모리에 로드하는데, 여기에는 클래스의 메타데이터가 생성된다.
JVM 실행중 더 이상 필요하지 않은 클래스나 인스턴스가 생기게 되면 Garbage Collector가 이를 감지하여 메모리 상에서 제거해줘 메모리 누수를 막는다.

Runtime Data area의 구성

JVM이 프로세스로 사용되기 위해 OS로부터 할당받는 메모리 영역이다.

  • Method Area
    모든 쓰레드에게 공유된다. 클래스 정보, 변수 정보, 메서드 정보, static변수 정보, 상수 정보등이 저장된다.
  • Heap Area
    모든 쓰레드에게 공유된다. new 명령어로 생성된 인스턴스와 객체가 저장됨.
    공간이 부족하면 Garbage Collection 실행
  • Stack Area
    각 쓰레드마다 하나씩 생성. Method안에서 사용되는 값들(매개변수, 지역변수, 리턴 값 등)이 저장된다. 메서드가 호출될 때 LIFO로 하나씩 생성, 메서드 실행 완료되면 LIFO로 지워진다.
  • PC Register
    각 쓰레드마다 하나씩 생성. CPU Register와 역할이 비슷하다. 현재 수행중인 JVM 명령의 주소 값 저장

Execution Engine의 구성

  1. 인터프리터: 바이트코드 명령어를 하나씩 읽어서 해석하고 실행
  2. JUST IN TIME(JIT) Compiler: 인터프리터 + 캐싱 더 빠르게 수행
  3. Garbage Collector: 메모리 영역의 메모리를 관리한다.

java 실행과정


우리가 작성하는 JAVA 코드인 JAVA source 파일들은 사실 컴퓨터는 알지 못하는 코드이다. 컴퓨터는 단지 0과 1만을 알고 있을 뿐이다.
따라서, 다음과 같은 순서로 컴퓨터가 코드를 이해할 수 있도록 해석한다.

  1. java 언어로 코드를 작성한다.
  2. java 컴파일러를 통해 소스코드를 바이트코드로 변환 (.class 파일에 저장)
  3. JVM에서 class Loader를 통해 클래스파일이 Runtime Data Area(JVM 메모리)에 배치된다.
  4. Execution Engine이 JVM 메모리 상에 있는 바이트 코드를 그때 그때 읽어서 각 OS에 맞는 바이너리 코드로 변환하고 이를 실행한다.

바이트 코드를 읽는 방식

JVM은 바이트 코드를 해석할 때, 인터프리터 방식 + JIT 컴파일 방식을 혼합해서 사용한다.
인터프리터 방식은 한줄씩 해석하고 실행하는 방식이다. 초기 방식이고 속도가 느리다는 단점이 있다.
느린 속도를 보완하기 위해서 나온것이 JIT 컴파일 방식이다.
JIT 컴파일 방식은 같은 코드를 매번 컴파일 하지 않고, 실행할 때 컴파일을 하면서 해당 코드를 캐싱해버린다.
이후에는 바뀐 코드에 대해서만 컴파일하고, 나머지는 캐싱된 코드를 사용한다.
이 때문에, JIT 컴파일 방식이 인터프리터 방식보다 훨씬 빠르다.

0개의 댓글