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