Web/Java
JVM (Java Virtual Machine)
돌건
2021. 9. 1. 19:39
자바 유저라면 자바 프로그램이 어떤 과정을 거쳐 실행되는지와 메모리 구조에 대해서는 알아두는 것이 좋다고 생각이 오늘 이 글을 포스팅한다.
JVM이란?
자바 프로그램은 완전한 기계어가 아닌 바이트 코드(.class)이기 때문에 운영체제가 바로 실행할 수 없다. 그렇기 때문에 운영체제를 대신해서 자바 프로그램을 실행해줄 녀석이 필요한데, 그게 바로 JVM이다.
Java Application 실행 과정
1. 자바 프로그램을 실행하면 JVM이 해당 프로그램을 실행하는 데 필요한 메모리를 OS로부터 할당 받는다.
2. 자바 컴파일러(javac)가 자바 파일(.java) -> 클래스 파일(.class, 바이트 코드)로 변환한다.
3. 이렇게 변환된 class파일들은 Class Loader에 의해서 JVM 메모리 (Runtime Data Area)에 적재된다.
4. Runtime Data Area에 적재된 class들(바이트 코드)는 Execution Engine에 의해서 기계어(바이너리 코드)로 변환돼 명령어 단위로 실행된다.
자바 프로그램이 실행되는 과정은 위에 기재한 것과 같다. 그렇다면 이제 JVM의 구성에 대해 알아보자.
JVM 구성
- Class Loader
Class Loader는 자바 컴파일러에 의해 바이트 코드로 변환된 class파일들을 JVM의 메모리인 Runtime Data Area에 적재하는 역할을 한다.
- Execution Engine
1. Class Loader에 의해서 메모리에 적재된 클래스(바이트 코드)들을 기계어로 변경해 명령어 단위로 실행한다.
2. 명령어를 실행하는 방식에는 인터프리터와 JIT(Just-In-Time) 방식이 있다.
- Garbage Collector
Heap 영역에 존재하는 객체들 중 참조되지 않는 객체를 찾아 제거하는 역할을 한다.
- Runtime Data Area
자바 프로그램을 실행하기 위해 OS에서 할당받은 메모리 공간이다.
Runtime Data Area
- Method Area
1. 클래스 멤버명, 데이터 타입, 접근 제어자 등의 필드 정보
2. 메소명, 반환 타입, 파라미터, 접근 제어자 등의 메소드 정보
3. Interface, Class Type 정보
4. Static 변수, 상수 풀
5. final class
이런 친구들이 생성되는 영역이다.
- Heap Area
1. new 연산자를 통해 새로 생성되는 객체 (Method Area에 적재된 객체만 가능)
2. 배열
이런 친구들이 생성되는 영역이다.
- Stack Area
1. 지역 변수, 파라미터, 리턴 값 등이 생성되는 영역이다.
2. 메소드를 호출할 때마다 스택에 메소드와 관련된 1번 정보들이 저장된다.
- PC Register
1. 스레드마다 하나씩 존재하는 레지스터로, 현재 스레드가 실행해야 하는 명령어와 주소를 저장한다.
2. 현재 실행 중인 JVM 명령 주소를 저장한다.
이렇게 JVM의 구성과 그 중에서도 Runtime Data Area에 대해서 간략하게나마 정리를 해보았다. 이 글을 역순으로 본다면 더 이해가 잘 갈 수도 있을거라 생각한다. 다음 글에서는 Heap 영역과 관련된 Garbage Collector에 대해 정리해보겠다.