WEB개발/JAVA

[JAVA] 메모리 스택, 힙

wooyeon06 2022. 10. 31. 13:29

 

프로그램이 실행되기 위해서는 먼저 프로그램이 메모리에 로드(load)되어야 합니다.
또한, 프로그램에서 사용되는 변수들을 저장할 메모리도 필요합니다.

따라서 컴퓨터의 운영체제는 프로그램의 실행을 위해 다양한 메모리 공간을 제공하고 있습니다.
프로그램이 운영체제로부터 할당받는 대표적인 메모리 공간은 4가지가 있습니다.

 

  1. 코드(code) 영역
  2. 데이터(data) 영역
  3. 스택(stack) 영역 - 지역 변수
    1. 메서드, 생성자, 초기화 블록 내에서 선언되고 사용됩니다.
    2. 스택 메모리에 저장되며, 메서드나 생성자의 실행이 끝나면 메모리에서 사라집니다.
  4. 힙(heap) 영역 - 인스턴스 변수
    • 클래스 내부에서, 메서드 밖에서 선언되고 사용됩니다.
    • 힙 메모리에 저장되며, 객체가 생성될 때 생성되며 객체가 사라질 때까지 유지됩니다.

 

2. 코드 영역

메모리의 코드(code) 영역은 실행할 프로그램의 코드가 저장되는 영역으로 텍스트 영역이라고도 부릅니다. 
CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리하게 됩니다.

 

3. 데이터 영역

메모리의 데이터(data) 영역은 프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역입니다.
데이터 영역은 프로그램 시작과 함께 할당되며, 프로그램이 종료되면 소멸합니다.

 

 

4. 스택 영역

메모리의 스택(stack) 영역은 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역입니다.
스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸합니다.

 

이렇게 스택 영역에 저장되는 함수는 호출 정보를 스택 프레임(stack frame)이라고 합니다.

 

스택 영역은 푸시(push) 동작으로 데이터를 저장하고, 팝(pop) 동작으로 데이터를 인출합니다.
이러한 스택은 후입선출(LIFO, Last-In First-Out) 방식에 따라 동작하므로, 가장 늦게 저장된 데이터가 가장 먼저 인출됩니다.

 

스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당됩니다.

 

5. 힙 영역

메모리의 힙(heap) 영역은 사용자가 직접 관리할 수 있는 '그리고 해야만 하는' 메모리 영역입니다.

힙 영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제됩니다. 힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당됩니다.

 

힙 영역은 모든 스레드가 같이 공유하는데 반해 스택의 경우에는 각 스레드별로 하나씩 생성되어집니다. 이러한 특성으로 각 스레드마다 스택 메모리는 다른 스레드에서 접근이 불가능한 반면에 Method Area와 Heap Area는 모든 스레드에서 접근이 가능하고 프로그램의 시작부터 종료 될 때까지 메모리에 남아 프로그램이 실행되고 있다면 어디서든지 사용이 가능합니다.

 

=> (JVM) 먼저 Heap 영역에는 모든 Object 타입(Integer, String)등이 생성됩니다. 그리고 Heap 영역에 할당 된 Object 타입의 참조를 위한 값(주소)들이 Stack 영역에 할당됩니다. 또한 Stack에는 기본타입 변수들(int, double 등)이 실제 값과 함께 저장됩니다.

 

업캐스팅 구조

Customer vc = new VIPCustomer();

 

VIPCustomer() 생성자에 의해 VIPCustomer 클래스의 모든 멤버 변수에 대한 메모리는 생성되었지만,
변수의 타입이 Customer 이므로 실제 접근 가능한 변수나 메서드는 Customer의 변수와 메서드임

6. 스택과 힙의 장단점

  스택
할당/해제 빠름 느림
구현 난이도 쉬움 - 아키텍처별 대동소이 어려움 - 운영체제마다 다름
필요성 함수 프레임 제공 메모리 동적 할당
scope local(지역) global(전역)
유연성 resizing 불가능 resizing 가능

 

7. 자바 변수 사이클

  • 변수의 유효 범위(scope)와 생성과 소멸(life cycle)은 각 변수의 종류마다 다름
  • 지역변수, 멤버 변수, 클래스 변수는 유효범위와 life cycle, 사용하는 메모리도 다름
  • static 변수는 프로그램이 메모리에 있는 동안 계속 그 영역을 차지하므로 너무 큰 메모리를 할당하는 것은 좋지 않음
  • 클래스 내부의 여러 메서드에서 사용하는 변수는 멤버 변수로 선언하는 것이 좋음
  • 멤버 변수가 너무 많으면 인스턴스 생성 시 쓸데없는 메모리가 할당됨
  • 상황에 적절하게 변수를 사용해야 함

 

 

 

 

참조

https://hwan1402.tistory.com/110
https://coding-factory.tistory.com/830