본문 바로가기

IT

JVM의 구조와 Java 실행 방식

728x90

JVM (Java Virtual Machine)

  • 자바 프로그램을 실행할 수 있는 가상머신
  • 자바와 OS사이에서 중재자 역할을 수행하고 자바가 운영체제에 구애 받지 않고 프로그램을 실행할 수 있도록 해준다
  • GC(가비지 컬렉터)를 사용한 메모리 관리를 실행. 따라서 한정된 메모리를 사용해서 최고의 성능을 내기 위해서는 JVM의 이해가 필수적

JVM 내부 구조와 역할

JVM 구조

Class Loader

: 동적으로 클래스를 로딩해주는 역할을 수행 .class파일을 묶어서 JVM이 운영체제로부터 할당받은 메모리 영역 (Run Data Area)에 올리는 역할 바이트 코드(클래스파일)을 읽어 메모리에 올리는 역할

Execution Engine (실행엔진)

: 클래스를 실행하는 역할을 수행. 클래스 로더가 JVM내의 Runtime Data Areas에 바이트 영역에 바이트 코드를 배치, 배치된 이후 정의된 내용대로 인터프리터가 바이트 코드를 실행시킨다. 그 중 반복되는 부분에 대한 처리는 JIT컴파일러에서 처리

Garbage Collector (가비지 컬렉터)

: 사용하지 않는 메모리를 자동으로 회수해줌으로써 개발자가 따로 메모리를 관리하지 않아도 되도록 도와준다. Heap 메모리 영역에 생성된 객체들 중 참조되지 않은 객체들을 탐색 후 제거하는 역할을 수행

Runtime Data Area

: JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역

  • Method Area (Class Area, Static Area)
  • 클래스 데이터를 위한 공간으로 모든 쓰레드가 공유하는 메모리 영역 , 클래스, 인터페이스, 메소드, 필드, Static 변수 등의 바이트 코드를 보관
  • Heap Area
  • 객체를 위한 공간으로 모든 쓰레드가 공유, new 연산자로 생성된 객체와 배열을 저장하는 영역 , 메소드 영역에 로드된 클래스만 생성이 가능하고 Garbage Collector가 참조되지 않는 메모리를 확인하고 제거하는 영역
  • Stack Area
  • 프로그램의 실행과정에서 임시로 할당되었다가 메소드를 빠져나가면 바로 소멸되는 특성의 데이터를 저장하기 위한 영역, 메서드 호출 시마다 각각의 스택 프레임(메서드만을 위한 공간)이 생성되며 메서드 수행이 끝나면 프레임별로 삭제한다. 또한 호출된 메서드의 매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값들을 임시로 저장
  • PC Register
  • 쓰레드가 시작될 때 생성될 때마다 생성되는 공간으로 쓰레드마다 하나씩 존재, 쓰레드가 어떤 부분을 무슨 명령으로 실행해야할 지에 대한 기록을 하는 부분으로 현재 수행중인 JVM 명령의 주소를 가진다
  • Native Method Stack
  • 자바 프로그램이 컴파일되어 생성되는 바이트코드가 아닌 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행 시키는 영역으로 쉽게 말해서 자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역

 

자바 프로그램의 실행단계

자바 실행 단계

  1. 프로그램이 실행되면 JVM은 운영체제로부터 프로그램이 필요로하는 메모리를 할당받는다.
  2. 자바 컴파일러가 자바 소스코드를 자바 바이트코드(.class)로 컴파일합니다.
  3. Class Loader를 통해 class 파일들을 JVM Run Data Area로 로딩
  4. 로딩 된 class 파일들은 Execution engine을 통해 해석된다.
  5. 해석된 바이트 코드는 Runtime Data Area의 각 영역에 배치되어 실질적인 수행이 이뤄진다.