[JAVA] 힙(Heap), 스택(Stack)

handa·2024년 12월 6일
0
post-thumbnail

1. 힙 메모리 (Heap)

힙은 에플리케이션이 실행되는 동안 동적으로 생성된 객체와 배열이 저장되는 메모리 영역입니다.
JVM(Java Virtual Machine)에 의해 관리되며, 가비지 컬렉터가 사용하지 않는 객체를 자동으로 제거합니다.

특징

  1. 동적 할당
    • 객체와 배열은 힙에 저장됩니다.
    • 개발자가 new 키워드를 사용하면 힙 메모리에 공간이 할당됩니다.
  2. 공유 메모리
    • 힙 메모리는 모든 스레드가 공유합니다.
    • 여러 스레드가 동일한 객체를 참조할 수 있습니다.
  3. 수명
    • 객체는 더 이상 참조되지 않을 때까지 힙에 남아 있습니다.
    • 가비지 컬렉터가 메모리를 정리합니다.
  4. 크기
    • JVM의 설정에 따라 크기를 조정할 수 있습니다.(-Xms-Xmx 옵션).
    • 메모리가 부족하면 OutOfMemoryError 가 발생합니다.
class Example {
    public static void main(String[] args) {
        String name = new String("Java"); // 힙에 저장
        int[] numbers = new int[10];      // 배열도 힙에 저장
    }
}

2. 스택 메모리 (Stack)

스택은 메서드 호출과 관련된 데이터를 저장하는 메모리 영역입니다. 스택은 LIFO(Last In, First Out) 방식으로 작동하며, 각 메서드 호출마다 스택 프레임이 생성됩니다.

특징

  1. 메서드 실행과 지역 변수
    • 메서드가 호출될 때마다 스택에 스택 프레임이 생성됩니다.
    • 스택 프레임은 해당 메서드의 지역 변수, 매개변수, 리턴 주소를 포함합니다.
  2. 빠른 접근 속도
    • 스택은 메모리 접근 속도가 매우 빠릅니다.
    • 메서드가 종료되면 해당 스택 프레임이 자동으로 제거됩니다.
  3. 메모리 관리
    • 개발자가 명시적으로 관리할 필요가 없습니다.
    • 스택 프레임은 메서드 호출이 끝나면 자동으로 해제됩니다.
  4. 크기
    • JVM에 의해 크기가 정해지며, 스택 크기가 부족하면 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;
    }
}

3. 힙과 스택의 비교

특성힙 메모리 (Heap)스택 메모리 (Stack)
저장되는 데이터객체, 배열지역 변수, 메서드 호출 정보
메모리 접근 속도상대적으로 느림매우 빠름
메모리 관리가비지 컬렉터가 자동으로 관리JVM이 자동으로 관리 (스택 프레임 제거)
공유 여부모든 스레드가 공유각 스레드에 독립적
메모리 크기크기가 크고 조정 가능상대적으로 적음
예외OutOfMemoryErrorStackOverflowError
생명 주기객체 참조가 없어질 때 가비지 컬렉션으로 해제메서드 호출 종료 시 스택 프레임 제거

4. 힙과 스택의 상호작용

  • 참조 변수와 객체
    • 참조 변수는 스택에 저장되고, 참조 변수에 의해 참조되는 객체는 힙에 저장됩니다.
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 필드는 힙에 저장
    }
}

5. 정리

  • 힙은 객체와 배열을 저장하며, 모든 스레드가 공유합니다.
  • 스택은 메서드 호출 정보와 지역 변수를 저장하며, 각 스레드에 독립적입니다.
  • 스택은 빠르고 자동으로 해제되지만, 힙은 더 유연하게 사용되며 가비지 컬렉션이 필요합니다.
    ---
profile
진짜 해보자

0개의 댓글