JVM의 힙 메모리와 스택 메모리의 차이는 무엇인가요?
JVM의 힙 메모리(Heap)와 스택 메모리(Stack)는 자바 프로그램 실행 시 데이터 저장과 관리 방식을 다르게 하는 두 가지 주요 메모리 영역입니다.
이 둘은 역할, 구조, 할당 및 수명에서 차이가 있습니다.
아래에 주요 차이점을 정리하였습니다.
1. 힙 메모리 (Heap Memory) - 역할 : 객체(instance)와 배열이 저장되는 메모리 공간입니다.
자바에서 `new` 키워드로 생성된 모든 객체는 힙에 할당됩니다.
- 구조 : 동적 메모리 할당 영역으로 크기가 가변적이며, 가비지 컬렉션(Garbage Collection)에 의해 관리됩니다.
- 할당 방식 : 런타임 시 동적으로 크기가 결정되고, 객체가 생성될 때마다 메모리가 할당됩니다.
- 수명 : 객체가 더 이상 참조되지 않으면 가비지 컬렉터가 메모리를 해제합니다.
따라서 객체의 수명은 참조에 따라 달라집니다.
- 접근 속도 : 스택보다 상대적으로 느림(메모리 할당, 해제가 복잡하고 가비지 컬렉션 발생). - 공유 여부 : 여러 스레드가 동일 힙을 공유합니다.
2. 스택 메모리 (Stack Memory) - 역할 : 메서드 호출 시 생성되는 프레임이 저장되는 공간으로, 지역 변수, 메서드 파라미터, 리턴 주소 등 임시 데이터가 위치합니다.
- 구조 : LIFO(Last In First Out) 방식의 메모리 구조로, 각 메서드 호출 시 스택 프레임이 쌓이고 메서드 종료 시 제거됩니다.
- 할당 방식 : 컴파일 타임에 크기가 결정되며, 메서드 호출 시 자동으로 메모리가 할당되고 메서드 종료 시 해제됩니다.
- 수명 : 해당 메서드 호출이 끝나면 스택 프레임이 사라지므로 지역 변수도 함께 소멸됩니다.
- 접근 속도 : 힙보다 매우 빠릅니다.
- 공유 여부 : 각 스레드마다 별도의 스택 메모리를 가집니다(스레드 독립적). --- 요약 비교 | 구분 | 힙 메모리 | 스택 메모리 | |------------------|-------------------------------|---------------------------------| | 저장 대상 | 객체(instance), 배열 | 지역 변수, 메서드 호출 프레임 | | 메모리 할당 방식 | 동적 할당 | 정적(컴파일시 크기 결정), 자동 할당/해제 | | 수명 | 참조가 유지되는 한 지속 | 메서드 호출 시 생성, 종료 시 소멸 | | 접근 속도 | 느림 | 매우 빠름 | | 관리 | 가비지 컬렉션에 의해 관리 | 컴파일러 및 JVM에 의해 자동 관리 | | 스레드 간 공유 | 공유됨 | 스레드별로 별도 존재 | --- 결론 - 힙 메모리 는 동적으로 생성되는 객체를 저장하며 JVM 내에서 모든 스레드가 공유하는 공간입니다.
메모리 관리가 복잡하고 가비지 컬렉션을 통해 메모리가 해제됩니다.
- 스택 메모리 는 메서드 호출 시 생성되는 임시 데이터를 저장하며, 각 스레드마다 독립된 공간으로 관리되고, 메서드 종료 시 자동으로 메모리가 해제되어 빠른 접근이 가능합니다.
이러한 구조 덕분에 자바는 효율적인 메모리 관리와 안전한 멀티스레드 환경을 지원할 수 있습니다.