Computer Science/Java
JVM의 구조와 JAVA의 실행방식
eunnnn
2023. 4. 10. 11:46
JVM이란
JVM은 자바 가상 머신의 약자로, 자바 프로그램 실행환경을 만들어주는 소프트웨어이며, 메모리 관리(GC)를 수행하는 스택 기반의 가상머신이다.
JVM의 역할은 다음과 같다.
- 자바 애플리케이션을 클래스 로더를 통해 읽어 자바 API와 함께 실행할 수 있도록 한다.
- 자바와 운영체제 사이에서 중개자 역할을 수행하여 자바가 운영체제에 구애 받지 않고 프로그램을 실행할 수 있도록 도와준다.
이 때 Java는 JVM을 통해 플랫폼에 종속적이지 않지만, JVM은은 플랫폼에 의존적이라서 각 플랫폼에 맞는 JVM이 존재한다.
JVM의 구조
Class Loader
JVM 내로 클래스 파일(*.class)을 동적으로 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈이다. 즉, 로드된 바이트 코드(.class)들을 엮어서 JVM의 메모리 영역인 Runtime Data Areas에 배치한다.
Execution engine
바이트 코드를 실행시키는 역할을 수행한다. 인터프리터, JIT 컴파일러, GC(Garbage Collector)로 구성되어 있다.
- 인터프리터: 바이트 코드를 한 줄씩 실행한다.
- JIT 컴파일러: Interpreter의 단점을 보완하기 위해 도입된 방식으로 반복되는 코드를 발견하면 바이트 코드 전체를 컴파일하여 Native Code로 변경하고 이후에는 해당 메서드를 더 이상 인터프리팅 하지 않고 캐싱해 두었다가 네이티브 코드로 직접 실행하는 방식이다. (네이티브 코드란, JAVA에서 부모가 되는 C언어나, C++, 어셈블리어로 구성된 코드를 의미한다.)
- 힙 영역에서 사용되지 않는 객체들을 제거하는 작업을 의미한다.
Runtime Data Area
JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역이다.
- PC Register: Thread가 시작될 때 생성되며 현재 수행 중인 JVM 명령의 주소를 갖고 있다.
- Stack Area: 지역 변수, 파라미터 등이 생성되는 영역. 실제 객체는 Heap에 할당되고 해당 레퍼런스만 Stack에 저장된다.
- Heap Area: 동적으로 생성된 오브젝트와 배열이 저장되는 것으로 GC의 대상 영역이다.
- Method Area: 클래스 멤버 변수, 메소드 정보, Type 정보, Constant Pool, static, final 변수 등이 생성된다. Constant Pool은 모든 Symbolic Reference를 포함하고 있다.
- Native Method Stack : 자바 애플리케이션에서 C, C++, 어셈블리어로 작성된 함수를 사용할 수 있는 방법을 제공해준다. Native 키워드를 사용하여 메서드를 호출한다. 대표적인 메서드는 Thread의 currentThread()이다.
- Runtime 상수 pool : 각 클래스와 인터페이스의 상수뿐만 아니라, 메서드와 필드에 대한 모든 레퍼런스까지 담고 있는 테이블. 즉 어떤 메서드나 필드를 참조할 때 JVM은 런타임 상수 풀을 통해 해당 메서드나 필드의 실제 메모리상 주소를 찾아서 참조한다.
Java의 실행방식
1. 자바로 개발된 프로그램을 실행하면 JVM은 OS로 부터 메모리를 할당한다.
2. 자바 컴파일러(javac)가 자바 소스코드(.java)를 자바 바이트코드(.class)로 컴파일 한다.
3. Class Loader를 통해 JVM Runtime Data Area로 로딩한다.
4. Runtime Data Area 에 로딩된 .class는 Execution Engine을 통해 해석한다.
5. 해석된 바이트 코드는 Runtime Data Area의 각 영역에 배치되어 수행되며, 이 과정에서 Execution engine에 의해 GC 작동과 스레드의 동기화가 이루어진다.
출처