[Java] 스택 영역과 힙 영역

코드 속의 "진돌"·2024년 2월 20일
0
post-thumbnail

✅ 스택 영역과 힙 영역


스택 영역과 힙 영역이 함께 사용되는 경우를 알아보자.

✏️ Data

package memory;

public class Data {
  private int value;

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

  public int getValue() {
    return value;
  }
}



✏️ JavaMemoryMain2

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");
  }
}
  • main()method1()method2() 순서로 호출하는 단순한 코드다.
  • method1()에서 Data 클래스의 인스턴스를 생성한다.
  • method1()에서 method2()를 호출할 때 매개변수에 Data 인스턴스의 참조값을 전달한다.



🖥️ 실행 결과



⚙️ 실행 과정

  • main() 메서드를 실행한다. main() 스택 프레임이 생성된다.

  • main()에서 method1()을 실행한다. method1() 스택 프레임이 생성된다.
  • method1()은 지역 변수로 Data data1을 가지고 있다. 이 지역 변수도 스택 프레임에 포함된다.
  • method1()new Data(10)을 사용해서 힙 영역에 Data 인스턴스를 생성한다. 그리고 참조값을 data1에 보관한다.

  • method1()method2()를 호출하면서 Data data2 매개변수에 x001 참조값을 넣는다.
  • 이제 method1()에 있는 data1method2()에 있는 data2 지역 변수(매개변수 포함)는 둘 다 같은 x001 인스턴스를 참조한다.

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

  • method1()이 종료된다. method1()의 스택 프레임이 제거되면서 지역 변수 data1도 함께 제거된다.

  • method1()이 종료된 직후의 상태를 보자. method1()의 스택 프레임이 제거되고 지역 변수 data1도 함께 제거되었다.
  • 이제 x001 참조값을 가진 Data 인스턴스를 참조하는 곳이 더는 없다.
  • 참조하는 곳이 없으므로 사용되는 곳도 없다. 결과적으로 프로그램에서 더는 사용하지 않는 객체인 것이다.
  • GC(가비지 컬렉션)은 이렇게 참조가 모두 사라진 인스턴스를 찾아서 메모리에서 제거한다.

참고 : 힙 영역 외부가 아닌, 힙 영역 안에서만 인스턴스끼리 서로 참조하는 경우에도 GC의 대상이 된다.



📚 정리

지역 변수는 스택 영역에, 객체(인스턴스)는 힙 영역에 관리된다.

profile
매일 성장하는 주니어 개발자의 기록📝

0개의 댓글