728x90
반응형
가비지 컬렉션 이란 ?
- 가비지 컬렉션(Garbage Collection, GC)은 메모리 관리를 자동화하는 기능.
- 더 이상 사용되지 않는 객체를 자동으로 찾아서 메모리를 해제하는 역할을 함.
- 스택 메모리의 경우 함수의 실행 순간부터 종료까지 공간 사용량을 추적한다.
- 하지만 힙 메모리는 C++과 같은 경우에는 메모리 관리가 수동으로 이루어지기 때문에 생성자와 소멸자를 명시적으로 정의해야 함.
- C#은 가비지 컬렉션을 통해 자동으로 메모리를 관리하기 때문에 생성자는 필요하지만, 소멸자는 대부분의 경우 필요하지 않다.
가비지 컬렉션의 동작 방식
- 마킹(Marking) : 가비지 컬렉터는 루트 참조부터 시작하여 모든 접근 가능한 객체를 마킹함.
- 분류, 재배치 (Relocate) : 사용되지 않는 개체들을 식별하는 작업.
- 압축 (Compacting) : 마킹되지 않은 객체를 해제하고, 살아남은 객체를 힙의 앞쪽으로 이동시켜 메모리 단편화를 줄임
- 객체 이동 : 살아남은 객체를 이동시키고, 참조를 업데이트함.
가비지 컬렉션의 동작 순서
1. 마킹 (Marking)
- 마킹 단계는 사용 중인 객체와 사용되지 않는 객체를 식별하는 과정
- 초기 단계의 가비지 콜렉터는 일단 모든 객체를 가비지로 가정함
- 루트 집합(Root Set): 프로그램의 루트에서 시작하여 각 루트에서 참조하고 있는 모든 객체를 탐색함.
- 도달 가능한 객체(Mark Phase): 모든 객체를 마킹한 후 도달 가능한 객체는 힙에서 살아남으며, 도달할 수 없는 객체는 가비지로 간주됩니다.
2. 분류, 재배치 (Relocate)
- 루트 목록에서 도달할 수 없는 가비지로 간주한 객체 이외에 살아남은 객체들을 재배치함.
- 이 작업은 메모리 단편화*를 줄여주는 역할을 함.
*메모리 단편화 = 메모리 할당과 해제 과정에서 발생하는 현상으로, 사용 가능한 메모리가 여러 개의 작은 조각으로 나뉘어 있는 상태를 말함, 즉 사용 가능한 메모리가 있어도 제대로 할당하지 못하는 상태임
3. 압축 (Compacting)
- 압축 단계는 재배치 후 남아 있는 가비지를 제거하고 힙을 정리하는 과정임.
- 루트 목록 조사 후 가비지 컬렉터가 힙 메모리를 돌면서 접근 가능한 object들을 메모리 복사를 통해 덮어 씌운다.
4. 객체 이동
- 참조 업데이트: 객체가 이동하면 해당 객체를 참조하는 모든 참조가 올바른 새 위치를 가리키도록 업데이트 한다.
- 힙의 정리: 이동된 객체의 원래 위치는 해제되고, 힙의 연속된 메모리 블록을 확보함.
요약
- 가비지 컬렉션이 필요한 이유
- 자동 메모리 관리: 개발자가 수동으로 모든 메모리를 해제하지 않아도 됨.
- 메모리 단편화 방지: 재배치와 압축을 통해 힙의 연속된 메모리 블록을 유지하여 단편화를 방지함.
- 프로그램 안정성 향상: 메모리 누수와 잘못된 메모리 참조를 줄여 프로그램의 안정성을 높임.
가비지 컬렉션은 프로그램이 자동으로 메모리를 관리해주는 아주 편리한 도구이다!
사진 출처 : https://www.geeksforgeeks.org/garbage-collection-in-c-sharp-dot-net-framework/?ref=gcse
Garbage Collection in C# | .NET Framework - GeeksforGeeks
A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.
www.geeksforgeeks.org
728x90
반응형
'C#' 카테고리의 다른 글
C# - 라이브러리 vs 프레임워크 (2) | 2024.07.11 |
---|---|
C# - Struct 와 Class의 차이점 (0) | 2024.06.21 |
C# - 스레드(Thread) (1) | 2024.06.18 |
C# - 동기와 비동기 (Synchronous/Asynchronous) (0) | 2024.06.13 |
C# - System / Collections / Generic Collection (0) | 2024.06.11 |