내일배움캠프/TIL

내일배움캠프 11일차 TIL - GC(가비지 컬렉터)

서보훈 2024. 9. 27. 20:51

금일 C# 체크리스트 특강에서 나온 김에 가비지컬렉터에 대해서 정리해보고자 합니다.

 

개인적으로는 C#의 장점이자 단점으로 생각하고있는 가비지 컬렉터 기능은 메모리에서 더이상 사용하지 않는 객체를  해제하는 기능으로, 이를 지원하지 않는 C, C++ 등에서는 객체를 생성한 뒤, 사용하지 않는 시점에 직접 메모리를 해제해 주어야 합니다.

 

개발자가 직접 메모리를 해제하지 않아도 스스로 메모리를 해제해주는 기능인데 어째서 단점이 존재하는걸까요?

단점

  • 프로그램의 성능이 떨어진다
  • 필요할 때 즉시 메모리를 해제해줄 수 없다.
  • 언제 메모리가 해제될지 모른다.

사실 초심자 입장에서는 메모리가 해제되는 시점은 큰 문제가 되지 않습니다.

하지만 가장 큰 단점으로 프로그램의 성능이 떨어진다는 문제점이 있습니다.

 

이는 가비지컬렉터가 작동할때는 다른 스레드들이 작동을 일시 정지한뒤 GC를 사용하여 메모리를 정리하고 다시 스레드의 작동이 시작하기때문입니다.

 

이런 문제때문에 유니티나 C#에서는 가비지 컬렉터를 최소한으로 호출하도록 해주는것이 성능에 큰 영향을 줍니다.

가비지 콜렉터의 작동에는 힙 영역의 메모리가 얼마나 차있는가가 영향을 주며, 유니티에서는 오브젝트 정보등도 힙 영역에 저장됩니다.

 

따라서 적을 공격하는 총알 오브젝트를 오브젝트 풀링을 이용하여 재황용하는등의 방식으로 가비지 컬렉터의 호출을 최소화하여 프로그램의 성능을 확보하는것이 중요합니다.

 

단점만 있다면 이 기능을 사용할 이유가 없을것입니다.

장점

  • 사용하지 않는 메모리를 자동 해제해 메모리 누수를 막을 수 있다.
  • 사용중인 메모리를 도중에 해제하여 발생하는 오류를 막을 수 있다.

가비지 컬렉터 기능을 사용하지 않는 언어들은 개발자가 직접 생성한 객체의 메모리를 해제해주어야 합니다.

이때 사용하지 않게된 객체를 해제하지 않으면 흔히 말하는 메모리 누수 문제가 발생하게 되어 프로그램 성능에 문제가 생기게됩니다.

 

또한 객체를 사용중인데 개발자의 실수로 메모리를 해제하게 될경우 큰 오류가 발생할 수도 있습니다.

 

이러한 객체관련 오류를 막아주는 역할덕분에 성능저하 문제가 있더라도 가비지 컬렉터를 사용합니다.