다음과 같은 질문을 받았을 때 어떻게 답해야 하는가?
Heap이란?
어떤 Heap
을 말하는 것인가?
Data Structure에서 트리를 사용하는 Heap
(최대 힙
/최소 힙
)을 말하는 것인가?
아니면 프로세스의 메모리 구조중의 Heap
을 말하는 것인가?
그 전에, 왜 메모리 구조 중 사용자(개발자)가 동적할당하는 메모리 영역도 Heap
이고 데이터구조 중의 Heap
도 Heap
으로 부르는 것인가?
Stack
은 이에 대해 간편하게 답변할 수 있다.
프로세스 메모리 구조중의 Stack
은 실제로 Stack
자료구조를 사용하기 때문에 Stack
이기 때문이다.
이해하기도 간편하다.
함수가 호출되면 함수 스택(스택 프레임)이 쌓이고, 그곳에서 처리할 함수 스택(스택 프레임)이 또 쌓이면서, 처리 완료시 그 스택을 pop하는 방식을 사용하기 때문이다. 실제로 Stack
식으로 구조를 이해하기 용이하다.
하지만 Heap
의 경우 알고 있는 것은 항상 최대값/최소값을 가져올 수 있는 Heap
이 전부이다.
심지어 Heap
은 특성상 [0] 이외의 인덱스에 접근하면 Heap
을 사용하는 의미 자체가 퇴색된다.
도대체 이런 자료구조로 사용자가 동적할당한 데이터를 어떻게 갖고 오는 것인가? 혹시 프로세스 메모리의 Heap
은 Heap
데이터 구조가 아닌 것이 아닐까?
다음 링크를 참조해보자.
다음과 같이 답변한다.
둘의 공통점은 이름이 같다는게 전부입니다.
다음 링크의 코멘트에서는 다음과 같이 기술한다.
사실,
Heap
보다는Pool
이 더 나은 말입니다.
이것이 전부이다. Heap
은 Pool
보다 더 오래된 말이며, 그 때 당시엔 Memory Pool
같은 단어를 쓰지 않았기에 Heap
이라는 이름을 사용했다. 라는 것이 요지이다.
다음 링크에서도 보이듯이 그냥 데이터 공간 더미
이기 때문에 Heap
이라고 부르는것 뿐이라고 말한다.
C#의 VM(CLR)을 예시로, 이 VM의 영향을 받는 Heap영역은 오래 살아남은 데이터
는 다시는 안 쓸 확률이 낮고
, 최신 데이터
는 다시 안 쓸 확률이 높다
는 점에 근거하여 제작된 GC를 위하여 다음과 같은 3개의 영역으로 구분된다.
Java의 경우는 C#이 원래 Java를 참조하여 만든 언어였으므로 GC의 구조가 비슷했지만, Java7+가 되면서 G1 GC가 되었다고 한다. 이제 Java는 위와 같은 GC를 사용하지 않는다고 한다.