jvm의 메모리구조

지훈김·2024년 8월 23일

Java에서 메서드가 저장되는 위치는 JVM(Java Virtual Machine)의 메모리 구조에 따라 결정됩니다. JVM의 메모리 구조는 크게 여러 영역으로 나뉘며, 메서드는 메서드 영역(Method Area)에 저장됩니다. 이 영역은 JVM의 런타임 데이터 영역의 일부로, 클래스 관련 정보와 함께 메서드의 바이트코드도 이곳에 저장됩니다.

JVM의 메모리 구조

Java 프로그램이 실행될 때 JVM은 메모리를 여러 영역으로 나눕니다. 주요 메모리 영역은 다음과 같습니다:

  1. 메서드 영역 (Method Area)
  2. 힙 영역 (Heap Area)
  3. 스택 영역 (Stack Area)
  4. PC 레지스터 (Program Counter Register)
  5. 네이티브 메서드 스택 (Native Method Stack)

1. 메서드 영역 (Method Area)

  • 설명: 메서드 영역은 모든 클래스의 구조, 메서드, 필드에 대한 정보를 저장하는 영역입니다. 또한 정적 변수(static variables)와 초기화된 메서드(클래스 변수 및 메서드)에 대한 메타데이터도 저장됩니다.
  • 저장되는 내용:
    • 클래스 정보 (클래스 이름, 부모 클래스 이름, 메서드, 필드 정보 등)
    • 정적 변수
    • 메서드 바이트코드 (메서드의 실제 실행 코드)
    • 런타임 상수 풀 (런타임 시 상수와 리터럴을 저장하는 영역)
  • 특징:
    • JVM 시작 시 생성되며, JVM이 종료될 때 해제됩니다.
    • 모든 스레드에서 공유되는 영역입니다.
    • 클래스 로딩 시 메모리에 로드되고, 클래스가 언로드될 때 메모리에서 제거됩니다.
    • 메서드 영역은 JVM 내의 메모리 공간 중 유일하게 공유 메모리로 설계되어 여러 스레드가 동일한 클래스를 사용할 수 있게 합니다.

2. 힙 영역 (Heap Area)

  • 설명: 힙 영역은 객체 인스턴스가 저장되는 메모리 공간입니다. 모든 객체와 배열이 이곳에 저장됩니다.
  • 특징:
    • 모든 스레드에서 공유됩니다.
    • 메서드 영역과 마찬가지로 JVM 시작 시 생성되며, JVM이 종료될 때 해제됩니다.

3. 스택 영역 (Stack Area)

  • 설명: 스택 영역은 각 스레드마다 할당되며, 메서드 호출 시 생성되는 프레임(메서드 호출 스택)을 저장합니다.
  • 저장되는 내용:
    • 지역 변수
    • 중간 연산 결과
    • 메서드 호출 순서(스택 프레임)
  • 특징:
    • 각 스레드는 고유한 스택을 가집니다.
    • 메서드 호출 시마다 스택 프레임이 추가되며, 메서드가 종료되면 해당 프레임은 제거됩니다.

4. PC 레지스터 (Program Counter Register)

  • 설명: 각 스레드마다 하나씩 존재하며, 현재 실행 중인 JVM 명령의 주소를 저장합니다.
  • 특징:
    • 각 스레드가 어떤 명령을 실행하고 있는지 추적하는 데 사용됩니다.

5. 네이티브 메서드 스택 (Native Method Stack)

  • 설명: 네이티브 메서드는 자바 이외의 언어로 작성된 메서드를 실행하는 데 필요한 메모리입니다. (예: C, C++ 메서드)
  • 특징:
    • JNI(Java Native Interface)를 통해 호출되는 메서드와 관련된 데이터가 저장됩니다.

메서드가 메서드 영역에 저장되는 이유

  • 공유 메모리: 메서드 영역은 메서드의 코드와 상수 풀을 공유할 수 있는 영역으로 설계되었습니다. 여러 스레드가 동일한 메서드를 호출하더라도 메서드의 코드는 메서드 영역에 단 한 번만 저장됩니다.
  • 효율성: 메서드의 코드는 실행 중 변경되지 않으므로, 모든 스레드가 동일한 코드에 접근하여 실행할 수 있습니다. 이는 메모리 사용을 효율적으로 만들고, 코드 캐싱 및 성능 향상을 가능하게 합니다.

메서드 실행 시의 동작

  1. 클래스 로딩: 클래스 로더(Class Loader)에 의해 클래스가 로딩되면, 메서드 영역에 클래스의 구조 및 메서드가 저장됩니다.
  2. 메서드 호출: 메서드를 호출하면 JVM은 메서드의 바이트코드를 메서드 영역에서 가져옵니다.
  3. 스택 프레임 생성: 스택 영역에서 호출된 메서드에 대한 스택 프레임이 생성됩니다. 이 프레임에는 지역 변수, 중간 계산 결과, 호출된 메서드 정보 등이 포함됩니다.
  4. 메서드 실행: PC 레지스터와 스택을 사용하여 메서드의 바이트코드를 실행합니다.
  5. 메서드 종료: 메서드가 종료되면 해당 스택 프레임은 스택에서 제거됩니다.

결론

  • 메서드 영역은 JVM에서 메서드와 관련된 모든 정보(바이트코드 포함)가 저장되는 메모리 영역입니다.
  • 메서드 영역은 클래스 수준에서 공유되므로 여러 스레드가 동시에 접근할 수 있는 장점이 있습니다.
  • 메서드 실행 중 JVM은 메서드 영역에서 바이트코드를 가져와 실행하며, 실행에 필요한 스택 프레임은 각 스레드의 스택 영역에 저장됩니다.

이와 같은 메모리 구조 덕분에 Java 프로그램은 효율적으로 실행되고 메모리를 효과적으로 관리할 수 있습니다.

0개의 댓글