본문 바로가기
Java

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

by teamnova 2025. 3. 2.
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() 실행 시 네이티브 메서드 스택을 사용함