![가비지 컬렉터(garbage collector)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpWXOV%2FbtrI9nsmxyW%2FqarH3LmqDFfvAdXiLbQXMK%2Fimg.jpg)
가비지 컬렉터
가비지란 무엇일까?
- 가비지란 참조자가 없는 인스턴스를 말한다.(메모리 누수)
가비지 컬렉터란?
- 가비지 컬렉터는 자동 메모리 관리자 역할을 한다.
- 어플의 메모리 할당 및 해제를 관리한다.
가비지 컬렉터의 이점
1.
C에서는 calloc,malloc - free
C++에서는 New - Delete로 메모리를 직접 할당하고 해제를 해줘야 했는데
C#에서는 가비지 컬렉터가 있기때문에 개발자들은 메모리 관리 작업을 수행하기위해 코드를 작성할 필요가 없어졌다.
실수로 할당한 메모리를 해제하지 않아 메모리 누수를 걱정 할 필요가 없고
이미 비워진 객체에 메모리를 참조하는 등의 문제점을 해결 할 수 있다.
2. 관리되는 힙에 효율적으로 개체들을 할당한다.
3. 사용되지 않는 개체를 회수, 메모리를 비우고 다시 이메모리를 사용할 수 있도록 한다.
4. 개체가 다른 개체에 할당된 메모리를 사용할 수 없도록 하여 보안을 제공한다.
메모리에 대한 기본사항
1.
각 프로세스는 고유한 개별 가상주소 공간이 있다.
기본적으로 32비트 컴퓨터에서는 각 프로세스에 2기가의 가상 주소 공간이 포함된다.
2.
개발자들은 가상주소의 공간을 사용하는 것이며, 실제 메모리는 직접적으로 조작하지 않는다.
가비지 컬렉터는 관리되는 힙에서 개발자 대신 가상 메모리를 할당 및 해제를 한다.
3. 가상 메모리는 3가지의 상태가 있음
Free
메모리 블록에 가상 메모리에 대한 참조가 없는 상태
Reserved
메모리 블록을 사용자의 작업에 사용 가능, 다른 할당 요청에는 메모리 블록을 사용할수 없음.
하지만 커밋되기 전까지는 메모리 블록에 데이터를 저장할 수 없음
Committed
메모리 블록이 실제 스토리지에 할당되어 있음
4.
가상 주소 공간은 조각화될 수 있다.
차곡 차곡 채워지는것이 아니라 블록들 사이에 구멍이라고 부르는 빈 블록이 존재한다.
예를들어 2GB의 가상 메모리 할당 요청이 들어온다면 가상 메모리 관리자는 이 할당 용량을 만족시킬 수 있는 큰 빈공간을 찾아야한다.
메모리의 2GB의 여유공간이 있는데 이 여유공간이 한 공간에 있는것이 아니면 할당에 실패할수도 있다.
가비지 수집 조건
1. 시스템의 실제 메모리가 부족한 경우
- OS의 메모리 부족 알림 또는 호스트에서 표시되는 메모리 부족알림을 통해 감지된다.
2. 관리되는 힙(managed heap)의 할당된 개체에 사용되는 메모리가 허용되는 임계값을 초과한경우
3. GC.Collect 메서드가 호출된경우.
- 가비지 컬렉터는 지속적으로 실행되기 때문에 이 메서드를 호출해야 하는 경우는 거의 없다.
Managed Heap
CLR에 의해 가비지 컬렉터가 초기화되고 나면 가비지 컬렉터가 개체를 저장 및 관리하기 위해 메모리 세그먼트를 할당한다. 이 메모리를 Managed Heap이라고 한다.
- 관리되는 각 프로세스마다 Managed Heap이 있다. 프로세스의 모든 스레드는 같은 힙에 개체 메모리를 할당한다.
- 가비지 컬렉터가 메모리를 예약하기 위해서는 Windows VirtualAlloc 함수를 호출해서 관리하는 어플리케이션을 위해 하나의 메모리 세그먼트를 예약한다.
또, Windows VirtualFree 함수를 호출하여(세그먼트에서 개체를 지운 후에) 세그먼트를 운영체제로 돌려보낸다.
- 힙에 할당되는 개체수가 적을수록 가비지 컬렉터의 할 일도 줄어든다.
-> 필요 이상의 값을 사용하지 말자
- 가비지 수집의 빈도와 지속시간은 할당 규모 및 Managed Heap에서 남은 메모리의 크기에 따라 결정된다.
세그먼트?
컴퓨터 프로그램에서, 대형 프로그램을 조각으로 나누어 주기억 장치에 다운로드할 때 나누어진 한 조각.
참고 문서
가비지 수집 기본 사항
가비지 수집기의 작동 원리와 최적 성능으로 구성하는 방법에 대해 알아봅니다.
docs.microsoft.com
'프로그래밍 공부 > C# 프로그래밍' 카테고리의 다른 글
[Unity_C#] Switch문 & Switch 식 (0) | 2022.08.21 |
---|---|
클래스와 구조체 / 배열과 리스트 / awake와 start의 차이 (0) | 2022.08.11 |
Object 형식과 박싱 & 언박싱 (0) | 2022.08.08 |
[OOP]객체 지향 프로그래밍에 대해 (0) | 2022.07.06 |
코루틴(Coroutine)에 관한 고찰 (0) | 2022.06.12 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!