서론

Java를 주언어로 코딩하는 사람으로서 Java하면 떠오르는 JVM을 한번 정리해보고자 글을 작성한다. 어느순간부터 아무 생각없이 개발할 때 Java를 이용하는 듯해서 환기겸해서 정리한다.

* 자바코드 실행과정

1) Java 소스(.java 파일)가 자바 컴파일러에 의해 Java Byte 코드로 컴파일된다.
2) 컴파일된 Java Byte 코드가 클래스로더(Class Loader)에게 전달된다.
3) 클래스로더는 동적 로딩(Dynamic Loading)을 통해 필요한 클래스들을 Runtime Data Area(JVM의 메모리)에 올린다.
4) 실행엔진(Execution Engine)은 JVM 메모리에 올라가있는 바이트 코드들을 명령어 단위 하나씩 가져와서 실행한다.

JVM 내부에는 Class Loader, Runtime Data Area, Execution Engine이 있다. 해당 모듈들에 대해 알아보자

* JVM (Java Virtual Machine)

  • 컴퓨터가 어떤 OS이든 상관없이 자바 프로그램을 실행이 가능하게 해주는 것
  • 자바 컴파일 코드(Byte Code)를 OS에 맞게 해석해주는 역할

1. 클래스 로더(Class Loader)

  • 단순한 구조가 아닌, 여러 클래스 로더끼리 계층 구조를 이루고 있다.

  • 컴파일된 바이트 코드를 로드하고, 링크를 통해 Runtime Data Area에 배치하는 작업을 수행하는 모듈
  • 런타임 시 동적으로 클래스를 로드한다. jar 파일 내 저장된 클래스들을 JVM

2. 런타임 데이터 영역(Runtime Data Area)

  • 프로그램을 수행하기 위해 JVM이 OS에게 할당받은 메모리 공간
  • 모든 쓰레드가 공유하는 메모리 공간
  • PC 레지스터(Register), JVM 스택(Stack), 네이티브 메서드 스택(Native Method Stack), 힙(Heap)로 이루어져 있다.

3. 실행 엔진(Execution Engine)

  • 클래스 로더를 통해 런타임 데이터 영역에 배치된 바이트 코드를 명령어 단위로 하나씩 읽어서 실행
  • JIT 컴파일러, GC(Garbage Collection)으로 이루어져 있다.
  • JIT 컴파일러 : 바이트 코드 –> Native Code로 변환