Heap 영역과 Stack 영역의 가장 큰 차이는 공유 범위와 데이터의 생명주기입니다.
Heap은 JVM의 모든 스레드가 공유하는 영역으로, 클래스의 인스턴스와 배열이 할당됩니다. 객체가 가진 인스턴스 필드도 객체의 일부이기 때문에 Heap에 포함됩니다. Heap에 생성된 객체는 가비지 컬렉터가 관리하며, 사용할 수 있는 Heap 메모리가 부족해지면 OutOfMemoryError가 발생할 수 있습니다.
반면 Stack은 스레드마다 독립적으로 생성되는 영역입니다. 메서드가 호출될 때마다 해당 메서드를 위한 스택 프레임이 쌓이고, 메서드 실행이 끝나면 제거됩니다. 스택 프레임에는 매개변수와 지역 변수를 저장하는 영역, 연산 과정에서 사용하는 Operand Stack 등이 포함됩니다. 지역 변수로 선언된 기본형 값과 객체의 참조값은 여기에 저장될 수 있지만, 참조값이 가리키는 실제 객체는 Heap에 존재합니다. 메서드 호출이 지나치게 깊어져 Stack의 한도를 초과하면 StackOverflowError가 발생합니다.
예를 들어 지역 변수로 int 값과 Member 객체를 선언했다면, int 값과 Member 객체의 참조값은 현재 스택 프레임에 저장되고, 실제 Member 인스턴스는 Heap에 할당됩니다.
정리하면 Heap은 객체와 배열을 저장하며 여러 스레드가 공유하는 영역이고, Stack은 메서드 실행에 필요한 데이터를 스레드별로 관리하는 영역입니다.