1. 자바 JVM 동작 방식
1) 클래스 로더(Class Loader)가 클래스 파일(.class)를 JVM Runtime Data Area로 로딩한다.
2) Runtime Data Area에 로딩 된 .class들은 Execution Engine을 통해 해석한다.
3) 해석된 바이트 코드는 Runtime Data Area의 각 영역에 배치되어 수행하며 이 과정에서 Execution Engine에 의해 GC의 작동과 스레드 동기화가 이루어진다.
2. JVM 구조
1) Class Loader (클래스 로더):
Class Loader는 자바 클래스들을 JVM의 메모리로 로드하는 역할을 한다.
프로그램 실행 시 필요한 클래스들을 동적으로 로드하여 JVM 메모리에 올리고, 중복 로딩을 방지한다.
2) Execution Engine (실행 엔진):
Execution Engine은 클래스 로더에 의해 메모리에 로드된 바이트 코드를 실행하는 역할을 한다.
바이트 코드를 해석하여 기계 코드로 변환하는 인터프리터와, 중복적으로 실행되는 코드를 JIT(Just-In-Time) 컴파일하여 최적화된 기계 코드로 변환하는 JIT 컴파일러가 포함된다.
3) Garbage Collector (가비지 컬렉터):
Garbage Collector는 더 이상 사용되지 않는 객체들을 찾아서 메모리를 회수하는 역할을 한다.
자바에서는 가비지 컬렉션을 통해 프로그래머가 직접 메모리를 관리할 필요가 없으며, 메모리 누수를 방지할 수 있다.
4) Runtime Data Areas (런타임 데이터 영역):
JVM은 프로그램 실행에 필요한 데이터를 런타임 데이터 영역에 저장하고 관리한다.
3. JVM 메모리 ( Runtime Data Area ) 구조
1) 메소드 영역(Method Area 또는 클래스 영역):
클래스 정보(메소드, 변수, 상수 등)를 저장한다. 모든 스레드에서 공유하는 메모리 영역이다.
2) 힙 영역(Heap):
동적으로 생성된 인스턴스 객체와 배열을 저장하는 영역이다.
JVM이 시작할 때 미리 정해진 크기의 힙 영역이 할당되며, 필요에 따라 자동으로 확장될 수 있다.
스레드 수에 관계없이 메모리 공유가 된다.
가비지 컬렉션(Garbage Collection)이 수행되어 더 이상 사용되지 않는 객체들을 자동으로 제거하여 메모리를 관리한다.
3) 스택 영역(Stack):
각 스레드마다 별도의 스택이 생성되는 영역이고, 스택 영역은 메소드 호출과 관련된 정보를 저장한다.
메소드가 호출될 때마다 스택 프레임(Stack Frame)이 생성되어 호출된 메소드의 지역 변수, 매개변수, 리턴 주소, 리턴 값 등을 저장한다.
메소드가 실행을 마치면 해당 스택 프레임은 제거된다.
* 스택 프레임 : 메서드가 호출되기 이전의 상태를 기록하는 역할을 수행한다.
4) PC 레지스터 영역(Program Counter Register):
각 스레드마다 별도의 PC 레지스터를 가진다.
현재 실행 중인 스레드가 다음에 실행할 명령어의 주소를 갖는다.
5) 네이티브 메소드 스택 영역(Native Method Stack):
자바 코드가 아닌 다른 언어로 작성된 네이티브 메소드의 호출과 관련된 정보를 저장한다.
참고
https://coding-factory.tistory.com/828
[Java] 자바 JVM 내부 구조와 메모리 구조에 대하여
저번 포스팅에서는 JVM에 대해서 간략하게 알아보는 시간을 가졌다면 이번 포스팅에서는 JVM의 내부 구조에 대해 좀 더 자세하게 알아보도록 하겠습니다. 혹시 JVM의 정의와 왜 필요한지 궁금하시
coding-factory.tistory.com
'자바' 카테고리의 다른 글
자바 Stack (0) | 2023.07.24 |
---|---|
자바 List (0) | 2023.07.23 |
자바 String builder, String buffer 차이 (0) | 2023.07.18 |
자바 JVM 이란 (0) | 2023.07.18 |
자바 Call by value, Call by reference, 기본 자료형, 참조 자료형 (0) | 2023.07.18 |