동적 할당 영역 - 스택영역, 힙영역

꿀떡냠·2024년 5월 19일
post-thumbnail

프로세스의 동적 할당 영역

  • 프로그램이 실행되기 위해서는 메모리에 프로그램을 올려야한다.
  • 메모리에 프로그램을 올릴때 운영체제는 프로그램의 실행을 위해 다양한 메모리 공간을 제공한다.
  • 프로세스 구조는 코드 영역, 데이터 영역, 스택영역, 힙 영역으로 이루어져 있다.

코드 영역

  • 정적 할당 영역
  • 실행할 프로그램의 코드가 저장되는 영역
  • CPU는 코드 영역에 저장된 명령어를 가지고 처리한다.

데이터 영역

  • 정적 할당 영역
  • 전역변수와 정적(static)변수가 저장되는 영역
  • 프로그램 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다.

스택 영역

  • 함수 호출과 관련된 원시타입의 지역 변수와 매개 변수가 저장되는 영역
  • 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다.
  • 함수 종료시 되돌아올 주소도 스택에 저장된다.
  • 함수 실행시 push 동작으로 스택에 데이터를 저장하고 함수 종료시 pop 동작으로 스택에 데이터를 삭제한다.
  • LIFO 방식으로 동작한다.
  • 높은 주소에서 낮은 주소의 방향으로 할당한다.

힙 영역

  • 변수가 차곡차곡 쌓이는 스택과 달리 힙영역은 임의의 객체가 생성된다. 객체의 프로퍼티 값을 저장하거나 저장된 값을 가져오고 싶으면 객체 주소를 알고있어야 한다.
  • 힙 영역에서는 하나의 객체를 여러 참조변수에서 공유하는 형태이기 때문에 메모리를 절약할 수 있다.
  • 객체를 선언하면 항상 힙 메모리 영역에 생성된다.
  • 객체의 주소는 스택 메모리에 저장한다.
  • 힙 메모리 영역의 데이터는 모든 스레드에서 공유하기 때문에 스택 메모리 할당만큼 안전하지 않다.
  • 힙 메모리 관리가 필수이다. 힙 메모리를 관리하지 않으면 메모리 누수가 발생할 수 있다.

힙과 스택의 차이점

  • 힙과 스택은 사용 목적, 메모리 관리 방식, 생명 주기 등에서 차이를 보입니다.
  1. 메모리 할당
  • 스택은 함수 호출/종료시 메모리가 할당 및 해제가 자동으로 이뤄집니다.
  • 힙은 프로그래머가 메모리를 할당하고 해제해서 메모리 관리가 필수이다.
  1. 메모리 할당 방식
  • 스택은 정적할당 방식으로 컴파일 타임에 메모리가 결정됩니다.
  • 힙은 동적할당 방식으로 런타임에 필요한 만큼의 메모리를 할당 받습니다.
  1. 메모리 관리
  • 스택은 메모리가 자동으로 관리되지만, 오버플로가 발생할 위험이 존재합니다.
  • 힙은 프로그래머가 메모리를 관리해야하기 때문에 메모리 누수 위험이 존재합니다.
  1. 메모리 구조 및 액세스 속도
  • 스택은 LIFO 구조로 데이터에 빠르게 액세스가 가능합니다.
  • 힙은 데이터 저장시 임이의 주소에 저장되기 때문에 스택에 비해 상대적으로 액세스 속도가 느립니다.
  1. 공유
  • 스택은 각 스레드마다 스택이 존재합니다. 스택에 있는 데이터는 공유할 수 없습니다.
  • 힙은 모든 스레드가 공유하는 메모리 영역입니다.

자바는 힙 영역을 어떻게 효율적으로 관리할까?

  • JVM의 Garbage Collector 가 주기적으로 메모리를 검사하여 메모리 공간의 사용되지 않는 공간 ( stack 에서 참조하지 않는 공간, 즉 고아객체 )을 제거해준다.
profile
백엔드 개발자로 살아남기

0개의 댓글