| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
- MonoBehaviour
- rookiss
- 자료구조
- std::unordered_map
- 기술면접
- 배열
- 해쉬맵
- 인프런
- c#
- vector
- 차이점
- 리스트
- 알고리즘
- 프래그멘테이션
- Queue
- 힙영역
- 큐
- thread
- 벡터
- 트리
- 공부
- 스택
- 객체지향
- std::map
- static_cast
- 반복문
- map
- list
- 스택영역
- 멀티쓰레드
- Today
- Total
호빵의 IT 개발소
[C#] 가비지 컬렉션(GC, Garbage Collection) 본문
가비지 컬렌션(Garbage Collection)
- 메모리 관리 기법 중의 하나로, 프로그램이 동적으로 할당했던 메모리 영역 중에서 필요 없게 된 영역을 해제하는 기능
장점
| 1. 유효하지 않은 포인터 접근(이미 해제된 메모리에 접근하는 버그) 2. 이중 해제(이미 해제된 메모리를 중복 해제하는 버그) 3. 메모리 누수(더 이상 필요하지 않은 메모리가 해제되지 않고 남아있는 버그) |
단점
| 1. 어떤 메모리를 해제할 지 결정하는 데 비용이 든다. 2. GC가 일어나는 타이밍이나 점유 시간을 미리 예측하기 힘들다. 3. 할당된 메모리가 해제되는 시점을 알 수 없다. |
★Garbage Collection은 '정리되지 않은 메모리', '유효하지 않은 메모리 주소'를 말한다.
C, C++은 불필요한 메모리가 있다면 직접 delete나 free를 이용하여 메모리를 확보했습니다. 하지만 Java나 C#의 경우 Garbage Collection을 사용하여 객체가 참조하고 있지 않은 메모리들을 해제할 수 있습니다.
GC 메소드
GC.Collect
- 모든 세대(0~2세대)의 GC를 즉시 수행
- GC를 실행할 세대 지정 및 강제 실행 지정, 백그라운드 GC차단, 메모리 압축에 대한 파라미터 제공
GC.CollectionCount(int 32)
- 지정 된 세대에 대한 GC 수행 횟수를 반환
GC 세대별
- 메모리를 구역별로 나누어 빨리 해제될 객체와 오래 남아있을 객체를 각각 관리.
- 메모리를 0, 1, 2세대로 구분하여 0세대는 방금 생성된 객체나 빨리 사라질것 같은 객체, 2세대는 오래 남을 것으로 예상되는 객체로 나눔
작동 방식
- 어플리케이션 실행 후 힙에 할당(0세대)하다가 할당된 총 크기가 0세대 GC의 임계치에 도달하면 0세대 가비지 컬렉션을 수행
- 살아남은 일정 횟수의 GC를 겪은 객체는 1세대로 이동
- 1세대 임계치 도달시 1세대 GC, 2세대 임계치 도달시 2세대 GC로 반복
- 세대별 GC 실행시에는 이전 세대 또한 포함해서 진행 - 0세대 GC 실행시 0세대만 실행, 1세대 GC 실행시 0, 1세대 실행, 2세대 GC 실행시 0, 1, 2세대 실행(Full GC)
- GC 실행시 어플리케이션 실행이 잠시 멈추고 GC를 실행(어플리케이션 메모리가 커지면 Full GC의 오버헤드도 커지게 되고 정지 시간 또한 늘어나게 되어 실시간 프로그램에서는 GC가 효율적으로 동작 할 수 있도록 신경 써야함)
객체 크기별 GC 작동 방식
SOH(Small Object Heap)
- SOH는 용량이 작은 객체(85KB 미만)
- 세대별 GC방식을 사용
LOH(Large Object Heap)
- LOH는 용량이 큰 객체(85KB 이상)
- C/C++ 방식과 유사하게 할당, GC에서 해제 하지만 메모리 컴팩션이 일어나지 않음(해제되면 그냥 냅둠)
- 용량이 큰 경우 오히려 메모리를 재배치하는 오버헤드가 크기 때문에 2세대 GC에서만 메모리를 해제한다.(2세대 GC에서만 메모리 해제해도 많은 오버헤드 발생) 2세대 GC가 자주 일어나지 않게 해야하고 큰 용량의 생성, 해제도 반복하지 않는 것이 좋다.
*메모리 컴팩션 : 동적으로 시스템을 구성하는 기억 장소에서, 여러 곳에 흩어져 있는 가용 공간을 하나의 연속된 공간으로 만드는 작업. 기억 장소의 할당과 반납 과정에서 일어난 단편화 현상을 제거한다.
기술 면접 대비!
가비지컬렉션이란? 어떻게 동작되는지?
-사용하지 않는 메모리를 회수하여 힙(heap) 메모리가 가득차면 자동으로 해제
C#에서 Struct는 가비지컬렉션이 도는가?
- 밸류타입(value type)이기 때문에 스택(stack)영역에 메모리가 할당되고, 힙(heap) 영역에 생성된 것이 아니기 때문에 가비지컬렉션(GC)이 돌지 않음
세대별 GC
-메모리를 0, 1, 2세대로 구분하여 0세대는 방금 생성된 객체나 빨리 사라질것 같은 객체, 2세대는 오래 남을 것으로 예상되는 객체로 나눔
-세대별 GC 실행시에는 이전 세대 또한 포함해서 진행 - 0세대 GC 실행시 0세대만 실행, 1세대 GC 실행시 0, 1세대 실행, 2세대 GC 실행시 0, 1, 2세대 실행(Full GC)
LOH, SOH
-SOH는 용량이 작은 객체(85KB 미만)로 세대별 GC방식을 그대로 사용합니다. LOH는 용량이 큰 객체(85KB 이상)로 C/C++에서 하는 방식과 유사하게 할당하고 GC에서 해제하지만 메모리 컴팩션일 일어나지 않습니다.
참조 및 출처 : https://chlqhqodlekt.tistory.com/66
'CS(전공지식) > 프로그래밍언어' 카테고리의 다른 글
| [C/C#] 업캐스팅, 다운캐스팅 (0) | 2022.06.23 |
|---|---|
| [C#] 디자인 패턴 (0) | 2022.06.22 |
| [C#] 박싱과 언박싱 (0) | 2022.06.21 |
| [C/C#]델리게이트(delegate), 이벤트 (event) (0) | 2022.06.20 |
| [C/C#] 지역 변수, 전역 변수 (0) | 2022.06.20 |