[Java] 필드와 메모리 영역

전우석·2024년 3월 19일

Java

목록 보기
14/24

필드와 메모리 영역

필드

클래스 또는 객체의 상태를 저장하는 변수, 정적(Static) 필드와 인스턴스(Instance) 필드로 나뉜다.

정적 필드(Static Field)

클래스 레벨에서 관리되는 변수로, 클래스의 모든 인스턴스에 의해 공유

  • 정적 필드는 프로그램이 시작될 때 생성되고, 프로그램이 종료될 때 소멸한다.
  • 정적 필드는 메소드 영역에 저장되며, 이 영역은 클래스 정보와 함께 클래스 변수(정적 필드)를 저장한다.

인스턴스 필드(Instance Field)

객체 레벨에서 관리되는 변수로, 특정 인스턴스에 속함

  • 각각의 객체 인스턴스는 자신만의 인스턴스 필드 복사본을 가진다.
  • 인스턴스 필드는 객체가 생성될 때 힙 영역에 할당된다.

필드 정리

구분관리생성 시점저장 위치
정적(static) 필드- 클래스 레벨에서 관리
- 해당 클래스의 모든 인스턴스가 접근 가능
프로그램 시작 시 생성메소드 영역
인스턴스 필드- 객체 레벨에서 관리
- 해당 인스턴스만 접근 가능
객체가 생성될 때 생성힙 영역

메모리 영역

Java의 메모리 영역은 영역, 힙(Heap) 영역, 스택(Stack) 영역, 그리고 메소드(Method) 영역으로 이루어진다.

영역(Heap Area)

JVM의 가장 큰 메모리 영역으로, 모든 객체배열이 동적으로 할당되는 곳이다.

  • 힙 영역은 런타임에 인스턴스가 생성될 때 사용된다.
  • 힙 영역은 JVM에 의해 동적으로 할당 및 해제가 이루어진다.
  • 힙 영역은 Java 프로그램이 실행되는 동안 가비지 컬렉터에 의해 계속해서 관리된다.
    • 가비지 컬렉터는 힙 영역에서 더 이상 참조되지 않는 객체들을 정기적으로 검사하여, 메모리를 자동으로 회수한다.

힙 영역의 구조

힙 영역은 구조적으로 여러 부분으로 나뉘어 가비지 컬렉션을 수행한다.

  • Young Generation: 새로 생성된 대부분의 객체가 위치하는 곳
  • Old Generation: Young Generation에서 충분히 생존하여 오래된 객체들이 저장되는 곳
  • Metaspace: 클래스 메타데이터를 저장하는 영역

스택 영역(Stack Area)

각 스레드마다 존재하며, 해당 스레드에 대한 런타임 스택을 관리하는 곳

  • 스택 영역에서는 메소드 호출로컬 변수를 처리한다.

스택 영역의 구조

스택 영역은 내부에 스택 프레임을 가지고 있다.

  • 스택 영역은 LIFO(Last In First Out) 방식으로 작동하며, 메소드 호출의 순서대로 스택이 구성되고 해제된다.
    • 메소드 호출 시 해당 메소드의 스택 프레임이 스택에 푸시(push)된다.
    • 메소드가 종료되면 팝(pop)된다.
  • 메소드가 호출될 때마다, 메소드의 매개변수, 지역 변수, 반환 값 및 연산 중간 결과 등을 저장하기 위한 스택 프레임이 생성된다.
    • 스택 프레임 내에는 로컬 변수와 메소드 관련 정보가 저장된다.
    • 이 영역은 메모리 할당 및 해제가 매우 빠르게 이루어지지만, 크기가 고정되어 있다. 따라서 스택 오버플로우(stack overflow)가 발생할 위험이 있다.
    • 메소드 실행이 종료되면, 해당 스택 프레임은 스택에서 제거된다.

메소드 영역(Method Area)

모든 클래스의 구조(메소드 코드, 변수 이름, 데이터 타입 등)를 저장하는 곳

  • 메소드 영역에는 정적 변수클래스가 로드될 때의 정보(예: 바이트코드)가 저장된다.
  • 메소드 영역은 영역은 JVM이 시작할 때 생성되고, 모든 스레드가 공유한다.

메소드 영역 구조

메소드 영역은 모든 스레드에 의해 공유되는 JVM 메모리의 일부이다.

  • 메소드 영역은 클래스 로더에 의해 클래스인터페이스최초로 참조될 때 이들을 로드, 링크, 초기화하는 데 사용된다.
  • 이 영역에는 런타임 상수 풀(runtime constant pool), 필드와 메소드 데이터, 메소드와 생성자의 코드, 특수 메소드(예: 인터페이스의 초기화 메소드) 등이 포함된다.
  • 메소드 영역은 프로그램의 실행 과정에서 사용되는 클래스들의 구조적인 정보를 보관한다.
    • 이 정보를 바탕으로, JVM이 객체를 생성하고 메소드를 호출한다.

메모리 영역 정리

구분저장 데이터생성 시점 및 공유 여부특징
힙 영역- 객체 인스턴스
- 배열
- 런타임에 동적으로 할당 및 해제
- JVM 전체에서 공유
- JVM의 가장 큰 메모리 영역
- 가비지 컬렉터에 의해 메모리 관리가 일어나는 영역
스택 영역- 메소드 호출 정보 및 중간 연산 결과
- 지역 변수
- 메소드 호출 시점에 생성
- 스레드마다 보유
- 메소드들이 후입선출(LIFO) 방식으로 실행된다.
- 스택 프레임은 매우 빠르지만, 크기가 고정되어 있어 오버플로우 발생 위험이 있다.
메소드 영역- 클래스 및 인터페이스 구조
- 정적(static) 변수
- JVM 시작 시 생성
- 모든 스레드가 공유
- 클래스와 인터페이스가 최초로 참조될 때 이들을 초기화한다.
- 메소드 영역의 정보를 바탕으로, JVM이 객체를 생성하고, 메소드를 호출한다.

0개의 댓글