Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

자바(Java) 스택(Stack)과 힙(Heap) 메모리의 차이점 완벽 정리

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를 발생시킵니다.

정리

스택은 메서드 호출과 지역 변수처럼 생명주기가 짧고 순차적인 데이터를 빠르게 처리하는 데 최적화되어 있으며, 힙은 객체처럼 수명이 길거나 크기가 가변적인 데이터를 유연하게 관리하는 데 적합합니다. 두 메모리 영역의 특성을 정확히 이해하면 StackOverflowErrorOutOfMemoryError 같은 오류를 예방하고, JVM 옵션(-Xss, -Xms, -Xmx)을 활용한 성능 튜닝에도 큰 도움이 됩니다.