본문 바로가기

프로그래밍언어/Java

[Java 기본] 스택 영역과 힙 영역

스택 영역과 힙 영역


 

Data.java

package memory;

public class Data{
    private int value;
    
    public Data(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }
}

 

JavaMemoreMain.java

package memory;

public class JavaMemoryMain2 {

    public static void main(String[] args) {
        System.out.println("main start");
        method1();
        System.out.println("main end");

    }

    static void method1() {
        System.out.println("method1 start");
        Data data1 = new Data(10);
        method2(data1);
        System.out.println("method1 end");
    }

    static void method2(Data data2) {
        System.out.println("method2 start");
        System.out.println("data.value = " + data2.getValue());
        System.out.println("method2 end");
    }
}

=>

1. main()에서 method1()을 실행한다. method1()의 스택 프레임이 생성된다. 

2. method1()은 지역변수로 data1을 가지고 있다. 이 지역변수도 스택프레임에 포함된다. 

3. method2()은 new Data(10)을 사용해서 힙 영역에 data 인스턴스를 생성한다. 그리고 참조값을 data1에 보관한다. 

4. method1()은 method2()를 참조하면서 Data data2의 매개변수에 참조값을 넘긴다. 

5. 이제 method1()에 있는 data1과 method2()에 있는 data2 지역 변수는 둘다 같은 인스턴스를 참조한다. 

6. method2()가 종료되고 스택프레임이 제거되면서 매개변수 data2도 제거된다. 

7. method1()이 종료되고 data1도 제거된다. 

 

=> 이제 Data 인스턴스를 참조하는 곳이 없다. GC(가비지 컬렉션)은 이렇게 참조가 모두 사라진 인스턴스를 찾아서 메모리에서 제거한다. 

 

 

실행결과를 확인해보자. 

 

 

 

* 인프런 '김영한의 실전 자바 - 기본편'을 참고하여 작성하였습니다. 

 

'프로그래밍언어 > Java' 카테고리의 다른 글

[Java 기본] static 메서드  (0) 2024.07.12
[Java 기본] static 변수  (0) 2024.07.10
[Java 기본] 스택 영역  (0) 2024.07.10
[Java 기본] 스택과 큐 자료구조  (0) 2024.07.10
[Java 기본] 자바 메모리 구조  (0) 2024.07.10