출처(https://steady-coding.tistory.com/305)
JVM의 구조는 사진과 같이 이루어져 있으며, 그 중 데이터 영역은 5가지로 나누어져 있다.
JVM 메모리 구조
JVM(Java Virtual Machine)은 Java 애플리케이션을 실행하는 데 필요한 가상 머신입니다. JVM은 운영체제로부터 메모리를 할당 받아 자바 애플리케이션을 위한 메모리 공간을 준비합니다.
메모리 영역
JVM은 크게 5가지 메모리 영역으로 나눌 수 있습니다.
- 메서드 영역(Method Area)
- 클래스 파일의 정보를 저장하는 영역
- 클래스 로더에 의해 로드된 클래스 정보, 메소드 정보, 필드 정보, static 변수, 상수 풀 등이 저장된다.
- JVM이 시작될 때 생성되며, 모든 스레드가 공유한다.
- 힙 영역(Heap)
- new 연산자를 사용하여 생성된 객체, 배열 등이 저장된다.
- Garbage Collector에 의해 관리되며, 더 이상 사용하지 않는 객체를 자동으로 제거하여 메모리를 해제한다. JVM이 시작될 때 생성되며, 모든 스레드가 공유한다.
- 스택 영역(Stack)
- 메서드 호출 시 발생하는 로컬 변수와 연산 중 발생하는 임시 데이터를 저장하는 영역
- 각 스레드마다 별도의 스택이 생성되며, 스레드가 메소드를 호출할 때마다 해당 메소드의 지역 변수, 매개 변수, 리턴 값 등이 스택에 저장된다.
- 메소드가 종료되면 해당 메소드와 관련된 스택 프레임이 스택에서 제거다.
- PC 레지스터(Program Counter Register)
- 스레드가 어떤 명령을 실행할지에 대한 기록을 저장하는 영역
- 현재 수행 중인 명령어의 주소를 저장하는 레지스터
- JVM은 바이트 코드를 인터프리팅하면서 PC 레지스터를 업데이트하며 다음에 실행할 명령어의 주소를 저장한다.
- 네이티브 메서드 스택(Native Method Stack)
- 자바 외의 언어로 작성된 네이티브 코드를 위한 메모리 영역 (스택)
- JNI(Java Native Interface)를 통해 JVM과 상호 작용하며, JVM은 해당 메서드의 실행에 필요한 메모리를 할당하고 네이티브 메서드 스택을 생성합한다.
- JVM 스택과는 별도로 존재하며, 네이티브 메서드 실행이 완료되면 해당 스택도 함께 소멸된다.
JVM 메모리 구조의 특징
JVM 메모리 구조는 자바 애플리케이션의 성능과 안정성에 큰 영향을 미치는 중요한 요소다.
- JVM은 가비지 컬렉션(Garbage Collection)을 지원한다.
- JVM은 동적으로 메모리를 할당하고 해제한다.
- JVM은 여러 개의 스레드를 동시에 실행할 수 있다.
- JVM은 메모리 영역을 크게 나누어 관리함으로써 메모리 누수를 방지한다.