Java

[JAVA] JVM 메모리 구조 알아보기

teamnova 2025. 3. 2. 20:45
728x90

 

안녕하세요, 

 

오늘은 Java 프로그림이 실행되는 환경인 JVM(Java Virtual Machine)의 메모리 구조에 대해 알아보겠습니다. 

 

 

JVM(Java Virtual Machine)이란?

JVM은 Java 프로그램을 실행하는 가상 머신 입니다. 

 

java 코드는 cpu가 직접 실행할 수 없고, JVM이 바이트 코드로 변환해서 실행합니다. 

따라서 OS관계없이 실행할 수 있습니다. 

JVM은 실행 중 메모리를 관리하고, GC(Garbage Collection)로 불필요한 객체를 정리해 줍니다. 

 

 

JVM 구조

JVM은 크게 3개의 영역으로 나뉩니다. 

1. 클래스 로더(Class Loader) : .class 파일 로드 

2. 런타임 데이터 영역(Runtime Data Area) : java 실행에 필요한 메모리 공간

3. 실행 엔진(Excution engine) : 바이트코드를 실제 CPU 명령어로 변환

 

 

이 중 런타임 데이터 영역 에 대해 자세히 알아보겠습니다. 

 

 

 

런타임 데이터 영역(Runtime Data Area) - JVM 메모리 구조

1) Method Area (메서드 영역)

  • 클래스의 구조 정보(메서드, 변수, static 데이터)가 저장됨
  • static 변수, 상수, 메서드 코드, 인터페이스 정보 등이 들어감
  • JVM이 종료될 때까지 유지됨
  • Heap과 공유되는 영역 → 모든 스레드가 접근 가능
class Car {
    static int wheelCount = 4;  // Method Area에 저장됨 (static 변수)
    String model = "Tesla";  // Heap에 저장됨 (인스턴스 변수)
}

     wheelCount (static 변수) → Method Area에 저장됨
     model (인스턴스 변수) → Heap에 저장됨

 

2) Heap(힙 영역)

  • 객체(인스턴스)와 인스턴스 변수들이 저장됨
  • new 키워드로 생성된 객체가 여기에 저장됨
  • GC(Garbage Collector)가 더 이상 필요 없는 객체를 정리하는 곳
Car car1 = new Car();  // Heap에 저장됨
Car car2 = new Car();  // Heap에 저장됨

        car1, car2 객체는 Heap에 저장됨
        car1.model, car2.model 같은 인스턴스 변수도 Heap에 저장됨


3) Stack(스택 영역)

  • 메서드 호출 시 생성되는 지역 변수(primitive type)와 참조 변수가 저장됨
  • 메서드가 호출될 때마다 **스택 프레임(Stack Frame)**이 생성됨
  • 메서드가 종료되면 자동으로 스택에서 제거됨
void method() {
    int x = 10;  // Stack에 저장됨 (지역 변수)
    Car car = new Car();  // car 참조 변수는 Stack에, 객체는 Heap에 저장됨
}

    x (지역 변수) → Stack에 저장됨
    car (참조 변수) → Stack에 저장됨, 그러나 객체 자체는 Heap에 저장됨

 

 

4) PC Register(PC 레지스터)

  • 현재 실행 중인 JVM 명령어 주소를 저장하는 공간
  • 각 스레드마다 개별적으로 존재함 (스레드별 독립적)
  • 멀티스레드 환경에서 각 스레드의 실행 위치를 추적하는 역할

스레드 A가 method1() 실행 중 → PC Register에는 method1()의 명령어 주소 저장됨
스레드 A가 method2()로 이동 → PC Register 값이 업데이트됨

 

 

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

  • Java가 아닌 네이티브 코드(C, C++) 실행 시 사용되는 메모리 영역
  • JNI (Java Native Interface)를 사용할 때 필요함
public class NativeExample {
    native void callNative();  // C/C++ 코드 실행
}

     callNative() 실행 시 네이티브 메서드 스택을 사용함