유니티 엔진 (Unity Engine)

[Unity] C# Finalizer 와 Garbage Collector 동작에 대한 정리

원생계 2023. 12. 1. 16:38

 

 

C++의 소멸자(Destructor)와 C#의 Finalizer의 공통점과 차이점

공통점

문법적으로 ~Class() {...} 로 코딩

클래스 객체가 소멸될 때 리소스를 해제하기 위해 사용

 

차이점

C++ 의 소멸자는 delete myObj; 와 같이 명시적으로 호출 시기를 정할 수 있음.

C# 의 소멸자는 C++와 구분하기 위해 Destructor대신 Finalizer로 부름. Finalizer는 개발자가 그 호출을 명시적으로 결정할 수 없고, Garbage Collection 메커니즘에서 호출.

 

좀 더 구체적으로, C# 클래스에 Finalizer 가 존재하면, 해당 객체의 생성자 호출시 Finalization Queue라는 QC 내부 큐에 레퍼런스 추가. 이후, Managed Heap이 차서 GC처리를 할 때 아래를 따름.

- Finalization Queue 에 레퍼런스가 없는 객체는 Garbage로 판단, 삭제 처리.

- Finalization Queue 에 레퍼런스가 있는 객체는 Freachable Queue라는 다른 큐로 이동.

- GC의 Finalization Thread가 Freachable Queue의 객체들을 꺼내 Finalizer 호출.

- Finalizer 가 호출된 객체들은 다음 GC 시기에 삭제 처리.

 

즉,C# 클래스에 Finalizer 를 추가하면, GC 가 두 번 동작해야 최종적으로 삭제되기 때문에 메모리에 좀 더 오래 머물게 되고, 내부 Queue를 참조해야 하는 등 오버헤드도 발생함.

 

그래서, 클래스가 직접 리소스를 로드/언로드 하는 경우, Finalizer 대신 Dispose 패턴을 추가해 명시적으로 해제를 호출할 수 있음. Finalizer도 존재할 경우 아래 API를 호출해서 GC가 객체를 Freachable Queue 로 이동시키기 않고 즉시 삭제하게 할 수 있음.

void Dispose()
{
	//clean your resources
	...
	//let GC know about it
	GC.SuppressFinalize(this);
}

 

 

.NET, C#, CLR, GARBAGECOLLECTION
What do you know about Freachable queue?

https://nabacg.wordpress.com/2012/03/11/what-do-you-know-about-freachable-queue/

 

Freachable Queue

F-reachable 로 발음한다.

가비지 컬렉션의 최종화 부분에서 사용되는 CLR 가비지 컬렉터 내부 구조 중 하나.

 

 

참고 문서

MSDN Magazine

PART I

Garbage Collection: Automatic Memory Management in the Microsoft .NET Framework

https://learn.microsoft.com/en-us/archive/msdn-magazine/2000/november/garbage-collection-automatic-memory-management-in-the-microsoft-net-framework

 

PART II

Garbage Collection Part 2: Automatic Memory Management in the Microsoft .NET Framework

https://learn.microsoft.com/en-us/archive/msdn-magazine/2000/december/garbage-collection-part-2-automatic-memory-management-in-the-microsoft-net-framework

 

 


게임 개발에 필수적인 내용을 담는 명서들을 소개합니다.

 

<유니티 교과서 개정6판>(유니티 최신 버전) 구입 링크
https://link.coupang.com/a/be3P0t

 

유니티 교과서 개정6판

COUPANG

www.coupang.com


<리얼-타임 렌더링(REAL-TIME RENDERING) 4/e> 구입 링크
https://link.coupang.com/a/8VWas

 

리얼-타임 렌더링 4/e

COUPANG

www.coupang.com

 

<이득우의 게임 수학:39가지 예제로 배운다! 메타버스를 구성하는 게임 수학의 모든 것> 구입 링크
https://link.coupang.com/a/9BqLd

 

이득우의 게임 수학:39가지 예제로 배운다! 메타버스를 구성하는 게임 수학의 모든 것

COUPANG

www.coupang.com

 

유니티 에셋 스토어 링크
https://assetstore.unity.com?aid=1011lvz7h

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

(링크를 통해 도서/에셋 구입시 일정액의 수수료를 지급받습니다.)


 

728x90
반응형