메모리 구조(Stack , Heap)

woonie·2022년 6월 12일
0

JVM은 기본적으로 Stack메모리와 Heap메모리 라는 두가지 저장 공간을 이용하여 메모리를 할당한다고 배웠다.

Stack메모리와 Heap메모리가 무엇인지 차근차근 다시 알아보려고 한다.

1. 메모리

먼저 메모리란, 프로그램이 실행되기 위해서는 운영체제(OS)가 프로그램의 정보를 메모리에 로드해야 한다. 또한 프로그램이 실행되는 동안 CPU가 코드를 처리하기 위해서는 메모리가 명령어와 데이터들을 저장해야 한다.

위와 같이 프로그램이 운영체제(OS)로 부터 할당받는 대표적인 메모리 공간은 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 구성되어있다.

2. 코드 영역(Code)

  • 코드 영역은 실행할 프로그램의 코드가 저장되는 영역으로 텍스트 영역이라고 부르기도 한다.
    CPU는 코드 영역에 저장된 명령을 하나씩 가져가서 처리하게 된다.
    프로그램이 시작하고 종료될 때 까지 메모리에 계속 남아있는다.

3. 데이터 영역(Data)

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

4. 힙 영역(Heap)

  • 동적 메모리 할당

  • 사용자가 직접 관리할 수 있고 관리해야만 하는 메모리 영역

  • 사용자에 의해 메모리 공간이 동적으로 할당되고 해제

  • malloc() 또는 new연산자를 통해 할당되고 free() 또는 delete연산자를 통해 해제된다.

  • 메모리의 낮은 주소에서 높은 주소의 방향으로 할당

  • 장점

    • 메모리 크기에 제한이 없다.
    • 프로그램에 필요한 개체의 개수나 크기를 미리 알 수 없는 경우에 사용 가능
    • 변수는 전역적으로 액세스 할 수 있다.
  • 단점

    • 데이터 액세스가 상대적으로 느리고 메모리를 관리해야 한다.
    • 할당, 해제 작업으로 인한 속도 저하 발생
    • 힙 손상, 경합으로 인한 속도 저하 발생
      • 힙 손상 : 이중 해제, 해제 후 블록 사용, 블록 여계를 벗어나 덮어쓰기 등)
      • 힙 경합 : 두 개 이상의 쓰레드에서 동시에 데이터에 액세스 하는 경우 경합이 발생하여 한쪽 쓰레드의 작업이 완료되어야 다른 쪽 쓰레드의 작업을 진행할 수 있다.

    5. 스택 영역(Stack)

  • 정적 메모리 할당

  • 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역

  • 스택 영역의 크기는 컴파일 시 결정

  • 함수의 호출과 함께 할당되며 함수의 호출이 완료되면 소멸

  • 메모리의 높은 주소에서 낮은 주소의 방향으로 할당

  • 장점

    • 데이터 액세스가 빠른 편이며 변수를 명시적으로 할당 또는 해제할 필요가 없다.
    • 하나의 명령으로 메모리 조작과 어드레스 조작 가능
  • 단점

    • 메모리 크기 제한
    • 지역 변수만 액세스 가능
profile
동료들과 함께하는 개발의 중요성에 관심이 많습니다. 언제나 호기심을 갖고 꾸준히 노력하는 개발자로서 성장하고 있습니다.

0개의 댓글