
JVM의 메모리구조는 Method Area, Heap, Stack, PC Registers, Native Method Stack으로 구성되어 있습니다.
Mehod Area와 Heap영역은 모든 쓰레드가 공유하는 영역이고 Stack, Native Method Stack, PC Register는 스레드 별로 각각 갖고 있습니다.
JVM의 ClassLoader는 class정보를 Method Area에 동적 로딩을 한다고 했었는데, 동적로딩으로 올려지기 때문에 불필요한 바이트 코드를 제외한 프로그램을 실행하는데 필요한 데이터들이 모여있는 영역이라고 할 수도 있습니다.
클래스, 인터페이스의 코드, 상수, 메서드, 정적변수 등이 저장됩니다.
- Type Information
- Type명 : package name + Class name
- Type종류 : Type이 Class인지 Interface인지
- Type 제어자 : 접근제어자
- 연관된 Interface정보
- Runtime Constant Pool : Type의 상수 정보를 저장하는 Pool입니다.
- Field Information : 인스턴스 변수의 정보
- Type명 : 인스턴스 변수의 타입
- 제어자
- Method Information : 메서드의 모든정보
- Method 명
- Method 반환타입
- Method parameter 정보
- Class Variable : static 키워드로 선언된 변수 저장

인스턴스가 생성되는 공간으로 위와 같이 GC가 관리하는 공간입니다. 실행엔진 게시글에서 설명하듯, G1 GC부터는 Region으로 관리합니다.
Heap영역이 가득차게 된다면 OutOfMemoryError가 발생합니다.
스레드의 제어를 위해 사용되는 메모리 영역이빈다.
각 스레드는 스레드별로 메모리가 할당되어 있기 때문에, 동시성 문제에서 자유롭다는 특징이 있습니다.
스레드가 Method를 호출하면 메서드 호출 주소, 매개변수, 지역변수, 연산 스택이 Frame단위로 Stack에 저장됩니다.
객체의 경우 Stack 영역에는 Heap영역에 생성되어 있는 데이터의 참조값이 할당이 되고, 원시타입의 데이터는 참조값이 아닌 실제 값이 할당됩니다.
메서드가 끝나면 시작할 때 저장했던 지역변수를 삭제하기 때문에 메서드 외부에서 사용할 수 없는 것입니다.
Java Stack영역이 가득차게 되면, StackOverFlowError가 발생됩니다.
Stack에는 왜 GC가 없는가? -> 함수 호출이나, 메서드 종류 등의 이벤트 발생으로 인하여 메모리를 회수하기 때문에 Heap과 같이 GC가 불필요합니다.
현재 실행 중인 명령어의 주소를 저장하는 역할을 합니다.
멀티 스레드 환경에서 스레드가 작업을 하다가 중단되고 다시 시작할 때, 이전 작업에 이어서 실행해야하기 때문입니다.
Java 외의 언어로 작성된 네이티브 코드(C 혹은 C++)를 위한 stack이다.
네이티브 메서드 스택은 네이티브 메서드 호출 시 인수, 지역 변수, 리턴 값 등을 저장한다.
자바 코드와 네이티브 코드 간의 상호작용을 지원하기 위해 필요하다.
이를 통해 자바 언어의 간결성과 이식성을 유지하면서도 네이티브 코드를 활용하여 하드웨어나 운영체제에 특화된 작업을 수행할 수 있다.
예를 들어, 네이티브 메서드를 사용하여 그래픽 처리, 네트워크 통신, 파일 시스템 접근 등의 작업을 자바 프로그램에 통합할 수 있다.
[참조]