본문 바로가기
Programming/Basic

가비지 컬렉션(Garbage Collection, GC)

by Blemish 2022. 7. 2.
  • 가비지 컬렉션을 이해한다.

 

가비지 컬렉션

  • Managed Heap에서 더 이상 사용하고 있지 않는 객체들을 삭제하는 프로세스를 가비지 컬렉션이라고 한다.

 

Heap 영역에 있는 객체(Object)들은 Method Area, Stack, Heap 내의 다른 객체들에 의해서 참조가 될 수가 있다. 참조가 되고 있는 객체들을 Reachable 객체라고하며 반대는 Unreachable 객체라고 한다. 객체가 Reachable, Unreachable 객체인지 판단할 수 있는 방법은 GC가 GC root에서부터 시작해서 하나씩 참조하고 있는 객체들을 조사하여서 판단할 수 있다.

 

GC는 동작 순서가 있는데 Mark, Sweep, Compact가 있다.

  • Mark : GC가 객체들을 조사하여 Reachable, Unreachable 객체로 Mark 표시한다.
  • Sweep : Unreachable 객체를 Heap에서 제거한다
  • Compact : Unreachable 객체들이 제거된 후에 Reachable 객체를 한 곳으로 모아 메모리 단편화를 막는다.

위처럼 GC는 Reachable, Unreachable 한 객체를 조사하고 Heap에서 제거하고 한 곳으로 모으는 역할을 한다.

 

Heap 영역내 GC 발생

 

Heap은 크게 Young, Old generation으로 나뉘며 Young generation에는 Eden, Survivor 0, 1로 나뉜다. 

 

새로운 객체들을 Eden 영역에 할당되게 된다.

 

 

Eden에 더 이상 객체들이 할당될 수 없을 때 Young Generation에서 Minor GC가 발생하게 된다. 이 때 GC가 Reachable, Unreachable 객체들을 판단한다.(Mark)

Reachble 객체는 Surviovr 0으로 옮기게 되고 나머지 Unreachable 객체들을 GC가 제거하게 된다.(Sweep)

이 때 Reachable의 객체에는 age가 붙게되며 MinorGC가 발생해서 계속 살아남으면 age를 증가시킨다.

 

Eden 영역이 또 Full 상태가 되면 이번에는 Survivor 1으로 이동하게 된다.(번갈아 가며 작업)

이 때 Survivor 0, 1 중 어느 곳이라도 한 곳에 데이터가 존재하게 되면 다른 한 곳에서는 비워져 있어야 한다.

Reachable 객체가 특정 age를 넘어서게 되면 객체를 Old Generation으로 이동시킨다.

 

Old generation에 객체가 가득차게되면 Major GC가 발생하게 되고 GC가 Unreachable 객체를 제거한다.

 

GC 설계자는 다음과 같은 전제조건으로 GC를 설계를 했다

1. 대부분의 객체들은 금방 접근 불가능한 상태가 된다. -> Garbage

2. 오래된 객체는 새로운 객체를 거의 참조하지 않는다.

 

 


 

유니티에서 GC 발생을 예방하거나 줄일 수 있는 방벙

  • 오브젝트 풀링(Object pool)를 사용하여 오브젝트 생성 및 해제할 때 사용되는 비용을 줄인다.
  • stringBuilder 사용
  • 동적 string 사용을 적게한다.(ex: string.name -> nameof/ string.tag -> compareTag)
  • GetComponent 사용을 줄인다 (ex: Getcomponent -> tryGetcomponent)
  • Struct 구조체 사용 시 IEquatable 인터페이스를 사용하여 Equals를 오버라이드해서 사용한다.
  • 코루틴 사용시 null을 사용한다(ex: yield return 0 -> null) / new 반복사용 자제
  • 적절한 Dispose 사용
  • object를 boxing, unboxing 자제

Use Incremental GC 사용(2019.x 이상)

 

예측할 수 없는 상황에서  Memory Leak이 발생하지 않기 위해서 수시로 Profiler를 사용한다.

 

 

 

 

 


참고자료

https://www.youtube.com/watch?v=Fe3TVCEJhzo&t=323s&ab_channel=%EC%9A%B0%EC%95%84%ED%95%9CTech

'Programming > Basic' 카테고리의 다른 글

메모리 구조  (0) 2022.07.03
[OS] 프로세스, 쓰레  (0) 2022.07.01
SOLID 원칙 (1)  (0) 2021.05.11
객체지향의 원리 - 캡슐화  (0) 2021.05.07
객체지향의 원리 - 추상화  (0) 2021.05.03

댓글