* TIL/개념: 최대한 공식 문서 & 책을 기반으로 배운 내용을 정리
* 현재 취준생으로 풋내기 개발자가 쓰는 글입니다.
* 그러니 조언과 지적 및 훈수는 언제나 환영입니다! 댓글로 많이 달아주세요!
JVM(Java Virtual Machine)의 동작 과정
JVM은 자바 가상 머신의 약자로, 자바 바이트 코드를 실행할 수 있는 주체다.
그 동작 과정을 순서대로 나타내면 다음과 같다:
- 자바 코드는 자바 컴파일러에 의해서 자바 바이트 코드, 즉 클래스 파일로 변환된다.
- JVM의 클래스 로더에 의해서 클래스 파일을 읽고, Runtime Data Area에 코드를 배치한다.
- Execution Engine 에 의해서 Runtime Data Area에 배치된 클래스 파일을 실행한다.
- Garbage Collector가 Runtime Data Area에서 Heap Area에 참조되지 않는 메모리를 자동으로 해제한다.
영역 중 Runtime Data Area에 대해 알아보자.
Runtime Data Area
JVM에서는 프로그램이 실행하고 있을 때 사용하는 런타임 데이터 영역이 있다.
이 영역은 크게 JVM이 시작할 때 같이 생성되며, 종료되면 같이 삭제되는 영역과,
스레드가 생성될 때 생성되고 종료될 때 소멸되는 스레드별 데이터 영역이 존재한다.
PC(Program Counter) Register
- 스레드별로 존재
- 현재 실행 중인 명령어의 주소를 저장 ⇒ JVM이 순차적으로 명령어를 실행할 때 다음 실행할 명령어의 위치를 추적하기 위함
- 쓰레드가 어떤 부분을 무슨 명령으로 실행해야할 지에 대한 기록을 하는 부분
- Native Method인 경우는 정의되지 않는다.
- 여기서 Native Method란? Java 외에 C, C++와 같은 다른 프로그래밍 언어로 작성된 코드
JVM Stack
- 스레드별로 존재
- Stack Frame을 저장
- Frame은 메소드가 호출될 때마다 생성된다.
- Stack Frame에는 메서드 호출 시 필요한 지역 변수, 매개 변수, 복귀 주소 등이 저장된다.
- C와 같은 기존 언어의 스택과 유사
Native Method Stack
- Native Method(Java 프로그래밍 언어 이외의 언어로 작성된 메서드)를 지원하기 위한 Stack.
- 스레드별로 존재
Heap
- 스레드 간 공유
- 모든 클래스 인스턴스 및 배열에 대한 메모리 할당
- JVM 시작 시 생성되며, 힙에 할당된 공간은 Garbage Collector에 의해 회수
Method Area
- 스레드 간 공유
- OS Process의 "Text" Segment와 유사
- 런타임 상수 풀(run-time constant pool), 멤버 변수(필드), 클래스 변수(static 변수), 생성자와 메서드와 같은 클래스별 구조 저장
Run-Time Constant Pool
- 클래스 파일의 상수 풀을 실행 시점에 사용하기 위해 메모리에 로드하는 영역
- 컴파일 타임에 알려진 숫자 리터럴부터 런타임 시에 확인되어야 하는 메서드, 필드 참조 등 다양한 상수 정보가 런타임 상수 풀에 로드되어 JVM이 실행 중일 때 사용
- Method-Area에 할당
- JVM에 의해 클래스 혹은 인터페이스가 생성될 때 구성
요약
- .java 파일은 자바 컴파일러에 의해 .class 파일로 변환된다.
- JVM은 Class Loader를 통해 클래스를 로드하고, Garbage Collector를 통해 메모리를 관리하며, Execution Engine을 통해 바이트 코드를 실행해 자바 프로그램을 실행한다.
- RunTime Data Area: 프로그램이 실행 중일 때 사용되는 메모리 영역
- PC Register: 현재 실행 중인 명령어의 주소를 저장
- JVM Stack: Stack Frame을 저장
- Native Method Stack: Native Method 용 Stack
- Heap: 모든 클래스 인스턴스 및 배열에 대한 메모리 할당, GC의 대상1
- Method Area: 클래스의 바이트 코드, 상수, 정적 변수, 메서드 정보 등이 저장
- Run-Time Constant Pool: 클래스 파일의 상수 풀을 실행 시점에 사용하기 위해 메모리에 로드되는 영역
참고 자료
JVM Memory Structure by devkuma
java의 메모리 관리 인터뷰 질문 by Baeldung
마치며
원래 RunTime Data Area 외에도 Class Loader, Execution Engine, Garbage Collector도 포함시키고 싶었지만,
그럼 포스팅 시간이 너무 오래 걸릴 것 같아 우선 제외했다.(나중에 추가할 예정)
예외로 GC는 워낙 중요해서 원리에 관해서 한번 더 포스팅하려고 한당
'Java∕Kotlin' 카테고리의 다른 글
[TIL/개념] Garbage Collection (0) | 2023.06.22 |
---|