- Incremental build

stack
- 지역변수(자동변수), 매개변수, 반환주소 등이 사용하는 선형 메모리
- 컴파일에 필요한 메모리 공간의 크기가 확인 (지역변수의 수명을 추적) (쓰레드, 의존성 최적화..)
- 호출 스택이 무한정 늘어나는 것은 논리적으로 비효율적인 코드일 수 있음
- 동적 배열(동적 크기를 컨트롤 하는 타입 정의) 등을 활용하거는 경우 heap 역할을 일부 대체할 수 있음
stack과 멀티스레딩 데이터 유지 이슈
- 멀티 스레딩 환경에서 여러 스레드가 동시에 접근해야 할 필요성이 있는 대상 메모리가 필요할 경우 구현이 어렵거나 구조적 불가능
메모리 정렬
- 메모리에 할당한 변수를 관리 용이하기 위해 특정 크기만큼 폭을 만들어 메모리 관리하는 방식 (메모리 블록(allocation, page))
- Compact 작업으로 메모리 정렬로 다른 메모리 작업의 공간을 확보
heap
- Heap 메모리 fragmentation
- H/w, os 수준에서 메모리는 일정 블록 단위로 관리 (응용 프로그램 수준에서 모든 메모리는 가상 메모리 환경이며 이는 1차원적인 선형 구조/ 내부 파편화 발생)
- 내부, 외부 파편화로 나뉨 (메모리가 여러 작은 조각으로 나뉜 탓에 큰 덩어리를 할당하지 못하는 문제)
메모리 파편화 해결 방안
- 메모리 풀 (배열처럼 미리 공간을 할당하고 재사용하는 방식 (네트워크 패킷처럼 최대 크기가 이미 정해진 환경에서 매우 유리))
- Gv 구현 (mark & compact 알고리즘) 메모리 구조를 적용해 메모리 재정렬 (Jvm heap 영역처럼 new young generation/ old generation/ permanent gc 라이프사이클 구분)
- 전략 구성 (best fit, worst fit 전략) (가장 적절한 빈 공간을 찾아 할당(파편화를 줄일 수 있나 메모리 할당 시간이 크게 증가) (가장 큰 빈 공간을 찾아 할당(가장 큰 빈 공간을 사용함으로써 더 작은 메모리 공간이 사용될 경우에 미리 대비)