본문 바로가기
자바과정/과제물

(Java) stack과 heap

by Parkej 2021. 1. 30.

스택(stack) 

메모리의 스택(stack) 영역은 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역이다.

스택 영역은 함수의 호출과 동시에 할당되며 함수의 호출이 완료되면 소멸한다.

 

(int a; // 함수 내 잡히는 지역 변수, stack에 저장됨.)

 

canner sc; // 레퍼런스 변수

reference 변수 : sc (stack) 

sc가 Scanner(heap) 접근 가능

 

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

스택 영역은 push로 데이터를 저장하고 pop으로 데이터를 꺼낸다.

가장 늦게 저장된 데이터가 가장 먼저 나간다.

후입선출(LIFO, Last-In First-Out)

 

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

힙(heap) 

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

 

(static(정적)이 아닌 이상 만들어 써야한다.)

 

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

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

 

heap 어떤 메모리 어떻게 잡히는지, new 를 쓰는 순간 heap에 할당됨.

sc = new Scanner(System.in);

 

스택과 힙의 장단점

스택

- 매우 빠른 액세스

- 변수를 명시 적으로 할당 해제 할 필요가 없다.

- 공간은 CPU에 의해 효율적으로 관리되고 메모리는 단편화되지 않는다.

- 지역 변수 만

- 스택 크기 제한 (OS에 따라 다름)

- 변수의 크기를 조정할 수 없다.

 

- 예약된 로컬 메모리 공간(작음, 일반적으로 1MB이하)

함수 호출과 반환이 이 메모리에서 일어남

 

단순히 스택 포인터를 옮김
- 메모리를 할당 및 해제할 필요가 없음
- 스택에 할당된 메모리는 범위(scope)를 벗어나면 사라짐
- 변수와 매개변수를 위해 필요한 크기는 컴파일 도중에 알 수 있음

 

하지만 스택에 큰 개체를 많이 넣으면
- 스택 오버플로우(overflow)가 발생할 수 있음
- 성능이 느려 질 수도 있음

 

- 변수는 전역 적으로 액세스 할 수 있다.

- 메모리 크기 제한 없음(전역 메모리 공간)

- (상대적으로) 느린 액세스

- 효율적인 공간 사용을 보장하지 못하면 메모리 블록이 할당 된 후 시간이 지남에 따라 메모리가 조각화되어 해제 될 수 - 있다.

- 메모리를 관리해야한다. (변수를 할당하고 해제하는 책임이 있음)

 

 

전역 메모리 공간(공간이 크다)

비어 있으면서 연속된 메모리 블록을 찾아야 한다.

프로그래머가 메모리 할당 및 해제를 직접 해야한다.(GC따윈 없다)
- 할당 new / 해제 delete
- 생성자에서 할당(new)한 개체는 소멸자에서 해제(delete)하는게 일반적이다. (팩토리 패턴과 같이 예외도 있다.)
- 고로 c++은 Unmanaged 언어다.




 

 

출처 : 

junghyun100.github.io/%ED%9E%99-%EC%8A%A4%ED%83%9D%EC%B0%A8%EC%9D%B4%EC%A0%90/

 

출처: https://winwoo.tistory.com/32 [Winwoo's Story]

 

반응형

댓글