Language/Java

JVM 메모리 구조

Raconer 2023. 6. 10. 15:52
728x90

소개

JVM(Java Virtual Machine)은 자바 프로그램을 실행하기 위한 가상 머신입니다.
이 블로그 포스트에서는 JVM의 메모리 영역 구조와 각 영역의 역할에 대해 자세히 알아보겠습니다.

  1. 메서드 영역 (Method Area 또는 Class Area)

    • JVM이 시작될 때 생성되며, 모든 스레드가 공유하는 영역입니다.
    • 클래스 파일의 정보, 상수, 메서드 코드 등이 저장됩니다.
    • 클래스 로더에 의해 로딩된 클래스들의 정보와 정적 변수(static variables)가 할당됩니다.
    • PermGen 영역이라고도 불리며, Java 7 이전 버전에서는 PermGen 영역에 존재했지만, Java 8부터는 Metaspace 영역으로 대체되었습니다.
  2. 힙 (Heap)

    • 객체 인스턴스와 배열이 동적으로 할당되는 영역입니다.
    • 가비지 컬렉션(Garbage Collection)의 대상이 되며, 사용하지 않는 객체들은 자동으로 해제됩니다.
    • 모든 스레드가 공유하는 영역이지만, 개별 객체 인스턴스는 해당 객체를 생성한 스레드에 의해 사용됩니다.
    • 힙 영역은 Eden Space, Survivor Space, Old Generation 세 영역으로 구성됩니다.
      1. Eden Space
        • 새로운 객체가 할당되는 공간으로, 초기에는 모든 객체가 여기에 위치합니다.
      2. Survivor Space
        • Eden Space에서 일정 기간 동안 살아남은 객체들이 이동하는 공간입니다.
        • Eden Space와 함께 사용되며, 객체들이 일정 시간을 살아남으면 Old Generation으로 이동하게 됩니다.
      3. Old Generation
        • 장기간 살아남은 객체들이 저장되는 영역입니다.
        • Major GC(또는 Full GC)에 의해 검사 및 정리됩니다.
  3. 스택 (Stack)

    • 각 스레드마다 별도의 스택이 생성되며, 메서드 호출 정보와 지역 변수를 저장합니다.
    • 스택 프레임은 메서드의 호출복귀 시점의 상태를 나타냅니다.
    • 스택 프레임은 메서드 호출 시 생성되고, 메서드 종료 시 제거됩니다.
  4. PC 레지스터 (Program Counter Register)

    • 각 스레드마다 현재 실행 중인 명령의 주소를 가리키는 레지스터입니다.
    • 스레드 간에 전환될 때 다음에 실행될 명령의 위치를 추적하기 위해 사용됩니다.
  5. 네이티브 메서드 스택 (Native Method Stack)

    • 자바 코드 외부에서 실행되는 네이티브 코드를 위한 스택입니다.
    • JNI(Java Native Interface)를 통해 호출되는 네이티브 메서드의 호출 정보를 저장합니다.

이러한 JVM 메모리 구조는 자바 프로그램을 실행하고 관리하는 데 필요한 메모리 영역을 분리하여 효율적인 자원 관리와 메모리 할당을 가능하게 합니다.
이를 통해 자바 프로그램은 메모리 사용량을 최적화하고 안정적으로 실행될 수 있습니다.

이렇게 JVM의 메모리 영역 구조를 이해하면 자바 프로그램의 메모리 사용과 관련된 문제를 해결하고 성능을 향상시킬 수 있습니다.
다음 글에서는 각 영역별로 발생할 수 있는 문제와 관련된 최적화 기법에 대해 더 자세히 알아보겠습니다.

728x90