메모리 구조
•
프로그램이 운영체제로부터 할당받는 대표적인 메모리 공간
1.
코드(code) 영역
2.
데이터(data) 영역
3.
스택(stack) 영역
4.
힙(heap) 영역
코드 영역
•
실행할 프로그램의 코드가 저장되는 영역
•
=== 텍스트 영역
•
CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리
데이터 영역
•
프로그램의 전역 변수와 정적 변수가 저장되는 영역
•
프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸
스택 영역
•
메모리의 스택 영역은 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역
•
함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸
스택 프라임 : 스택 영역에 저장되는 함수의 호출 정보
•
후입선출, 선입후출 동작 방식 - 가장 늦게 저장된 데이터가 가장 먼저 인출
•
메모리의 높은 주소에서 낮은 주소의 방향으로 할당
•
데이터 처리 방식
◦
푸시(push) : 데이터 저장
◦
팝(pop) : 데이터 인출
스택과 힙 비교
•
변수 엑세스 크기 비교
스택 | 힙 |
매우 빠른 액세스 | (상대적으로) 느린 액세스 |
변수를 명시적으로 할당 해제할 필요가 있음 | 메모리 크기 제한 없음 |
공간은 CPU에 의해 효율적으로 관리되고 메모리는 단편화되지 않는다 | 효율적인 공간 사용을 보장하지 못하면 메모리 블록이 할당 된 후 시간이 지남에 따라 메모리가 조각화되어 해제 될 수 있다. |
지역 변수 | 전역 변수 |
스택 크기 제한 (OS에 따라 상이) | 메모리 관리 필요 (변수를 할당하고 해제하는 것) |
변수 크기 조정 불가능 | 변수는 C언어 realloc() or 자바 new |
•
특성 비교
특성 | 스택 메모리 (Stack Memory) | 힙 메모리 (Heap Memory) |
수명 주기 | 메소드 호출과 함께 사용되며, 메소드 종료 시 메모리에서 제거 | 애플리케이션의 생명 주기 동안 사용되며, 가비지 컬렉터에 의해 관리 |
용도 | 메소드의 실행 상태, 지역 변수, 매개변수 저장 | 모든 자바 객체와 JRE 클래스들 저장 |
접근 속도 | 빠름 | 스택에 비해 상대적으로 느림 |
메모리 관리 | 자동 (LIFO 구조) | 가비지 컬렉션에 의해 자동 관리 |
스레드 공유 | 각 스레드는 자신만의 스택을 가짐 | 모든 스레드에 의해 공유됨 |
메모리 할당 | 컴파일 시간에 결정 | 런타임에 결정 |