JVM 메모리 구조에 대해 설명해보자

이미지는 JVM Memory 구조와 관련이 없습니다.

  • JVM 메모리 구조는 JVM에서 프로그램이 실행될 때 데이터를 효율적으로 관리하기 위해 나누어진 영억이다. 각 영역은 특정한 역할과 특징을 가지마 애플리케이션의 안정적 실행을 보장한다.

1. Method Area

  • 메소드 영역은 클래스와 관련된 메타데이터, 즉 프로그램의 구조적 정보를 저장하는 영역이다.
  • JVM이 실행되는 동안 공유 메모리 영역으로 사용된다.
  • 저장 내용
    • 클래스 메타데이터: 클래스 이름, 부모 클래스 정보, 인터페이스, 메소드, 필드 등.
    • Static 변수: 클래스 로드 시 초기화되는 정적 변수.
    • Constant Pool(상수 풀): 문자열 상수나 메소드/필드 참조와 같은 상수 정보를 저장.
    • 바이트코드: 각 메소드의 실제 실행 코드.
  • 특징
    • 모든 Thread에서 공유함.
    • JVM이 시작될 때 초기화되고, 종료될 때까지 유지된다.

2. Heap Area

  • 객체와 배열이 동적으로 생성되고 저장되는 메모리 영역.
  • JVM에서 가장 큰 메모리 영역. Garbage Collector에 의해 관리됨.
  • 저장 내용
    • 객체: new 키워드로 생성된 객체.
    • 인스턴스 변수: 객체가 가지고 있는 멤버 변수.
    • 클래스읜 런타임 데이터
  • 구조
    • 힙은 크게 Young GenerationOld Generation 으로 나뉜다.
      1. Young Generation
        • 새로 생성된 객체가 저장되는 영역.
      2. Old Generation
        • Young Generation에서 오래 살아남은 객체가 이동됨.
        • 메모리에서 가장 크고, 주로 긴 생명주기를 가진 객체가 저장됨.
      3. Metaspace(Optional)
        • Java 8 이후 부터 클래스 메타데이터를 관리하는 메모리 공간.
  • 특징
    • 모든 Thread에서 공유함.
    • 메모리가 부족하면 Garbage Collection이 실행됨

3.Stack Area

  • 각 쓰레드마다 독립적으로 생성되는 메모리 영역, 메소드 호출과 관련된 데이터를 관리함.
  • 저장 내용
    • Stack Frame: 메소드 호출 시마다 생성되는 단위.
      • 지역변수: 메소드 내에서 선언된 변수.
      • 매개변수: 메소드 호출 시 전달된 값.
      • 연산 중간 값: 연산 결과 저장.
  • 구조
    • LIFO(Last In, First Out)로 작동
    • 메소드 호출 시 스택 프레임 생성 -> 메소드 종료 시 제거.
  • 특징
    • 각 Thread 마다 독립적으로 생성.
    • 메모리 할당과 해제가 빠름.

4.PC Register

  • 현재 실행 중인 명령어의 조소를 저장하는 메모리 영역
  • JVM의 모든 명령은 순차적으로 실행되기 때문에 이 정보가 필요함
  • 저장 내용
    • 명령어 주소 : 현재 실행중인 JVM 명령어의 메모리 위치
  • 특징
    • 각 Thread 마다 독립적으로 생성
    • Java code 와 Native code 모두에 적용됨.

5. Native Method Stack

  • Java 코드가 아닌, JVM 이 실행하는 네이티브 코드(C, C++)와 관련된 메모리를 관리.
  • JNI(Java Native Interface)를 통해 호출되는 네이티브 메소드에서 사용.
  • 저장 내용
    • 네이티브 메소드의 호출 정보와 실행에 필요한 데이터.
  • 특징
    • 각 쓰레드마다 독립적으로 생성

정리

  1. Method Area: 클래스 메타데이터, static 변수 저장
  2. Heap Area: 객체와 인스턴스 변수 저장
  3. Stack Area: 메소드 호출과 관련된 데이터 저장
  4. PC Register: 현재 실행중인 명령어의 주소 저장.
  5. Native Mtehod Stack: 네이티브 코드 실행과 관련된 메모리.
반응형

+ Recent posts