0️⃣ 메모리의 영역에서,
메모리에 대해서 먼저 기초학습이 필요하다면 아래 블로그 링크를 통해 복습하고 오자!
메모리에 저장되는 영역은 크게 코드 영역, 데이터 영역, 힙 영역, 스택 영역 총 4가지가 있다.
- 코드 영역 : 실행할 프로그램의 소스코드가 저장되는 영역 (텍스트 영역이라고도 부름)
- 데이터 영역 : 전역 변수, 정적 변수
- 힙 영역 : 프로그래머가 직접 할당하고 해제할 수 있는 동적할당 영역
- 스택 영역 : 프로그램이 자동으로 사용하는 임시 메모리 영역
간단하게 살펴보면 이렇다. 앞으로 힙과 스택 영역에 대해서 자세히 알아보자.
1️⃣ Heap (힙)
- 앞서 간단히 말한 것처럼 힙 영역은 프로그래머가 직접 할당하고 해제할 수 있는 동적 할당 구간을 말한다. 런타임 시 크기가 결정된다.
- 힙은 낮은 주소에서 높은 주소로 쌓이기 때문에 위에서부터 아래로 데이터가 차곡차곡 쌓이는 구조이다. 선입선출(FIFO, First-In First-Out)로 이루어져 있어 가장 먼저 들어온 데이터가 가장 먼저 인출된다.
- 응용프로그램이 종료될 때까지 메모리가 유지되기 때문에 사용하고 난 후에는 반드시 메모리 해제를 해주어야한다.
- 또한 참조형 데이터들이 저장되는 공간이다.
- 💡 참조형 데이터란? -> 변수에 값이 아닌 변수를 담고 있는 메모리 주소값을 저장한 데이터를 말한다. ex) 객체, 배열...
2️⃣ Stack (스택)
- 스택 영역은 프로그램이 자동으로 사용하는 임시 메모리 영역이다.
- 스택은 높은 주소에서 낮은 주소로 쌓이기 때문에 아래서부터 위로 데이터가 차곡차곡 쌓이는 구조이다. 후입선출(LIFO, Last-In First-Out)로 이루어져 있어 가장 마지막에 들어온 데이터가 가장 먼저 인출된다.
- 함수 호출과 함께 지역 변수, 매개 변수가 저장되는 영역으로 함수 호출이 완료되면 지정된 메모리도 해제된다.
- 또한 값 형식의 데이터들이 저장되는 공간이다.
3️⃣ Overflow (오버플로우)
사실 Heap 영역과 Stack 영역은 같은 공간을 공유하고 있기 때문에 서로의 영역을 침범할 수 있고, 이를 각각 Heap Overflow, Stack Overflow라고 부른다. 따라서 Stack 영역이 커질 수록 Heap 영역은 작아지고, 반대로 Heap 영역이 커지면 Stack 영역은 작아진다.
4️⃣ Heap 영역이 지나치게 크다면?
위에서 말했듯이 Heap과 Stack 영역은 같은 공간을 공유하고 있기 때문에 크기는 계속해서 변화할 수 있다. 특히, Stack은 컴파일 시에 영역이 결정되지만 Heap은 런타임 시에 영역이 결정되기 때문이다. 그렇다보면 Heap 영역이 지나치게 커질 수도 있는데, 이러한 경우엔 어떠한 부작용이 있을까?
Heap 영역이 지나치게 작다면 GC(Garbage Collection)이 빈번하게 일어나지만 반대일 경우엔 GC가 한 번 수행될 때 수거해야할 garbage가 상대적으로 많아 수행시간이 길어진다. 이는 결국 메모리 낭비로 이루어지게 된다. 따라서 JVM에서도 처음부터 힙 영역을 너무 크게 잡지 않고 힙 영역이 꽉 차면 GC를 진행한 뒤, 힙 영역을 확장한다.
💡 Garbage Collection?
유효하지 않은 메모리를 Garbage라 부른다. 이러한 가비지가 많아지면 메모리 누수가 발생하기 때문에 Java나 Kotlin으로 개발하면 JVM의 Garbage Collector가 불필요한 메모리를 알아서 정리해준다.
❗ 출처
참고 사이트1 : https://all-young.tistory.com/17
참고 사이트2 : https://3uomlkh.tistory.com/288
'CS' 카테고리의 다른 글
[얼레벌레 공부하는 CS] 캐시메모리란? (1) | 2024.09.18 |
---|---|
메모리의 논리주소와 물리주소 (0) | 2024.06.28 |
[얼레벌레 공부하는 CS] 프로세스와 스레드 (1) | 2024.06.03 |
[얼레벌레 공부하는 CS] 운영체제 (0) | 2024.05.31 |
[얼레벌레 공부하는 CS] RAM (0) | 2024.05.28 |