용어/java

[국비][JAVA] 자바 메모리 영역

줌인. 2024. 5. 28. 20:17

▶ 참고 (자바 메모리와 static 구조)

https://zoooom-in.tistory.com/57

 

[김영한_자바기본][7. 자바 메모리 구조와 static] 자바 메모리 구조 이해 / 스택과 큐 자료 구조(p.1-

메서드 영역: 프로그램의 클래스 정보와 정적 변수를 저장하는 공간 힙 영역: 동적으로 생성되는 객체들을 저장하는 공간 스택 영역: 메서드 호출 및 파라미터를 임시로 저장하는 공간 **메인 메

zoooom-in.tistory.com

 

  특징 저장되는 데이터
스택 영역 (Stack) - 메서드 호출과 관련된 지역 변수 및 매개 변수 저장
- 메서드 호출이 끝나면 자동으로 메모리에서 제거
- LIFO(Last In First Out) 구조를 따름
※ Main 메서드 부분 생각 / 메서드 호출
- 지역 변수
- 매개 변수
힙 영역 (Heap) - 동적으로 생성된 객체와 인스턴스 변수 저장(배열)
- 자바의 가비지 컬렉터(GC)가 사용되지 않는 객체를
  자동으로 메모리에서 해제함
※ new 생성 생각
- 객체
- 인스턴스 변수
메서드 영역 (Method Area) - 클래스 정보, 메서드 코드, static 변수 등이 저장
- 모든 스레드가 공유함
- 클래스 정보
- static 변수

 

[스택 / 힙 / 메서드 영역 예시1]

public class MemoryExample {
    // 메서드 영역: 클래스 변수 (static)
    static int staticVar = 10;

    // 힙 영역: 인스턴스 변수
    int instanceVar = 20;

    public static void main(String[] args) {
        // 스택 영역: 지역 변수
        int localVar = 30;

        // 힙 영역: 객체 생성
        MemoryExample example = new MemoryExample();

        // 스택 영역: 객체의 메서드 호출
        example.display();
    }

    void display() {
        // 스택 영역: 지역 변수
        int displayLocalVar = 40;

        // 메서드 실행 중에 사용되는 인스턴스 변수 (힙 영역에서 가져옴)
        System.out.println("Instance Var: " + instanceVar);
        System.out.println("Display Local Var: " + displayLocalVar);
    }
}

 

[스택 / 힙 / 메서드 영역 예시2]

public class Data {
    // 메서드 영역: 클래스 정보 및 메서드 코드
    private int value; // 힙 영역: 인스턴스 변수

    public Data(int value) {
        // 메서드 영역: 생성자 메서드 코드
        this.value = value;
    }

    public int getValue() {
        // 메서드 영역: 메서드 코드
        return value;
    }

    public static void hello() {
        // 메서드 영역: static 메서드 코드
        System.out.println("hello");
    }
}

public class Main {
    public static void main(String[] args) {
        // 스택 영역: main 메서드의 스택 프레임

        Data data = new Data(3);
        // 힙 영역: new Data(3)로 생성된 Data 객체
        // 스택 영역: data 참조 변수

        System.out.println(data.getValue());
        // 스택 영역: getValue() 메서드 호출

        Data.hello();
        // 스택 영역: hello() 메서드 호출
    }
}

※ 멤버변수는 인스턴스 변수와 static변수를 통칭하는 말

728x90