JVM의 메모리 구조는 크게 여러 영역으로 나눌 수 있다.
그 중에서 스택과 힙은 주요한 두 메모리 영역이다
데이터 생명주기 측면에서는 우리가 날마다 사용하는 ToDo 앱과 비슷하다고 보면된다. 오늘이 지나면 초기화 되는 것처럼 스택에서는 메서드가 종료되면 없어진다.
또한 데이터 입출력 측면에서는 접시를 쌓는 것과 비슷하다 첫 접시가 가장 마지막에 설거지 된다.
특징
힙 영역은 객체와 배열을 저장하는 영역이다.
스택 영역과는 다르게 메서드의 호출과 종료와는 무관하게 데이터가 저장되거나 소멸된다.
객체의 실제 데이터와 메타데이터(클래스 정보, 가비지 컬렉션 관련 정보 ...)가 저장된다.
또한 가비지 컬렉터에 의해 사용하지 않는 객체가 정리된다.
스택
이 일회용 지하철 사물함이라면 힙
은 개인이 소유한 보관용 큰 창고라고 보면 된다. 해당 창고에는 언제든 물품을 보관할 수 있지만 가끔 정리해야한다. 가비지 컬렉터
가 이런 물품(데이터
)를 정리해준다.
정리하자면 두 영역 사이의 주요 차이점은 스택
은 메서드의 실행과 함께 메모리가 할당되고 해제되는 반면 힙
은 객체의 생명 주기와 관련된 메모리 할당 및 해제가 이루어진다는 것이다.
그리고 스택
은 메모리의 할당과 해제가 빠르지만 제한적인 메모리 크기를 가지며, 힙
은 더 큰 메모리 공간을 차지하고 메모리 관리에 비용이 들 수 있다.