JVM(Java Virtual Machine)은 메모리 공간을 스택(Stack)과 힙(Heap) 두 영역으로 나누어 관리합니다. 이 두 영역은 각각 다른 목적과 특성을 가지고 있으며, 자바 프로그램의 성능과 안정성에 큰 영향을 미칩니다.
스택 메모리와 힙 메모리란?
스택 영역은 주로 메서드의 실행 순서와 지역 변수(local variables)를 저장하는 데 사용됩니다. 반면 힙 영역은 객체와 JRE 클래스 등 프로그램 실행 중 동적으로 생성되는 데이터를 저장합니다.
스택은 항상 LIFO(Last In First Out, 후입선출) 방식으로 데이터 블록을 저장하는 반면, 힙 메모리는 동적 할당(dynamic allocation) 방식을 사용해 메모리 블록을 할당하고 해제합니다.
메모리의 생존 기간 차이
힙에 할당된 메모리는 다음 중 하나의 상황이 발생할 때까지 유지됩니다.
- 프로그램이 종료되는 경우
- 메모리가 해제(free)되는 경우
반면, 스택에 할당된 메모리는 해당 함수가 반환(return)될 때까지 존재합니다. 즉, 함수 호출이 끝나면 스택 메모리는 자동으로 정리됩니다.
스택 vs 힙 메모리 핵심 비교표
| 번호 | 구분 | 스택(Stack) | 힙(Heap) 메모리 |
|---|---|---|---|
| 1 | 기본 개념 | 지역 변수, 객체 참조 변수처럼 수명이 매우 짧은 데이터를 저장하는 데 사용됩니다. | 객체(Object)와 JRE 클래스를 저장하기 위해 할당됩니다. |
| 2 | 할당 방식 | 항상 LIFO(후입선출) 순서로 메모리가 예약·관리됩니다. | 동적 할당 방식이며, 메모리 블록의 할당과 해제에 고정된 패턴이 없습니다. |
| 3 | 크기 조절 | JVM 파라미터 -Xss를 사용하여 스택 메모리 크기를 늘릴 수 있습니다. | JVM 옵션 -Xms(초기 크기)와 -Xmx(최대 크기)로 힙 메모리 크기를 늘리거나 줄일 수 있습니다. |
| 4 | 가시성(Visibility) | 변수는 해당 스레드의 소유자에게만 보입니다. | 모든 스레드에서 접근 가능합니다. |
| 5 | 발생 예외 | 메모리 부족 시 JVM이 java.lang.StackOverflowError를 발생시킵니다. | 메모리 부족 시 JVM이 java.lang.OutOfMemoryError를 발생시킵니다. |
정리
스택은 메서드 호출과 지역 변수처럼 생명주기가 짧고 순차적인 데이터를 빠르게 처리하는 데 최적화되어 있으며, 힙은 객체처럼 수명이 길거나 크기가 가변적인 데이터를 유연하게 관리하는 데 적합합니다. 두 메모리 영역의 특성을 정확히 이해하면 StackOverflowError나 OutOfMemoryError 같은 오류를 예방하고, JVM 옵션(-Xss, -Xms, -Xmx)을 활용한 성능 튜닝에도 큰 도움이 됩니다.