[Java] 메모리 구조
정리
일반적인 프로그램과 자바 프로그램의 구조 비교
JVM의 내부구조
- Java Source
- Java Compiler
- Java 코드를 Byte Code로 변환시켜 주는 기능
- Class Loader
- 프로그램 실행 시에, Class 파일을 메모리(Runtime Data Area)에 적재하는 기능
- Execution Engine
- JVM 메모리 공간에 저장 된 Byte Code를 하나의 명령어 단위로 읽어 들여 실행하도록 해줌.
- Gabage Collector
- 사용하지 않는 객체들을 메모리에서 해제하는 역할
- Runtime Data Area
- JVM 프로그램을 수행하기 위해 OS에서 할당 받은 메모리 공간
JVM의 메모리 구조
Method(Static) Area
- JVM이 읽어들인 클래스와 인터페이스 대한 런타임 상수 풀, 멤버 변수(필드), 클래스 변수(Static 변수), 생성자와 메소드를 저장하는 공간
- 각 데이터는 Runtime Constant Pool을 가진다.
- Runtime Constant Pool
- 메소드 영역에 포함되지만 독자적 중요성이 있다.
- 클래스와 인터페이스 상수, 메소드와 필드에 대한 모든 Reference 값들을 저장
- JVM은 런타임 상수 풀을 통해 해당 메소드나 필드의 실제 메모리 상 주소를 찾아 참조
- 명시적으로 null 선언 시 GC 대상
Heap Area
- 동적으로 생성 된 객체 또는 배열 등을 저장하는 영역
- new 연산자를 통해 생성한 객체
- 객체가 더 이상 쓰지 않거나 명시적으로 null 선언 시 GC 대상
Stack Area
- 메서드 호출 시 Stack 영역에 각각의 메서드를 위한 메모리 할당 됨.
- 호출 된 메서드의 지역변수, 매개변수, 리턴 값 및 연산 값을 임시로 저장하는 공간.
- 사용이 끝나면 Stack 영역에서 해제
- 선입후출(FILO) 구조
- 기본(원시)타입 변수는 스택 영역에 직접 값을 가진다.
PC Register
- Program Counter
- Thread가 생성될 때마다 생성되는 공간
- 현재 실행되는 부분의 명령과 주소를 저장
- 현재 실행되고 있는 명령이 종료되면 카운트 값을 증가시켜 다음 명령을 실행하게 함
Native Method Area
- Java 외 언어(C, C++ 등)을 수행하기 위한 Stack 영역
- 프로그램 도중 호출 된 메서드가 Native 방식을 사용하는 메소드 일 경우, 이 영역에 저장되어 처리
참고