Programing Language/Java
[Java] 자바 프로그램 메모리 구조(Java Program Memory Structure)
vinedpillar
2022. 5. 11. 13:14
자바 프로그램 실행 구조
메모리의 구분
- 프로그램이 작동하기 위해서는 메모리(RAM)에 프로그램이 적재되어야 합니다.
- 또한 프로그램 실행 중에 메모리에 데이터가 오르고 내리는 과정을 반복하게 됩니다.
- 이러한 작업을 효율적으로 활용하기 위해 내부를 물리적, 논리적으로 구분하여 사용합니다.
- 자바 프로그램에서는 JVM을 통해 위 그림과 같이 메모리의 영역을 구분하여 사용합니다.
- 클래스 영역 / 힙 영역 / 스택 영역 / 네이티브 메서드 영역 / PC 레지스터 영역
- 클래스 영역 / 힙 영역 / 스택 영역 / 네이티브 메서드 영역 / PC 레지스터 영역
클래스 영역(= 메소드 영역 = 스태틱 영역)
- JVM이 읽어들인 클래스의 상수(final), 클래스 변수(= 스태틱 변수), 인스턴스 변수(= 멤버 변수), 메소드 등을 저장하는 영역입니다.
- Runtime Constant Pool
- 클래스 파일 Contant Pool 테이블에 해당하는 영역
- 클래스와 인터페이스 상수, 필드와 메소드에 필요한 모든 레퍼런스 저장
힙 메모리 영역
- 프로그램에서 사용되는 데이터를 저장하기 위해 동적으로 할당하여 사용하는 영역입니다.
- 인스턴스 값이나 배열 등의 데이터를 저장합니다.
- 힙 영역에 생성된 객체와 배열 등은 스택 영역의 변수나 다른 클래스의 필드에서 참조할 수 있습니다.
- 참조하는 변수나 필드가 없다면 Gabage Collector에게 수집됩니다.
스택 메모리 영역
- 쓰레드마다 하나씩 존재하며, 쓰레드가 시작될 때 할당됩니다,
- 메서드의 정보, 지역 변수, 매개 변수, 연산 중 발생하는 임시 데이터 등이 저장됩니다.
- push와 pop을 이용한 선입후출(First In Last Out) 방식을 사용합니다.
- 기본 타입 변수는 스택 영역에 직접 값을 가지며, 참조 타입 변수는 힙, 클래스 영역의 주소를 가집니다.
네이티브 메소드 스택 영역
- 자바 외의 언어로 작성된 코드(C/C++ 등)를 수행하기 위한 스택 영역입니다.
- JNI(Java Native Interface) 활용합니다.
- 네이티브 메소드의 수행을 위한 정보, 지역 변수, 매개 변수, 임시 데이터 등을 저장합니다.
PC 레지스터 영역
- 자바는 프로그램 실행 시 JVM을 매개하기 때문에 Stack-Base 방식으로 작동합니다.
- CPU에게 연산을 제공하기 위해 버퍼를 두는 공간으로 활용합니다.
- 각각의 스레드 수행 시 PC 레지스터가 생성되고, JVM 명령(Instruction) 주소를 보관합니다.
메모리 별 저장되는 변수의 구분
구분 | 스택 메모리 영역 | 힙 메모리 영역 | 클래스 영역 |
저장되는 변수 유형 |
로컬 변수(lv), 매개 변수(parameter), 리턴 값 등 |
인스턴스 변수(iv) = 멤버 변수(mv), 배열 |
클래스 변수(cv) = 스태틱 변수(sv), 상수(constant) |