[C#, Unity] Garbage Collector

DonghoShin·2021년 12월 15일
0

CS

목록 보기
1/1

참조 :

- 기능 프리뷰 점진적 가비지 컬렉션 Incremental GC

https://blog.unity.com/kr/technology/feature-preview-incremental-garbage-collection

- 자동 메모리 관리 이해

https://docs.unity3d.com/kr/current/Manual/UnderstandingAutomaticMemoryManagement.html?_ga=2.55900971.1632349521.1639539798-101285821.1638966553

- GarbageCollector Scripting API

https://docs.unity3d.com/2019.1/Documentation/ScriptReference/Scripting.GarbageCollector.html?_ga=2.256332171.1632349521.1639539798-101285821.1638966553

- 관리되는 힙의 이해

https://docs.unity3d.com/kr/2019.3/Manual/BestPracticeUnderstandingPerformanceInUnity4-1.html

- C# Closure

https://www.csharpstudy.com/DevNote/Article/26

들어가면 좋을 내용

C#의 Garbage Collector
C#의 동적할당 방식을 보면 Heap에서 다음 할당할 메모리 공간에 포인터만 놓고 그 뒤로 계속 포인터만 옮겨주면서 굉장히 빠른 할당을 보여준다.

GC는 수집하고 이 할당방식을 유지해주기 위해 reference가 되지 않은 가비지 메모리들을 탐색하고 수거하여 빈공간이 남지 않게 다 당겨준 뒤 할당될 공간에 포인터를 위치시켜준다.

세대별 가비지 컬렉션 소개

0세대, 1세대, 2세대로 분리되며 0세대부터 2세대 순으로 수집됨
CPU Hitting rate에서 나오는 공간 지역성, 시간 지역성의 원리에 따라 메모리가 부족한 상황이 아니면 0세대를 우선적으로 수집한다. 수집하고 부족하면 1세대를 수집하고 그래도 부족하면 2세대를 수집하는 방식으로 동작

그래서 GC.Collect를 사용자가 직접 호출하는 걸 지양해야한다. GC.Collect에서 살아남은 객체들은 각각 다음 세대로 승급하기 때문에 1세대와 2세대가 차지하는 분량이 늘면서 GC가 Collect하는 횟수가 늘어날 수 있다. 혹은 불필요하게 많은 탐색을 해야할 수 있다.
그로 인한 문제점
-> 그래서 등장한 Incremental GC(Experimental)
점진적 GC
GC spike(기존 사용방식이 stop the world 방식으로 메모리 수거할때 모든 스레드를 잠시 멈추고 GC를 완료한 후에 다시 동작, 걸리는 시간은 메모리 수거양에 따라 수백ms까지 나옴
그리고 멈췄다가 다시 돌아오는 과정에서 프로파일러에 가시[Spike]처럼 CPU 사용량이 높게 치솟은 모양을 말함)를 완화하기 위함
특정 초 마다 약간씩 수거하면서 전체적으로 프레임 저하를 일으키지 않고 안정적인 성능을 유지하기 위해 등장

profile
NdotLight 클라이언트 프로그래머

0개의 댓글