https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.5
Method 영역
Class Loader Subsystem
- Class 영역, Static 영역, Code 영역이라고도 불린다
JVM 스펙 상으로는 Method 영역으로 명시되어 있다
- Java 스레드 간 공유되는 공간이다
- 런타임 상수 풀, 멤버 변수(필드), 클래스 변수(static 변수), 생성자와 메소드를 저장
- 클래스 파일의 바이트 코드가 로드되는 공간
- Heap 영역이 아닌 공간
- 2개의 주요 공간으로 분리
- Permanent Generation
- 클래스 정의, 구조, 메소드, 필드, 메소드(데이터 및 코드) 및 상수로부터 클래스 관련 데이터를 저장
- Java 8부터는 PermGen 영역이 제거됨
- Metadata 저장 영역으로 전환됨
- Native 메모리 영역으로 이동되므로써, JVM이 아닌 OS에 의해서 관리
- 개발자가 영역 확보의 상한을 의식할 필요가 없어지게 됨
- static 객체 변수와 상수는 Heap 영역으로 이동됨
- Code Cache
- 컴파일된 코드를 저장
- 컴파일된 코드는 원시 코드(하드웨어 고유)일 뿐이며, JVM에 고유한 JIT 컴파일러가 처리
Stack 영역과 Heap 영역
Stack 영역
- LIFO (Last In First Out)
- 메소드 호출 시마다 각각의 스택 프레임(해당 메소드만을 위한 공간) 생성
- 메소드 안에서 사용되어지는 값들 저장, 호출된 매개변수, 지역변수, 리턴값 및 연산 시 일어나는 값들을 임시로 저장