JVM Stack & Heap에 대해서

혼빈·2024년 9월 15일

JVM Stack과 Heap 이해하기

자바 애플리케이션을 실행할 때, JVM(Java Virtual Machine)은 메모리를 관리하는 두 가지 주요 영역인 Stack과 Heap을 사용합니다. 이 두 영역은 자바 프로그램의 실행 및 성능에 큰 영향을 미치기 때문에, 이들 각각의 역할과 동작 방식을 이해하는 것이 중요합니다.

1. JVM Stack

JVM Stack은 각 스레드가 실행될 때 사용되는 메모리 영역입니다. 스택은 메소드 호출과 관련된 정보를 저장하는 데 사용됩니다.

주요 특징

  • 메소드 호출과 로컬 변수: 각 스레드가 시작될 때 JVM은 해당 스레드에 대해 스택을 생성합니다. 메소드 호출 시, 메소드에 대한 정보와 로컬 변수가 스택에 저장됩니다.
  • LIFO 구조: 스택은 Last In First Out(LIFO) 방식으로 작동합니다. 즉, 가장 최근에 저장된 데이터가 가장 먼저 제거됩니다.
  • 정적 크기: 스택의 크기는 스레드가 생성될 때 설정되며, 스택의 크기를 초과하면 StackOverflowError가 발생합니다.
  • 스레드 독립성: 각 스레드는 별도의 스택을 가지므로, 스레드 간에 스택 데이터는 공유되지 않습니다.

예시

public class StackExample {
    public static void main(String[] args) {
        methodA();
    }

    public static void methodA() {
        methodB();
    }

    public static void methodB() {
        // 메소드 호출에 따른 스택 프레임 생성
    }
}

위의 예시에서 methodA와 methodB의 호출이 스택에 저장되며, 각 메소드 호출 시 새로운 스택 프레임이 생성됩니다.

2. JVM Heap

JVM Heap은 자바 객체와 배열이 저장되는 메모리 영역입니다. 모든 자바 객체는 힙 메모리에 할당되며, 가비지 컬렉터가 메모리를 관리합니다.

주요 특징

  • 동적 할당: 객체가 생성될 때, JVM Heap에서 메모리가 동적으로 할당됩니다.
  • 자동 메모리 관리: 가비지 컬렉터가 사용되지 않는 객체를 자동으로 제거하여 메모리 누수를 방지합니다.
  • 크기 조절 가능: JVM Heap의 크기는 실행 시 조정할 수 있으며, -Xms와 -Xmx 옵션으로 초기 및 최대 힙 크기를 설정할 수 있습니다.
  • 스레드 공유: 모든 스레드는 동일한 힙 메모리를 공유하므로, 객체는 여러 스레드 간에 공유될 수 있습니다.

예시

public class HeapExample {
    public static void main(String[] args) {
        MyObject obj = new MyObject();
    }
}

class MyObject {
    int value;

    public MyObject() {
        this.value = 10;
    }
}

위의 예시에서 MyObject 클래스의 인스턴스는 힙 메모리에 할당됩니다. obj 변수는 힙에 저장된 객체를 참조하게 됩니다.

Stack과 Heap의 차이점

FeatureStackHeap
용도메소드 호출 및 로컬 변수 저장자바 객체 및 배열 저장
메모리 구조LIFO (Last In, First Out)동적 할당, 자동 관리
메모리 크기정적 크기조절 가능 (-Xms, -Xmx 옵션)
스레드스레드 별로 독립적모든 스레드 간 공유

결론

JVM Stack과 Heap은 자바 프로그램의 메모리 관리에서 핵심적인 역할을 합니다. Stack은 메소드 호출과 로컬 변수를 관리하고, Heap은 자바 객체를 저장합니다. 각 영역의 특성을 이해함으로써 메모리 관리와 성능 최적화에 도움을 줄 수 있습니다.

자바 애플리케이션을 개발할 때, Stack과 Heap의 작동 방식을 잘 이해하는 것이 중요하며, 이를 통해 보다 효율적이고 안정적인 애플리케이션을 개발할 수 있습니다.

profile
코딩중

0개의 댓글