[Java] 자바 메모리 구조

이지원·2024년 5월 27일

Java Study

목록 보기
6/9

자바 메모리 구조

  • 메모리 구조에 대해서 왜 알고 있어야 할까?

    형식적인 이유로는 성능 최적화, 디버깅 및 문제해결, 자원 관리 등 여러 이유가 있을 수 있지만 내가 생각하는 메모리 구조에 대해 알고 있어야 하는 이유는 앞으로 공부하게 될 static 과 final 그리고 다형성을 제대로 이해하기 위해서는 메모리 구조를 정확하게 이해하고 있어야 가능하다고 생각한다. 따라서, 앞으로 나아가기 위한 계단을 걷기위한 단계이기 때문에 꼭 이해하고 넘어가야 한다.

  • 자바 메모리 구조

    자바 메모리 구조는 3개의 영역으로 나눌 수 있다.

    • 메서드 영역 : 클래스 정보를 보관하는 영역이다.
    • 스택 영역 : 실제 프로그램이 실행되는 영역이다.
    • 힙 영역 : 객체(인스턴스)가 생성되는 영익이다.
  • 메서드 영역
    메서드 영역은 프로그램을 실행하는데 필요한 공통 데이터를 관리한다. 이 영역은 프로그램의 모든 영역에서 공유한다.

    • 클래스 정보 : 클래스의 실행 코드(바이트 코드), 필드, 메서드와 생성자 코드등 모든 실행 코드가 존재한다.
    • static 영역 : static 변수들을 보관한다.
    • 런타임 상수 풀 : 프로그램을 실행하는데 필요한 공통 리터럴 상수를 보관한다.
  • 스택 영역
    자바 실행 시, 하나의 실행 스택이 생성된다. 각 스택 프레임은 지역 변수, 중간 연산 결과, 메서드 호출 정보 등을 포함한다.

    • 스택 프레임 : 스택 영역에 쌓이는 네모 박스가 하나의 스택 프레임이다. 메서드를 호출할 때 마다 하나의 스택 프레임이 쌓이고, 메서드가 종료되면 스택 프레임이 제거된다.

    • 위에서 자바 실행 시, 하나의 실행 스택이 생성된다고 하였는데 이는 메인 스레드가 하나 생성된 것과 같은 의미이다. 다시 말해, 스레드가 한개 추가 될 때마다 하나의 스택 영역에 추가로 생성 된다.

    • 이 후, 스레드에 대해 학습할 때 더욱 자세히 설명할 예정이다.

  • 힙 영역
    객체(인스턴스)와 배열이 생성되는 영역이다. 가비지 컬렉션(GC)이 이루어지는 주요 영역이며, 더 이상 참조되지 않는 객체는 GC에 의해 제거된다.

    • 위의 그림을 보면, 스택 프레임에 인스턴스의 메서드를 호출한 모습으로 가정해보자. 이후 Data 인스턴스가 추가 되었을 때, 어떤 인스턴스의 메소드를 호출했는지 기억하기위해, 해당 인스턴트의 참조값을 스택 프레임 내에 저장한다. 이 것이 인스턴스 내에서 사용되는 this이다.
  • 각 영역에서의 변수 위치
    마지막으로 변수 종류를 알아보고 어떤 영역에 올라가는지 보면서 이해를 해보겠다.

    • static 변수 (클래스 변수) : 각 변수에 대한 자세한 설명은 다음 static 학습에서 설명할 예정이다. 변수의 저장 위치를 보면 메서드 영역에 있는 Static 영역에 저장되고 프로그램이 종료 될 때 사라진다.
    • Instance 변수 : 클래스 영역에서 static이 붙지 않은 객체가 생성될 때 생기는 변수로 변수의 저장 위치는 힙 영역의 객체 내에서 저장되며 GC에 의해 객체가 사라질 때 같이 변수도 사라진다.
    • Local 변수 : 메서드 내부에서 선언되어 있어, 스택 영역의 스택 프레임 내에서 저장되며 블록을 벗어날 때 (메서드가 종료 될 때) 같이 사라진다.
profile
백엔드 개발자취

0개의 댓글