반응형
SMALL
GC (Garbage Collection)
1. GC의 정의

- 쓰레기 수집(garbage collection 가비지 컬렉션, GC)은 메모리 관리 기법 중의 하나로, 프로그램이 동적으로 할당했던 메모리 영역 중에서 필요없게 된 영역을 해제하는 기능이다. (중략) 1959년 무렵 리스프의 문제를 해결하기 위해 존 매카시가 개발하였다.
- 더 이상 사용할 수 없게 된 영역이란, 어떤 변수도 가리키지 않게 된 영역을 의미한다. = 참조하지 않게된 영역
- 출처 : 위키백과
2. 장단점
- 장점
- 프로그래머가 동적으로 할당한 메모리 영역의 전체를 완벽하게 관리할 필요가 없어진다.
- 이미 메모리에서 해제된 유효하지 않은 포인터에 대한 접근을 막을수 있다.
- 이미 해제된 메모리를 또다시 해제하는 일을 막을 수 있다. (이중 해제)
- 더이상 필요하지 않은 메모리가 해제되지 않고 남아있는 일을 막을 수 있다. (메모리 누수)
- 단점
- 어떤 메모리를 해제해야할지 결정하는데 드는 비용이 발생한다. = 객체가 필요 없어지는 시점을 프로그래머가 알고 있는 경우에도 쓰레기 수집 알고리즘은 독자적으로 메모리 해제 시점을 추적해야 하므로 오버헤드가 발생한다.
- 쓰레기 수집이 일어나는 타이밍이나 점유 시간을 미리 예측하기 힘들다. = 실시간 시스템에는 적합하지 않다.
- 할당된 메모리가 해제되는 시점을 정확하게 알 수 없다.
3. 포인터 추적 방식 (참조되지 않는 메모리 추적 방식)
- 종류
- 표시하고 쓸기 (mark and sweep)
- 삼색 표시 기법
- 객체 이동 기법
- 세대 단위 쓰레기 수집
- Boehm-Demers-Weiser(BDW)
- 위와 같은 종류의 추척방식이 있으나 .Net에서 사용되는 알고리즘인 표시하고 쓸기 (mark and sweep) 와 유니티에서 사용되는 알고리즘인 Boehm-Demers-Weiser(BDW) 위주로 설명
4. 표시하고 쓸기 (mark and sweep) 방식
- 정의
- 가비지 컬렉션의 한 형태로, 동적으로 할당된 메모리에서 사용되지 않는 객체를 식별하고 해당 객체의 메모리를 해제하는 메커니즘.
- 두 단계로 구성: 마크(Mark) 단계와 스윕(Sweep) 단계.
- .Net 프레임 워크에서 사용되며 0~2세대 까지 총 3개의 세대를 통해 관리.
- 단점으로는 일시 중지(pause)가 발생할 수 있다 = 실시간 시스템이나 반응성이 중요한 응용 프로그램에서는 부적합할 수 있다.
- 특징
- 두단계의 프로세스
- 트레이싱 가비지 컬렉션
- 객체들 간의 도달 가능성을 추적
- 전체적인 중지(Stop-the-World)
- 실행중인 프로그램을 중단시킬수 있음
- 메모리 회수 및 가용 리스트
- 사용되지 않는 객체가 식별되면 해당 객체들의 메모리가 해제되고 가용메모리 리스트에 추가
- 효율적인 가용 메모리 관리
- 유연성 및 범용성
- (비교적)간단한 구현
- 단계
- 마크(Mark) 단계
- 루트(Root) 객체 식별: 가비지 컬렉션은 루트 객체를 식별, 루트 객체는 프로그램이나 쓰레드에서 직접적으로 접근 가능한 객체로서 가비지 컬렉션의 출발점.
- 마크(Mark): 루트 객체에서 시작하여 모든 접근 가능한 객체를 찾아 마크. (이 단계에서는 사용 중인 객체에 마크를 표시하고, 이미 마크된 객체는 다시 마크하지 않는다.)
- 접근 가능한 객체 이외의 객체에 대한 마크 제거: 마크되지 않은 객체는 사용되지 않는 것으로 간주된다. (따라서 마크되지 않은 객체에 대한 마크를 제거.)
- 스윕(Sweep) 단계
- 사용되지 않는 객체 식별: 마크되지 않은 객체는 사용되지 않는 객체로 간주.
- 해제 및 메모리 회수: 사용되지 않는 객체에 할당된 메모리를 해제하고, 이 메모리를 가용 메모리 풀에 반환.
- 마크(Mark) 단계
5. Boehm-Demers-Weiser(BDW) 방식
- 정의
- 미국의 컴퓨터 과학자들인 Hans-Juergen Boehm, Alan J. Demers, Mark S. Weiser에 의해 개발
- 명시적인 메모리 할당과 해제를 피하고, 프로그래머가 동적으로 할당한 메모리를 자동으로 추적하고 해제함으로써 메모리 누수를 방지한다.
- 유니티에서 사용되는 GC 알고리즘의 기반이다. (정확히는 유니티는 자체적으로 변경한 GC 알고리즘을 사용한다.)
- mark and sweep 방식인것은 똑같지만 세대구분이 없고, 메모리 정렬또한 없다.
- 특징
- Conservative Garbage Collection (보수적 가비지 컬렉션)
- 포인터를 정확하게 추적하지 않고 주소로 부터 시작되는 모든 객체를 추적 = 정확한 포인터 정보가 없는 상황에서도 가비지 컬렉션 수행 가능
- 스택 스캐닝(Stack Scanning)
- 실행중인 쓰레드의 스택을 스캔 => 포인터 추출 => 도달가능 객체 식별
- 실행중인 프로그램의 런타임 상태를 반영하여 가비지 컬렉션을 수행
- 메모리 모델의 보존
- 메모리 할당 및 해제 기능을 변경하지 않고 가비지 컬렉션을 적용 = 기존 코드와의 호환성이 좋아짐
- 스레드 안전성(Thread Safety)
- 다중 쓰레드 환경에서도 안전하게 동작
- 모바일 및 임베디드 환경 지원
- 제한된 메모리 환경에서 효율적인 가비지 컬렉션을 제공하는데 도움이 된다.
- 강한 호환성
- 대부분의 플랫폼 지원
- Conservative Garbage Collection (보수적 가비지 컬렉션)
- 단점
- GC Spike 문제가 유니티에서 발생 (GC가 활성화 된 동안 프로그램이 임의로 중단되는 현상 = 프로그램이 끊어짐)
- 이를 해결하기 위해 Unity 2019.1부터는 점진적 GC (Incremental Garbage Collection)라는 개념이 도입.
6. 점진적 GC (Incremental Garbage Collection)
- 유니티에서 프로그램이 GC가 활동하는 순간마다 끊기는 GC Spike 현상 혹은 부드러운 사용자 경험등을 위해 Unity 2019.1부터 도입하였다.
- Unity 창의 Edit => Project Settings => Player => Other Settings => Use incremental GC 항목 체크로 사용 가능
(디폴트 값으로 체크 되어있다.)

- GC 수행과정을 여러개로 나누어 수행하는 만큼 전반적인 프레임당 GC 처리량은 늘어나겠지만 메모리가 부족한 모바일 플랫폼등에서는 성능향상이 뚜렷하게 타날수 있다.
- 오브젝트 풀링 등을 이용해 이를 줄일 수도 있다.
반응형
LIST
'CS > CS 정리' 카테고리의 다른 글
| [CS] 디자인 패턴 간단 정리 (0) | 2023.12.17 |
|---|---|
| [CS] OOP의 4가지 특징 간당 정리 (0) | 2023.12.15 |
| [CS] DB의 종류 (0) | 2023.04.24 |
| [CS] 데이터베이스 (1) | 2023.04.22 |
| [CS] 멀티 프로세싱 & 멀티 스레딩 간단 정리 . 2 (1) | 2023.04.15 |