일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
31 |
- 이벤트 함수 실행 순서
- KRAFTON JUNGLE
- 알고리즘수업-너비우선탐색2
- 4기
- 알고리즘
- 전쟁-전투
- 핀토스
- c#
- 크래프톤 정글 4기
- 네트워크
- TiL
- 크래프톤 정글
- 크래프톤정글
- 백준
- User Stack
- 추상클래스와인터페이스
- pintos
- kraftonjungle
- 오블완
- 다익스트라
- C
- 유니티
- BFS
- 연결리스트
- project3
- 크래프톤정글4기
- Unity
- 티스토리챌린지
- 파이썬
- anonymous page
- Today
- Total
말감로그
[C#] 가비지 컬렉터(GC) 동작 원리 본문
가비지 컬렉터의 동작 원리
Mark and Sweep 알고리즘을 사용하여 동작한다.
1. Mark : GC는 루트 오브젝트로부터 시작하여 모든 접근 가능한 객체들을 마킹한다.
2. Sweep : 마킹되지 않은 객체들을 힙에서 제거하여 메모리를 회수한다.
3. Compaction : 남아있는 객체들을 힙의 시작 부분으로 이동시켜 메모리 단편화를 줄인다.
.Net Framework GC에서는 세대별 가비지 컬렉션(Generation Garbage Collection) 의 기법을 사용한다.
가비지 컬렉션은 세대 기반으로 동작한다.
세대는 객체의 생존기간에 따라 나누어지며, GC는 세대별로 다르게 동작하여 효율성을 높인다.
C#의 GC는 0,1,2세대로 구분된다.
0 세대
새로 생성된 객체들, 마킹 빈도가 매우 잦다. 대부분 금방 수거되기 때문에 비용이 적다.
1 세대
0세대에서 살아남은 객체들, 마킹 빈도는 보통이다. 중간 수명 객체
2세대
1세대에서 살아남은 객체들, 마킹 빈도는 드물다. 전체 힙을 마킹해야하기 때문에 비용이 크다.
LOH
85,000 바이트 이상의 대형 객체(배열 등), 마킹 빈도 드물다. 2세대와 함께 마킹되고 기본적으로 Compact 수행 안함
세대를 나누는 이유?
세대를 나누는 이유는 최근에 생성된 객체는 수명이 짧고 오래된 객체는 수명이 길기 때문에,
이들을 구분하여 효율적으로 검사하고, 부분적으로 마킹하는 방식이 전체 힙을 매번 마킹하는 것보다 성능상 더 유리하기 때문입니다.
가비지 컬렉션의 과정
1. 객체 할당
새로운 객체는 0세대에 할당된다. 0세대가 가득 차면 GC가 발생한다.
2. 0세대 GC (Minor GC)
0세대에서 살아남은 객체들은 1세대로 이동한다. 0세대에서 살아남지 못한 객체들은 마킹되어 메모리가 해제된다. 빠르고 자주 발생한다.
3. 1세대 GC
1세대도 가득 차면 GC 발생. 1세대에서 살아남은 객체들은 2세대로 이동한다. 1세대의 가비지 컬렉션은 0세대보다 덜 자주 발생하지만 여전히 자주 발생할 수 있다.
4. 2세대 GC (Major GC)
2세대도 가득 차면 GC 발생. 2세대의 GC는 가장 드물게 발생하지만, 가장 비용이 많이 든다. 2세대에서 살아남은 객체들은 계속 2세대에 남아 있게 된다.
5. Full GC
.Net GC에서 가장 강력하고 비용이 많이 드는 프로세스. 0세대와 1세대 뿐 아니라 2세대(및 LOH)를 포함한 모든 힙 영역을 대상으로 수행된다. Full GC는 일반적으로 메모리가 부족하거나, 명시적으로 호출되었을 때 발생한다.
장점
1. 자동 메모리 관리
2. 메모리 누수 방지
3. 안정성 향상 : 객체가 더 이상 참조되지 않을 때 메모리를 해제하므로, 잘못된 메모리 접근으로 인한 오류 방지
4. 개발 생산성 향상
5. 메모리 단편화 감소 : 힙 메모리를 재배치하고 압축하여 메모리 단편화를 줄인다.
단점
1. 성능 오버헤드 : 주기적으로 실행되며, 이 과정에서 애플리케이션이 일시적으로 중단될 수 있다. 특히 Full GC는 긴 중단 시간을 유발할 수 있어 성능에 영향을 미친다.
2. 예측 불가능한 중단 : 예측할 수 없는 시점에 실행될 수 있으며, 이는 프로그램의 응답성에 영향을 줄 수 있다. 실시간 응답이 중요한 프로그램에서 문제가 될 수 있다.
가비지 컬렉션을 줄이기 위한 방법
1. 객체 재사용 : 오브젝트 풀링을 사용하여 빈번하게 생성되고 파괴되는 객체를 재사용
2. 구조체 사용 : 스택에 저장되는 값 타입(struct)을 사용하여 힙 할당을 줄인다.
3. 큰 객체 최소화하기 : 85KB 이상의 크기를 가지는 객체는 LOH에 할당되기 때문에 , 큰 객체 사용을 최소화한다.
3. 불필요한 할당 피하기 : 임시 객체의 생성을 최소화하고, 필요한 경우 메모리를 명시적으로 해제한다.
참고
'언어 > C#' 카테고리의 다른 글
[C#] 고급 문법 LinQ(링큐) 알아보기 (3) | 2025.08.09 |
---|---|
C# vs C++ (0) | 2025.04.04 |
Unity C# 기초 4. 제어문 if문 (조건문, 분기문) (0) | 2023.05.10 |
Unity C# 기초 3. 멤버변수, 지역변수 (1) | 2023.05.10 |
Unity C# 기초 2. 형변환(casting) (0) | 2023.05.10 |