힙(Heap)과 스택(Stack)

  • 자바 프로그래밍에서 메모리 관리의 주요 영역

힙(Heap)

  1. 동적 할당된 객체 저장: 힙 영역은 자바 프로그램에서 동적으로 생성되는 모든 객체 및 배열의 메모리를 저장합니다. 객체가 생성될 때마다 힙 영역에 새로운 메모리 블록이 할당되며, 이 객체는 해당 블록에 저장됩니다.
  2. 가비지 컬렉션: 힙 영역의 중요한 특징은 가비지 컬렉션(Garbage Collection)을 통해 메모리 관리됩니다. 가비지 컬렉션은 더 이상 사용되지 않는 객체를 식별하고 해당 객체의 메모리를 해제하여 메모리 누수를 방지합니다. 이것은 자바의 강력한 메모리 관리 기능 중 하나로, 개발자가 명시적으로 메모리를 해제할 필요가 없습니다.
  3. 가변 크기: 힙 영역은 가변 크기의 데이터를 저장하기 위한 공간을 제공합니다. 객체의 크기나 수명은 프로그래머에 의해 결정되며, 힙은 이러한 다양한 요구사항을 수용할 수 있습니다.
  4. 스레드 공유: 힙은 다수의 스레드에 의해 공유됩니다. 여러 스레드가 동시에 힙에 접근할 수 있으므로 동기화에 유의해야 합니다.
  5. 힙 영역의 구조: 힙은 크게 “새 영역(Young Generation)”과 “오래된 영역(Old Generation 또는 Tenured Generation)”으로 나뉩니다. 새 영역은 주로 새로 생성된 객체를 저장하는 데 사용되며, 오래된 영역은 가비지 컬렉션 후에 여전히 유지되는 객체를 저장하는 데 사용됩니다.

스택(Stack)

  1. 메소드 호출 스택: 스택은 주로 메소드 호출과 관련된 정보를 저장하는 데 사용됩니다. 메소드가 호출될 때 스택에는 다음과 같은 정보가 저장됩니다.
    • 로컬 변수: 메소드 내에서 선언된 로컬 변수 및 메소드 파라미터의 값이 스택에 저장됩니다.
    • 메소드 호출 스택 프레임: 각 메소드 호출은 스택 프레임으로 표현되며, 이 프레임에는 메소드의 매개 변수, 로컬 변수, 리턴 주소 및 다른 호출 관련 정보가 포함됩니다.
  2. LIFO 구조: 스택은 후입선출(LIFO) 구조를 가지며, 가장 최근에 호출된 메소드가 가장 먼저 종료되고 스택에서 제거됩니다. 이것은 메소드 호출 및 반힙(Heap)환을 효율적으로 관리하는 데 도움이 됩니다.
  3. 스레드 별 스택: 각 스레드는 별도의 스택을 가지고 있으며, 독립적으로 관리됩니다. 이로 인해 다수의 스레드가 동시에 실행될 때 스택 간의 상호 간섭을 피할 수 있습니다.
  4. 크기 제한: 스택은 일반적으로 고정 크기를 가지며, 스택 오버플로우(Stack Overflow) 오류가 발생할 수 있습니다. 이는 재귀 호출이 너무 깊거나 메소드 호출 스택이 너무 많이 쌓일 때 발생할 수 있습니다.
  5. 스레드 관리: 자바 스레드는 JVM에 의해 생성되고 관리되며, 각 스레드는 자체 스택을 가지고 있으므로 스레드 간 메소드 호출 및 데이터 공유가 안전하게 이루어질 수 있습니다.

정리

  • 자바 프로그램에서의 힙(Heap)과 스택(Stack)은 메모리 관리의 주요 영역입니다. 힙(Heap) 영역은 동적으로 할당된 객체와 배열을 저장하는 곳입니다. 또한, 가변 크기의 데이터를 저장하는 데 사용되며, 프로그램이 실행 중에 동적으로 생성되고 해제되는 객체들의 메모리 요구사항을 관리합니다. 스택(Stack) 영역은 메소드 호출과 관련된 데이터를 저장하는 곳입니다. 스택은 후입선출(LIFO, Last-In-First-Out) 구조를 가지며, 각 스레드마다 별도의 스택을 가지고 있습니다.

참고

  • ChatGPT-4.0

보완/복습

  • 2023.11.03 생성