카테고리 없음

Stack, Heap Memory 기본 개념

땍땍 2026. 4. 5. 22:32

프로그램이 실행될 때 메모리는 크게 스택과 힙 영역으로 나뉘어 사용되며, 두 영역은 관리 방식 및 사용 용도가 다름.

 

스택(Stack) 메모리

  • LIFO 구조 ( 후입선출 ) , 마지막에 할당된 데이터가 가장 먼저 해제 (사용) 됨
  • 함수 호출 시, 자동으로 메모리가 할당되며 함수가 종료되면 자동으로 해제되는 방식. 기본적으로 OS 에서 스택 크기를 미리 할당하며, 접근 속도가 빠름
  • JAVA 에서는 지역 변수를 저장, 함수 호출 스택, 리턴 주소를 저장하는 등 활용
  • 기존 지정한 스택의 크기를 초과하거나 재귀 함수 등으로 이러한 스택 메모리를 무한으로 호출할때 문제가 발생하기 때문에 주의 필요

 

힙(Heap) 메모리

  • 메모리 크기를 동적으로 결정할 수 있으며, 개발자 혹은 OS 등이 직접 메모리를 할당하고 해제할 수 있지만 스택 메모리에 비해 접근 속도가 느림
  • JAVA 에서는 Garbage Collector가 자동으로 관리해주기에 개발자가 직접 컨트롤 할 수 없음
  • 객체, 배열 등 크기가 크고 생명 주기가 긴 데이터를 저장 및 관리함
  • 사용하지 않는 메모리를 반환하지 않고, 프로그램 종료 시까지 메모리를 점유하며 성능 저하 및 장애를 유발하는 메모리 누수 문제 존재

 

Arrays.copyOf

이때, 배열은 Heap 메모리는 배열을 활용하며, Arrays.copyOf 등의 방식으로 배열의 크기를 변경할 수 있기 때문에 배열의 크기를 동적으로 변경할 수 있다 생각할 수 있으나, 이러한 방식은 기존의 배열을 복사하는 방식으로 기존 배열의 크기를 변경하는 방식은 아님

 

Multi Thread

여러 스레다그 동작하는 환경에서는 각 스레드마다 고유한 스택 메모리를 가지며 동작하게 됨. 때문에 스택 메모리 내의 데이터는 스레드 간 공유되지 않으며, 스레드가 종료되면 해당 스택 메모리도 함께 사라짐.

하지만, 힙 메모리는 모든 스레드가 공유하여 활용하기 때문에 스레드간 데이터 공유가 가능하다는 장점이 있지만, 여러 스레드가 동시에 접근할 수 있기 때문에 데이터의 정합성이 깨지는 문제가 발생할 수 있음.