JVM이 운영체제로부터 할당받은 메모리 영역

Stack

  • 지역변수 테이블, 피연산자 스택, 메서드 반환 값 등을 저장
  • 보통 지역변수 테이블을 스택으로 지칭
  • 지역 변수 테이블은 슬롯으로 이루어지며 기본형 변수 하나가 슬록 한 개를 사용
  • 각 스레드가 자체 스택을 가지고 있기에 스레드 안정성을 보장한다.
  • Java 스택의 크기는 메모리 용량이 아니라 슬롯의 개수
  • JVM이 허용하는 스택의 크기를 초과할 경우 StackOverflowError 에러 발생

Runtime constant pool

  • 클래스 버전, 필드, 메서드, 인터페이스 등 클래스 파일에 포함된 정보 및 각종 리터럴, 심볼 참조가 저장되는 영역
  • 클래스 로더가 클래스를 로드할 때 상기 정보들을 저장
  • 동적으로 운영되며 런타임에 새로운 상수가 추가될 수 있음

Heap

  • Java에서 사용되는 객체와 배열이 저장되는 공간이며 GC가 메모리 관리
  • 설정에 따라 크기를 변경하거나 고정 가능
    • 부족 시 OutOfMemoryError 오류 발생
  • 세대 단위 컬렉션 이론을 기반으로 설계 및 운영
  • 핫스팟 VM에서 에덴과 생존자 공간 비율은 보통 8:1
    • 보통 첫 GC에 98%의 객체가 소멸된다.
    • 10%는 메모리 파편화 방지를 위해 활용된다.

모든 쓰레드가 공유하며, 실행 중인 JVM 프로세스에는 오직 하나의 힙만 존재한다.
new 키워드를 통해 동적으로 생성된 인스턴스 객체는 힙에 할당되고 해당 참조는 스택에 저장된다. Heap 영역에 있는 인스턴스를 접근하기 위해서는 Stack에 저장되어 있는 Reference를 통해 접근한다.

Method Area

  • JVM이 읽어 들인 각종 타입 정보, 상수, 정적 변수 정보가 저장되는 영역
  • 힙의 논리적 부분이며 JVM이 시작될 때 생성
  • JIT 컴파일러가 번역한 기계어 코드를 캐싱하기 위한 메모리 공간으로 활용
  • Java 8부터는 PermGen이 아니라 Metaspace에 속함