온라인 스터디 1주차 JVM이란? 문항에서 조금만 더 알아보자! 하는 생각으로 정리하는 Runtime Data Area!! GC랑 같이 내용 정리한다.
자바 메모리 구조(Runtime Data Area) 란?
1. 정의
- Runtime Data Area = JVM이 프로그램 수행을 위해 OS로부터 할당받은 메모리 영역
- 자바 소스 코드를 ---- 컴파일 ----> byte code 로 바꾸고, 이 바이트 코드를 JVM으로 실행하는 과정에서, 코드가
Runtime Data Area 영역에서 실행되는데,
- 이때, OS가 JVM에 할당한 메모리 영역에 맞게 코드가 분배되고 실행된다.
2. 구분
- Runtime Data Area는 [스레드 별로 생성되는 메모리 영역] + [모든 스레드가 공유하는 메모리 영역]으로 나뉘고,
-> 스레드 별로 생성되는 메모리 영역 = PC Register + JVM Stack + Native Method Stack
-> 모든 스레드가 공유하는 메모리 영역 = Heap + Method Area 로 구분된다.
스레드 별로 생성되는 영역 | PC Register | |
JVM Stack | ||
Native Method Stack | Runtime Constant Pool | |
모든 스레드가 공유하는 영역 | Heap | Eden |
Survivor 1 | ||
Survivor 2 | ||
Old | ||
Permanent | ||
Method Area | Runtime Constant Pool | |
스레드 별로 생성되는 메모리 영역
1. PC Register
(1) PC Register 개념
1) 현재 실행중인 JVM의 명령 주소(Program Counter)를 가지고 있는 영역
2) Java의 PC Register는 CPU 내의 기억장치인 레지스터와는 다르게 작동
+ ) 프로그램의 실행은, CPU에서 명령어(Instruction)를 수행하는 과정으로 이루어지고,
Instruction을 수행하는 동안 -> 필요한 정보를 -> 레지스터(CPU 내의 기억장치)에 저장
3) Register-Base가 아닌 Stack-base로 작동
-> 그러나, Native method를 실행할 때는 사용되지 않는다.
- 즉, Native Method를 수행하면 -> PC Register는 Undefined 상태가 되고,
- PC Register에 저장되는 Instruction 주소는 [Native Pointer or Method Bytecode]
-> Native Method를 수행할 때에는 -> JVM을 거치지 않고 -> API를 통해 바로 수행하게 된다.
-> Java는 Platform에 종속받지 않는다는 것을 보여준다.
2. JVM Stack
(1) Java Virtual Machine Stack 개념
1) JVM Stack의 생성
- Thread의 수행 정보를 Frame을 통해 저장
- Thread가 시작될 때 생성 -> 각 Tread 별로 생성 및 다른 Thread 접근 불가
2) Method 호출과 종료 시점
- Method 호출 -> Method 와 Method 정보가 Stack에 쌓이고,
- Method 호출 종료 -> Stack Point에서 제거
- Method 정보 : Method의 매개변수, 지역변수, 임시변수, 어스레드(메소드를 호출한 주소) 등을 저장 '
-> Method 종료 시 메모리 공간 제거
3. Native Method Stack
(1) Native Method Stack 개념
- Java 이외의 언어로 작성된 네이티브 코드를 수행하기 위한 Stack
-> JNI(Java Native Interface)를 통해 호출되는 C/C++ 등의 코드 수행을 위한 Stack
- Application에서 Native Method 호출 -> Native Method Stack에서 새로운 Stack Frame 생성해 -> Push
-> JVM 내부에 영향을 주지 않기 위해 JNI를 이용
모든 스레드가 공유하는 메모리 영역
1. Heap
(1) Heap Area(힙 영역) 개념
- JVM이 관리하는 프로그램에서 데이터를 저장하기 위해 '런타임시 동적으로 할당' 하여 사용하는 영역
- New 연산자로 생성된 객체, 인스턴스와 배열 저장
- 힙 영역에 생성된 객체나 배열은 스택 영역의 변수나 다른 객체의 필드에서 참조
- 참조하는 변수나 필드가 X -> GC(Garbage Collector)의 대상이 된다.
(1) Heap Area(힙 영역) 구분
데이터 종류 | 설명 |
Eden(Youg Generation) | 1) 객체 생성 시 처음으로 저장되는 공간 2) 일정 시간이 지나, Enden 공간이 꼭 차는 경우 -> 해당 데이터는 Survivor 1 로 복사 & Minor GDd쓸모없는 데이터 삭제 |
Survivor 1 & 2 (Young Generation) |
1) Eden에서 살아남은 데이터의 옮겨짐 2) Eden 공간이 꽉 차면 데이터가 넘어오고 & 공간 부족 시 쓸모없는 데이터는 -> Minor GC에 의해 삭제되고 -> Old 로 데이터를 보냄. |
Old (tenured generation) |
1) Young Generation에서 살아남은 객체가 저장되는 곳 2) Old 영역은 오래 사용하고 & 크기가 튼 객체가 대부분 3) 이 Old 공간이 꽉 차면 Minor 가 아닌 Major GC 실행 -> Major GC는 객체들이 살아있는 여부 파악을 위해, 모든 Thread의 실행 멈춤. Headp 정리 -> Minor GC에 비해 자원/시간 많이 소모 |
Permanent | 1) 보통 Class의 meta 정보, method 의 meta, static 정보와 상수 정보 저장 2) Java 8 ~ : Meta Space(OS가 관리) 영역이 되어 Native 모데링 영역으로 넘어감 -> but, Static Object는 Heap 영역으로 옮겨짐. |
2. Method Area
(1) Method Area 개념
- 클래스 파일을 Class Loader로 읽어 -> 클래스 별로 런타임 상수 풀, 필드 데이터, 메소드 데이터, 메소드 코드, 생
성자 코드 등을 분류해서 저장
- 인스턴스 생성을 위한 객체 구조, 생성자, 필드 등이 저장
- 정적 변수 & 정적 멤버 변수(static 변수)가 Method Area에 저장
-> 프로그램 시작 ~ 종료까지 메모리에 남아 있음
-> 따라서, 전역 변수가 프로그램 종료까지 어디서든 사용 가능
(2) Method Area 에서 저장하는 데이터
데이터 종류 | 설명 |
Type Information(타입 정보) | |
Runtime Constant Pool (런타임 상수 풀) |
|
Field Information(필드 정보) | |
Method Information(메서드 정보) | |
Class Variable(클래스 변수) |
(작성중)
참고
- https://naruu098.tistory.com/76
- https://tecoble.techcourse.co.kr/post/2021-08-09-jvm-memory/