클래스 멤버 변수의 이름, 데이터 타입, 접근 제어자 정보와 같은 각종 필드 정보들과 메서드 정보, 데이터 Type 정보, Constant Pool, static변수, final class 등이 생성되는 영역
public class Employee {
public static int serialNum = 1000;
public Employee(String name) {
this.name = name;
serialNum++;
}
}
다음과 같은 Employee 클래스가 있다고 한다.
public class EmployeeTest {
public static void main(String[] args) {
Employee Jin = new Employee("Jin");
System.out.println(Jin.serialNum); //1001
Employee Kim = new Employee("Kim");
System.out.println(Kim.serialNum); //1002
System.out.println(Employee.serialNum); //1002
}
}
생성된 여러 객체의 static 변수는 메모리(Method 영역)을 공유한다.
프로그램이 실행(=프로그램이 메모리에 로드 되는 순간)이 되면, 상수, Literal(리터럴), static 변수는 Constatnt Pool에 저장됨
리터럴(literal)이란?
컴퓨터 과학 분야에서 리터럴(literal)이란 소스 코드의 고정된 값을 대표하는 용어다.
예를 들어
String a = "apple";이라고 선언해보자.a라는 변수에apple이라는 값이 할당될 것이다. 이 때 변수a는 메모리에 할당된 공간이다. 그리고apple은a가 할당된 공간에 저장되는 값이다. 이 값 자체를 리터럴이라고 한다.
Heap 영역에는 주로 긴 생명주기를 가지는 데이터들이 저장된다. (대부분의 오브젝트는 크기가 크고, 서로 다른 코드블럭에서 공유되는 경우가 많다)
모든 Object 타입(Integer, String, ArrayList, ...)은 heap 영역에 생성된다.
몇개의 스레드가 존재하든 상관없이 단 하나의 Heap 영역만 존재한다.
Heap 영역에 있는 오브젝트들을 가리키는 레퍼런스 변수가 stack에 올라가게 된다.
지역변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값 등이 생성되는 영역입니다.
List<String> listArgument = new ArrayList<>();
listArgument.add("yaboong");
String value = listParam.get(0);
listParam.add("io");
System.out.println(value);
실제 Heap 에 생성된 리스트 객체는 단 1개이다. 하지만 Stack에 쌓인 참조 변수는 여러개 일 수 있다.
Thread가 생성될 때마다 생성되는 영역으로 프로그램 카운터, 즉 현재 스레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역입니다.
자바 이외의 언어(C, C++, 어셈블리 등)로 작성된 네이티브 코드를 실행할 때 사용되는 메모리 영역으로 일반적인 C 스택을 사용합니다.
보통 C/C++ 등의 코드를 수행하기 위한 스택을 말하며 (JNI) 자바 컴파일러에 의해 변환된 자바 바이트 코드를 읽고 해석하는 역할을 하는 것이 자바 인터프리터(interpreter)입니다.