자바 기본기 정리 6 - JVM (2)

유승선 ·2024년 1월 14일
0

자바 독학

목록 보기
8/10

JVM 의 기본과 Java 파일이 어떤식으로 실행이 되는지 저번 포스팅에서 언급 했으니, 이번 포스팅에서는 JVM 내부 구조에 대해서 더 자세하게 적을 예정이다. 대부분의 내용은 JVM 내부 구조 여기에서 참고 하였다.


소개

지난 번 포스트에서, Java는 두번의 과정을 거쳐서 프로그램을 실행시킨다고 적었다. 첫번째는, .java 파일을 실행 시키면서 컴파일러가 .clas 파일로 변환을 해준다. 두번째는, 변환된 .class 파일을 OS에 맞는 환경의 기계어로 번역시켜주는게 JVM의 역할이다.

오늘은 .class 파일을 어떤한 처리를 거쳐 프로그램을 실행 시키는지에 대해, 저 빨간 박스안에 부분을 더 상세하게 작성할 것이다.


자바 가상 머신 (JVM)의 동작 방식

JVM이 내부적으로 동작하는 방식에 대하 간단한 요약 도식이다.

단계별로 설명하자면 아래와 같다.

  1. 자바 프로그램을 실행하면 JVM으 OS로부터 메모리를 할당 받는다.
  2. 자바 컴파일러 (javac) 가 자바 소스코드(.java)를 자바 바이트 코드(.class) 로 컴파일 한다.
  3. Class Loader 는 동적 로딩을 통해 필요한 클래스들을 로딩 및 링크하여 Runtime Data Area (실질적인 메모리를 할당 받아 관리하는 영역) 에 올린다.
  4. Runtime Data Area에 로딩된 바이트 코드는 Execution Engine 을 통해 해석된다.
  5. 이 과정에서 Execution Engine에 의해 Garabage Colllector 의 작동과 Thread 동기화가 이루어진다.

JVM의 구조

Class Loader? RunTime Data Area? Execution Engine? 이 뭔지 잘 모르겠음으로 더 상세하게 구분되어 있는 표다.

JVM은 아래와 같이 구분되어 있다.

  1. 클래스 로더 (Class Loader)

  2. 실행 엔진 (Execution Engine)
    2.1 인터프리터
    2.2 JIT 컴파일러
    2.3 가비지 콜렉터

  3. 런타임 데이터 영역 (Runtime Data Area)
    3.1 메소드 영역
    3.2 힙 영역
    3.3 PC register
    3.4 스택 영역
    3.5 네이티브 메소드

  4. JNI - 네이티브 메소드 인터페이스
    네이티브 메소드 라이브러리


클래스 로더란?

간단하게 설명해서 클래스 로더 는 JVM 내로 클래스 파일 (.class)을 동적으로 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈이다.
즉, 로드된 바이트 코드(.class) 들을 엮어서 JVM의 메모리 영역인 Runtime Data Area에 배치한다

클래스를 메모리에 올리는 로딩 기능은 한번에 메모리에 올리지 않고, 어플리케이션에서 필요한 경우 동적으로 메모리에 적재하게 된다.


실행 엔진 (Execution Engine) 이란?

실행 엔진은 클래스 로더를 통해 런타임 데이터 영역에 배치된 바이트 코드를 명령어 단위로 읽어서 실행한다.

자바 바이트 코드(.class) 는 기계가 바로 수행할 수 있는 언어보다는 가상 머신이 이해할 수 있는 중간 레벨로 컴파일된 코드다. 그래서 실행 엔진은 이와 같은 바이트 코드를 실제로 JVM 내부에서 기계가 실행할 수 있는 형태로 변경해준다

이 수행 과정에서 인터프리터JIT 컴파일러 두 가지 방식을 혼합하여 코드를 실행한다.

  1. 인터프리터 (Interpreter):
    -> 바이트 코드 명령어를 하나씩 읽어서 해석하고 바로 실행한다. JVM 안에서 바이트 코드는 기본적으로 인터프리터 방식으로 동작한다.
  2. JIT 컴파일러 (Just-In-Time Compiler)
    -> 인터프리팅 방식보다 빠르다, 하지만 바이트 코드를 Native Code로 변환하는데는 비용이 소요됨으로, 인터프리터 방식을 사용하다 일정 기준이 넘어가면 JIT 컴파일 방식으로 명령어를 실행하는 식으로 진행한다.

가비지 컬렉터란? (Garbage Collector, GC)

자바 가상 머신은 가비지 컬렉터 (garbage collector) 을 이용하여 Heap 메모리 여역에서 더는 사용하지 않는 메모리를 자동으로 회수 해 준다. Java언어의 강점이라고 할 수 있지만, C언어 같은 경우 직접 개발자가 메모리 관리를 해야하지만, Java는 이 가비지 컬렉터를 이용해 자동으로 메모리를 실시간으로 최적화 시켜준다. 따라서, 개발자가 관리 해주지 않아도 쉽고 프로그래밍이 가능하다.

GC의 종류는 다양하고 나중 포스팅에서 더 상세하게 설명하겠다.


포스팅이 길어져서, JVM의 핵심인 Runtime Data Area 에 관련된 포스팅은 다음으로 작성하겠다.

profile
성장하는 사람

0개의 댓글