[CS]Stack_VS_Heap
Stack VS Heap
개념을 까먹었고 오해하고 있어서 정리 파일을 만들었다.
메모리 구조 (from CS50 Lecture)
Machine Code
머신 코드 영역에는 프로그램이 실행될 때, 해당 프로그램이 컴파일 된 바이너리 코드가 저장된다.
Stack
RAM(Random Access Memory) 영역 중 각 함수의 지역변수들을 LIFO(Last In First Out) 방식으로 저장하는 영역이다.
(Java에서는 heap 영역에 생성된 Object 타입의 데이터들에 대한 참조값들이 할당됨. 원시타입의 데이터들은 실제 값 할당.)
함수가 종료되면 스택에서 해당 함수가 pop() 되어지고, 함수에서 선언했던 지역변수도 메모리에서 사라지게 된다.
Stack 메모리는 Thread 하나당 하나씩 할당된다. 각 스레드에서 다른 스레드의 Stack 영역에는 접근할 수 없다.
Heap
사용자가 직접 관리할 수 있는 메모리 영역으로, 사용자에 의해 메모리가 동적으로 할당되고 해제된다. C의 경우 malloc으로 할당된 메모리의 데이터가 저장된다.
- 모든 Object 타입은 heap 영역에 생성된다.
- 스레드 수와 관계없이 단 하나의 heap 영역만 존재한다.
(Java)Garbage Collector
Mark and Sweep이라고도 한다.
Mark : Stack의 모든 변수를 스캔하며 각각 어떤 Object를 참조하고 있는지 찾는 과정. 참조되는 Object들은 Marking.
Sweep : Mark 되어있지 않은 모든 Object를 heap에서 제거하는 과정
Unreachable Object 를 우선적으로 메모리에서 제거하여 메모리 공간을 확보한다.
(Unreachable Object 란 Stack 에서 도달할 수 없는 Heap 영역의 객체를 말함)