Learning
When: 1학년 8월 11일
How:
심화반 수업에서 StringBuilder에 대한 내용이 나오며 동시에 가비지 컬렉터가 성능을 저하시킨다는
내용이 나왔는데, GC가 성능을 저하시킨다는 말은 들었지만 정확히 어떻게 작동하는 건지
잘 몰랐기 때문에 공부하게 되었습니다.
Understanding:
- 정의 : 가비지 컬렉터는 힙의 쓰레기 값을 청소하는 청소기입니다. 참조 형식의 변수는 스택에
주소를 저장하고, 그 주소가 가리키는 힙의 공간에 값을 할당하는 방식으로 값을 저장하는데,
만약 주소를 저장하지 않고 다른 힙의 값을 참조한다면(주소가 바뀐다면)
원래 참조하고 있던 값은 다시는 참조할 수 없게 됩니다. 그러면 그 값은 필요가 없어지는 것이죠.
여기서 이 값을 지워야 하는데, C++ 같은 다른 언어는 쓰지 않는 객체를 직접 지워줘야 하지만 C#은
가비지 컬렉터라는 친구가 알아서 청소를 해줍니다. 하지만 참 고마운 동시에 성능 저하를
일으키기 때문에 잘 관리해야 하는 양날의 검 같은 친구입니다. - 성능 저하 이유 : 가비지 컬렉터는 쓰레기 객체를 지우는 역할을 하는데, GC가 검사를 하고 난 후에도
참조를 계속 바꾸면 GC가 검사한 객체와 실제 객체의 참조 유무의 차이가 발생할 수 있기 때문에
Stop-The-World라는 방식을 사용하여 메인 스레드를 포함한 모든 연산을 멈춰버립니다.
게임에선 이 타이밍에 갑자기 프레임이 끊겨버리기 때문에 다른 웹사이트나 앱에 비해 이 가비지 컬렉터를
관리하는 것이 훨씬 중요하게 됩니다. Stop-The-World를 사용한 후, 일단 많은 객체를 검사하기
때문에 시간이 걸리고, 객체를 지워서 생기는 남는 공간을 알차게 사용하는 메모리 압축을 수행할
때도 시간이 많이 걸리기 때문에 이런 시간을 줄이기 위해 관리해주어야 하는 것입니다. - 관리법 : 게임을 개발할 때는 가비지 컬렉터를 잘 관리해 주어야 한다는 것은 알겠는데,
관리는 어떻게 해주어야 할까요? 간단하게 객체, 쓰레기 객체를 만들지 않으면 됩니다.
그것 말고는 게임의 로딩창에서 가비지 컬렉터를 돌려주는 등 약간의 꼼수를 사용하여
UX를 해치지 않게 하는 방법이 있습니다.
그럼 객체와 쓰레기 객체를 만들지 않는 방법은 또 무엇일까요. 엄청나게 많은 상황이 있겠지만
객체의 생성과 삭제를 줄일 수 있는 대표적인 상황이 string 값을 계속 바꿔줄 때, 게임 오브젝트의
생성과 삭제를 계속 반복할 때, 코루틴을 사용할 때 yield return new 를 계속 사용하는 상황 등이
있습니다. 각각 StringBuilder를 사용, 오브젝트 풀링, 캐싱을 사용하여 최적화할 수 있습니다.
Result: 가비지 컬렉터는 프로그래머의 편의를 위해 만들어진 것이지만 얻는 점이 있으면 잃는 점도 있기 마련입니다. 특히 게임을 개발할 때는 가비지 컬렉터로 인한 프레임 드랍에 신경 쓰며 개발해야 합니다.
'C#' 카테고리의 다른 글
| [C#] Notify Value (0) | 2025.08.19 |
|---|---|
| [C#] StringBuilder (1) | 2025.08.12 |
| [C#] 2차원 배열 (3) | 2025.08.10 |
| [C#] SOLID 원칙 (5 : D/DIP) (2) | 2025.08.10 |
| [C#] SOLID 원칙 (4 : I/ISP) (1) | 2025.08.08 |