포스트

JAVA (21) - 메모리 구조(Stack vs Heap)

JAVA (21) - 메모리 구조(Stack vs Heap)

1. 개요

자바 애플리케이션을 효율적으로 개발하고 메모리 누수를 방지하기 위해서는 JVM(Java Virtual Machine)의 메모리 관리 방식을 이해해야 한다. JVM 메모리 영역은 크게 스태틱(Static), 스택(Stack), 힙(Heap) 영역 등으로 나뉜다. 그중에서도 프로그램 실행 시 데이터 저장과 할당이 가장 활발하게 일어나는 핵심 영역이 바로 StackHeap이다.

2. Stack 영역의 개념과 특징

Stack 영역은 메서드 호출 시 생성되는 스레드(Thread)별 전용 메모리 공간이다. 정적(Static) 메모리 할당 방식을 사용하며, LIFO(Last In, First Out; 후입선출) 구조로 동작한다.

  • 저장되는 데이터: 원시 타입(Primitive Type) 변수(int, double, boolean 등)의 실제 값과 참조 타입(Reference Type) 변수의 주소값이 저장된다.
  • 생명주기: 메서드가 호출될 때 스택 프레임(Stack Frame)이 쌓이고, 메서드 실행이 완료되면 해당 프레임이 자동으로 제거된다.
  • 특징: 각 스레드마다 독립적인 Stack 영역을 가지므로 스레드 직간접 공유가 불가능하며, 접근 속도가 매우 빠르다. 메모리 공간을 넘어설 경우 java.lang.StackOverflowError가 발생한다.

3. Heap 영역의 개념과 특징

Heap 영역은 JVM이 관리하는 동적 메모리 할당 공간이다. 모든 스레드가 공유하는 영역으로, 자바 프로그램 실행 중 동적으로 생성되는 객체들이 거주하는 공간이다.

  • 저장되는 데이터: new 연산자를 통해 생성된 모든 객체(Object)와 배열(Array)이 실제 데이터로 저장된다.
  • 생명주기: 메서드 실행 종료와 관계없이 객체가 더 이상 참조되지 않을 때까지 유지된다.
  • 특징: 가비지 컬렉터(Garbage Collector, GC)의 관리 대상이 된다. 어떤 변수도 참조하지 않는 도달 불가능한(Unreachable) 객체는 GC에 의해 메모리에서 해제된다. 메모리가 부족하면 java.lang.OutOfMemoryError가 발생한다.

4. Stack과 Heap의 상호작용

실제 코드에서 두 영역은 서로 긴밀하게 연결되어 동작한다. 예를 들어 다음과 같은 코드가 있다고 가정해 보자.

1
2
3
4
5
public void example() {
    int age = 25;
    String name = new String("Java");
}

  • int age = 25;: 기본 타입 변수인 age와 그 값 25Stack 영역에 저장된다.
  • String name = new String("Java");: 참조 변수인 nameStack 영역에 생성되지만, new 키워드로 생성된 실제 "Java" 문자열 객체는 Heap 영역에 할당된다. Stack의 name 변수는 Heap에 있는 객체의 메모리 주소를 가리킨다.

5. 핵심 차이점 비교

구분Stack 영역Heap 영역
저장 데이터원시 타입 값, 참조 변수(주소값), 지역 변수실제 객체(Instance) 및 배열
할당 방식컴파일 타임 크기 결정 (정적)런타임 동적 할당
스레드 공유각 스레드 독립 공간 (공유 X)모든 스레드 공유
해제 방식메서드 종료 시 자동 해제가비지 컬렉터(GC)에 의해 해제
속도 및 크기속도 매우 빠름 / 크기 제한적Stack에 비해 속도 느림 / 크기 큼

6. 정리

자바의 Stack과 Heap은 데이터의 성격과 생명주기에 따라 역할을 분담한다. Stack은 빠른 접근과 자동 메모리 관리를 바탕으로 함수 실행 단위의 변수를 처리하고, Heap은 크기가 유동적인 객체를 저장하며 가비지 컬렉터를 통해 관리된다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.