728x90
소개
JVM(Java Virtual Machine)은 자바 프로그램을 실행하기 위한 가상 머신입니다.
이 블로그 포스트에서는 JVM의 메모리 영역 구조와 각 영역의 역할에 대해 자세히 알아보겠습니다.
메서드 영역 (Method Area 또는 Class Area)
- JVM이 시작될 때 생성되며, 모든 스레드가 공유하는 영역입니다.
- 클래스 파일의 정보, 상수, 메서드 코드 등이 저장됩니다.
- 클래스 로더에 의해 로딩된 클래스들의 정보와 정적 변수(static variables)가 할당됩니다.
- PermGen 영역이라고도 불리며, Java 7 이전 버전에서는 PermGen 영역에 존재했지만, Java 8부터는 Metaspace 영역으로 대체되었습니다.
힙 (Heap)
- 객체 인스턴스와 배열이 동적으로 할당되는 영역입니다.
- 가비지 컬렉션(Garbage Collection)의 대상이 되며, 사용하지 않는 객체들은 자동으로 해제됩니다.
- 모든 스레드가 공유하는 영역이지만, 개별 객체 인스턴스는 해당 객체를 생성한 스레드에 의해 사용됩니다.
- 힙 영역은 Eden Space, Survivor Space, Old Generation 세 영역으로 구성됩니다.
- Eden Space
- 새로운 객체가 할당되는 공간으로, 초기에는 모든 객체가 여기에 위치합니다.
- Survivor Space
- Eden Space에서 일정 기간 동안 살아남은 객체들이 이동하는 공간입니다.
- Eden Space와 함께 사용되며, 객체들이 일정 시간을 살아남으면 Old Generation으로 이동하게 됩니다.
- Old Generation
- 장기간 살아남은 객체들이 저장되는 영역입니다.
- Major GC(또는 Full GC)에 의해 검사 및 정리됩니다.
- Eden Space
스택 (Stack)
- 각 스레드마다 별도의 스택이 생성되며, 메서드 호출 정보와 지역 변수를 저장합니다.
- 스택 프레임은 메서드의 호출과 복귀 시점의 상태를 나타냅니다.
- 스택 프레임은 메서드 호출 시 생성되고, 메서드 종료 시 제거됩니다.
PC 레지스터 (Program Counter Register)
- 각 스레드마다 현재 실행 중인 명령의 주소를 가리키는 레지스터입니다.
- 스레드 간에 전환될 때 다음에 실행될 명령의 위치를 추적하기 위해 사용됩니다.
네이티브 메서드 스택 (Native Method Stack)
- 자바 코드 외부에서 실행되는 네이티브 코드를 위한 스택입니다.
- JNI(Java Native Interface)를 통해 호출되는 네이티브 메서드의 호출 정보를 저장합니다.
이러한 JVM 메모리 구조는 자바 프로그램을 실행하고 관리하는 데 필요한 메모리 영역을 분리하여 효율적인 자원 관리와 메모리 할당을 가능하게 합니다.
이를 통해 자바 프로그램은 메모리 사용량을 최적화하고 안정적으로 실행될 수 있습니다.
이렇게 JVM의 메모리 영역 구조를 이해하면 자바 프로그램의 메모리 사용과 관련된 문제를 해결하고 성능을 향상시킬 수 있습니다.
다음 글에서는 각 영역별로 발생할 수 있는 문제와 관련된 최적화 기법에 대해 더 자세히 알아보겠습니다.
728x90
'Language > Java' 카테고리의 다른 글
검색이 빠른 자료구조 (0) | 2023.07.12 |
---|---|
버퍼링(Buffering)과 스트림(Stream) (0) | 2023.07.01 |
클래스(class), 객체(object), 인스턴스(instance) 차이 (0) | 2023.04.16 |