Java 데이터 영역 구조

JANG SEONG SU·2023년 7월 15일
0

Java

목록 보기
3/10

🔗Java의 데이터 영역

1. Method Area(메소드 영역)

클래스 멤버 변수의 이름, 데이터 타입, 접근 제어자 정보와 같은 각종 필드 정보들과 메서드 정보, 데이터 Type 정보, Constant Pool, static변수, final class 등이 생성되는 영역

1-1. static 변수 예제

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 영역)을 공유한다.

1-2. Constant Pool🖊

프로그램이 실행(=프로그램이 메모리에 로드 되는 순간)이 되면, 상수, Literal(리터럴), static 변수는 Constatnt Pool에 저장됨

리터럴(literal)이란?

컴퓨터 과학 분야에서 리터럴(literal)이란 소스 코드의 고정된 값을 대표하는 용어다.

예를 들어 String a = "apple";이라고 선언해보자. a라는 변수에 apple이라는 값이 할당될 것이다. 이 때 변수 a는 메모리에 할당된 공간이다. 그리고 apple은 a가 할당된 공간에 저장되는 값이다. 이 값 자체를 리터럴이라고 한다.

2.Heap Area(힙 영역)

  1. Heap 영역에는 주로 긴 생명주기를 가지는 데이터들이 저장된다. (대부분의 오브젝트는 크기가 크고, 서로 다른 코드블럭에서 공유되는 경우가 많다)

  2. 모든 Object 타입(Integer, String, ArrayList, ...)은 heap 영역에 생성된다.

  3. 몇개의 스레드가 존재하든 상관없이 단 하나의 Heap 영역만 존재한다.
    Heap 영역에 있는 오브젝트들을 가리키는 레퍼런스 변수가 stack에 올라가게 된다.

3. Stack Area(스택 영역)

지역변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값 등이 생성되는 영역입니다.

예시 코드

List<String> listArgument = new ArrayList<>();
listArgument.add("yaboong");
String value = listParam.get(0);
listParam.add("io");
System.out.println(value);

실제 Heap 에 생성된 리스트 객체는 단 1개이다. 하지만 Stack에 쌓인 참조 변수는 여러개 일 수 있다.

4. PC Register

Thread가 생성될 때마다 생성되는 영역으로 프로그램 카운터, 즉 현재 스레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역입니다.

5. Natvie Method Stack

  1. 자바 이외의 언어(C, C++, 어셈블리 등)로 작성된 네이티브 코드를 실행할 때 사용되는 메모리 영역으로 일반적인 C 스택을 사용합니다.

  2. 보통 C/C++ 등의 코드를 수행하기 위한 스택을 말하며 (JNI) 자바 컴파일러에 의해 변환된 자바 바이트 코드를 읽고 해석하는 역할을 하는 것이 자바 인터프리터(interpreter)입니다.

profile
Software Developer Lv.0

0개의 댓글