[Java] 메모리 사용 영역 (Runtime Data Area)

soheeoott·2021년 9월 8일
0

Java

목록 보기
11/12

메모리 사용 영역

Java 프로그램을 실행하면,
JVM(Java Vitrual Machine)은 운영체제로부터 메모리를 할당받는다.
JVM은 이 메모리를 메소드 영역, 힙 영역, 스택 영역으로 구분하여 사용한다.


메소드 영역 (Method Area)

컴파일 된 바이트 코드(.class)들이 저장된다.
이 때, 클래스별로 코드들을 분류하여 저장한다.
◾️ 정적 필드(static field)
◾️ 상수(constant)
◾️ 생성자(constructor)
◾️ 메소드(method) 등

모든 스레드가 공유하는 영역이며, 객체(힙 영역)를 만들거나 변수(스택 영역)를 생성하는 용도로 사용한다.

생성 과정
1. 소스 코드 작성 (.java)
2. 컴파일 : 바이트 코드 파일 생성 (.class)
3. 자바 프로그램을 실행하면 바이트 코드 파일이 메소드 영역에 로딩된다.

loading(로딩) : 바이트 코드 파일을 메소드 영역에 저장

힙 영역 (Heap Area)

객체와 배열이 저장된다.
힙 영역에 생성된 객체와 배열은 JVM 스택 영역의 변수에서 참조한다.
참조를 잃어버린 객체나 배열은 변수가 꺼내올 수 없으므로(사용불가)
자동으로 Garbage Collector(쓰레기 수집기)에 의해 힙 영역에서 제거된다.

JVM 스택 영역 (Stack)

각 스레드마다 하나씩 존재하며 스레드가 시작될 때 할당된다.
메소드를 호출할 때 프레임이 생성되며, 해당 프레임은 메소드가 종료될 때 제거된다.
프레임 내부에는 메소드를 호출할 때 메소드 안에서 사용되는 변수들이 저장된다.
프레임은 메소드가 실행될 때만 존재하며, 추가된 프레임은 stack 형태(위-아래)로 쌓인다.

[Java] 기본 타입과 참조 타입의 차이점과 관련

기본 타입의 스택 영역
변수는 선언된 블록 안에서만 존재하며, 선언된 블록이 끝나면 소멸된다.
선언된 블록이 아닌 외부에서 사용할 수 없다.


void method() {
    // ①
    char var1 = 'A';
	
    // ②
    if (var1 == 'A') {
        int var2 = 100;
        double var3 = 3.14;
    } // 선언된 블록이 끝나면 소멸

    // ③
    boolean var4 = true;
}

참조 타입의 스택 영역
변수는 스택 영역에 생성되지만, 배열의 데이터는 힙 영역에 생성되므로 소멸되지 않는다.

void method() {
    int[] scores = {10, 20, 30};
}

혼공자 강의를 기반으로 작성하였습니다. 🙏
20강

profile
📚 글쓰는 습관 들이기 📚

0개의 댓글