힙은 에플리케이션이 실행되는 동안 동적으로 생성된 객체와 배열이 저장되는 메모리 영역입니다.
JVM(Java Virtual Machine)에 의해 관리되며, 가비지 컬렉터가 사용하지 않는 객체를 자동으로 제거합니다.
특징
new
키워드를 사용하면 힙 메모리에 공간이 할당됩니다. -Xms
및 -Xmx
옵션).OutOfMemoryError
가 발생합니다.class Example {
public static void main(String[] args) {
String name = new String("Java"); // 힙에 저장
int[] numbers = new int[10]; // 배열도 힙에 저장
}
}
스택은 메서드 호출과 관련된 데이터를 저장하는 메모리 영역입니다. 스택은 LIFO(Last In, First Out) 방식으로 작동하며, 각 메서드 호출마다 스택 프레임이 생성됩니다.
특징
StackOverflowError
가 발생합니다.class Example {
public static void main(String[] args) {
int x = 10; // x는 스택에 저장
int y = calculate(x);
}
static int calculate(int value) {
int result = value * 2; // result는 스택에 저장
return result;
}
}
특성 | 힙 메모리 (Heap) | 스택 메모리 (Stack) |
---|---|---|
저장되는 데이터 | 객체, 배열 | 지역 변수, 메서드 호출 정보 |
메모리 접근 속도 | 상대적으로 느림 | 매우 빠름 |
메모리 관리 | 가비지 컬렉터가 자동으로 관리 | JVM이 자동으로 관리 (스택 프레임 제거) |
공유 여부 | 모든 스레드가 공유 | 각 스레드에 독립적 |
메모리 크기 | 크기가 크고 조정 가능 | 상대적으로 적음 |
예외 | OutOfMemoryError | StackOverflowError |
생명 주기 | 객체 참조가 없어질 때 가비지 컬렉션으로 해제 | 메서드 호출 종료 시 스택 프레임 제거 |
class Example {
public static void main(String[] args) {
Person person = new Person("Alice"); // person은 스택, "Alice"는 힙
}
}
class Person {
String name;
Person(String name) {
this.name = name; // name 필드는 힙에 저장
}
}