자바의 메모리 구조는 다음과 같이 크게 세 가지 영역으로 나뉘어집니다.
자바 프로그램이 실행되면, JVM은 아래 세 영역을 생성하고 메모리를 관리합니다.
이렇게 분리된 메모리 구조는 자바의 안정성과 자동 메모리 관리를 가능하게 합니다.
1. 메소드 영역 (Method Area 또는 클래스 영역):
- 모든 스레드가 공유하는 영역으로, 클래스 정보와 클래스 변수(static 변수)가 저장됩니다.
- 클래스 정보는 클래스의 구조와 멤버 변수, 메서드 코드 등을 포함합니다.
- JVM이 실행될 때 클래스 로더에 의해 클래스 파일이 로드되고 파싱되어 메소드 영역에 저장됩니다.
상수 풀(Constant Pool):
- 상수 풀은 클래스 파일 내부에 위치한 특별한 메모리 영역입니다.
- 클래스 파일에는 리터럴 값(문자열, 정수, 부동 소수점 등)이 상수 풀로 저장됩니다.
- 문자열 리터럴과 기본형 데이터 타입의 상수 값들은 상수 풀에 저장되며, 중복된 값을 허용하지 않습니다.
- 상수 풀에 저장된 값은 JVM이 실행되면서 메모리에 로드되며, 상수로 사용되는 값은 JVM 전체에서 공유됩니다.
- 상수 풀에 저장된 값은 변경되지 않으며 불변성(Immutable)을 가집니다.
- 상수 풀은 문자열 리터럴 등을 저장하여 재사용함으로써 메모리 사용을 최적화하는 역할을 합니다.
2. 힙 영역 (Heap Area):
- 객체들이 동적으로 할당되는 공간으로, 인스턴스 변수와 객체들이 저장됩니다.
- new 키워드를 사용하여 객체를 생성하면 힙 영역에 해당 객체의 인스턴스가 생성됩니다.
- 힙 메모리는 JVM 실행 중에 동적으로 할당되고 해제되며, 객체의 크기나 수명은 런타임에 결정됩니다.
- GC(Garbage Collector)에 의해 메모리 관리가 이루어지며, 더 이상 참조되지 않는 객체들은 자동으로 해제됩니다.
3. 스택 영역 (Stack Area):
- 각 스레드마다 별도의 스택이 생성되는 영역으로, 메서드 호출(실행 순서)과 지역 변수들을 저장합니다.
- 스택은 메서드가 호출될 때마다 해당 메서드의 프레임(Stack Frame)이 스택에 할당됩니다.
- 메서드 실행이 끝나면 해당 프레임이 스택에서 제거되어 메모리를 회수합니다.
메소드 영역, 힙 영역, 스택 영역은 자바 프로그램이 실행되는 데 사용되는 메모리 영역들이고,
Native Method Stack Area와 PC Register는 이들과는 다른 목적과 역할을 가지고 있습니다.
4. Native Method Stack Area:
Native Method Stack Area는 네이티브 메서드가 호출될 때 사용되는 메모리 영역입니다.
*자바에서 Native Method는 자바 언어로 작성된 코드가 아닌, 네이티브 언어(C, C++ 등)로 작성된 코드를 말합니다.
자바 언어로 작성된 메서드는 스택 영역에 저장되지만, 네이티브 메서드는 자바 가상 머신(JVM)을 벗어나 네이티브 언어로 작성된 코드를 실행하므로 스택 영역에 저장되지 않습니다.
대신, 네이티브 메서드가 호출될 때마다 별도의 스택 영역인 Native Method Stack Area가 생성되고 해당 메서드의 실행 정보가 저장됩니다.
5. PC Register (Program Counter Register):
PC Register는 현재 실행 중인 스레드의 명령어 주소(Instruction Pointer)를 저장하는 레지스터입니다.
자바 가상 머신(JVM)은 여러 스레드를 동시에 실행하므로, 각 스레드는 별도의 PC Register를 가지고 있습니다.
명령어 주소는 PC Register에 저장되며, 다음에 실행될 명령어 주소를 가리킵니다.
스레드가 메서드를 호출하면 PC Register에 호출된 메서드의 시작 주소가 저장되고, 해당 메서드의 실행이 종료되면 다시 이전 명령어 주소로 복원됩니다.
PC Register는 JVM이 스레드를 관리하고 스레드 스위칭을 수행하는데 사용됩니다.
'Backend > JAVA' 카테고리의 다른 글
[JAVA] 패키지와 클래스 (같은 이름의 클래스 import) (0) | 2023.07.25 |
---|---|
JAVA 문자열 비교 (== 연산자와 equals 메서드의 차이) (0) | 2023.07.25 |
Java 객체 형변환 (mapper.convertValue) (0) | 2023.06.14 |
[JAVA] 자바 외부 파일/ 외부 프로그램/ 명령어 실행 (exec) (0) | 2023.04.26 |
JDBC를 이용한 DB 연결 (Connetion 생성) (0) | 2023.04.24 |