1.가비지 컬렉션은 시스템에서 더 이상 사용하지 않는 동적 메모리 블럭을 찾아 자동으로 해제해 주는
메모리 관리 방법 입니다.
2.가비지 컬렉터(garbage collector)는 자동 메모리 관리 시스템으로
프로그램에 의해 할당된 메모리가 더이상 인스턴스를 참조하지 않아
가비지(garbage) 상태가 되면 자동으로 메모리를 초기화해주는 프로그램입니다.
프로그램을 실항 할 떄 메모리를 관리하는 os프로그램 실해에 필요한 메모리를 요청하게 되고, 이때 메모리를
어디에 저장할지 그 주소를 할당하는데 이 주소를 offset 주소라고 부른다.
이 할당된 메모리들은 프로그램이 돌아가면 필연적으로 가비지가 발생하게 된다. 기존에 가리키고 있던 메모리를 새롭게
선언되거나 형변환이 되면서 다른 곳을 가리키게 되면서 주소를 잃어 버리게 되고 다시 찾을 수 없게 되면서 정리
되지 않은 메모리가 생겨 버리기 때문이다.
보통 게임개발을 하다보면 로비에서 인게임으로 진입하거나, 인게임에서 로비로 되돌아올 때
강제로 GC.Collect()를 호출하는 사람들이 종종 있는데 이는 좋지 못한 방법이다.
(기본적으로 0세대에 집중적 처리하는데 강제 호출하게되면 다른 객체들이 다 1세대씩 올라감)
그리고 클래스의 정적 필드(Static)으로 기록된 객체들은 명시적으로 해당 객체를 null로 할당해주어야 한다.
그렇지 않는 한 절대 해제되지 않는다.
<최적화 팁>
<기술면접>
가비지 컬렉션으로 실제 성능 문제가 발생 했을 때 사용 할 수 있는 가비지 컬렉션 회피 전략에는
값타입 사용, 메모리 할당 최소화, GC 호출 최소화, Finzlizer 사용제한, IDisposable 활용 전략이 있습니다.
각 방법에 대해서 좀 구체적으로 설명해 주실수 있나요?
음.. 일단 당연히 구조체같이 힙 메모리 사용을 하지 않는 값타입을 사용한다면 가비지 컬렉션을 회피 할 수 있고
재사용 객체는 미리 생성하고 재사용하면서 임시객체의 생성을 줄여서 메모리 할당을 최소화 하는 방법이 있습니다.
또한 가비지 콜렉션을 직접 호출하는 것은 가급적 피하고, 가비지 컬렉션에 수거되기 전에 호출되는 특수 메서드인
FInalizer 사용을 최소화 합니다.
C#에서 GC는 메모리 관리를 자동화해주는 역할을 하지만, 때때로 GC가 동작할 때 성능 저하가 발생할 수 있다.
C#에서 가비지 컬렉션에 의한 성능 저하를 최소화하려면 다음과 같은 전략을 사용할 수 있다.
1.메모리 할당 최소화: 재사용 가능한 객체는 미리 생성하고 재사용하며, 임시 객체의 생성을 최소화한다.
(가비지 컬렉터의 역할이 메모리를 할당하고 해제하는 작업임으로)
(대표적으로 오브젝트 풀링)
GC 직접 호출 최소화: GC.Collect()를 필요할 때만 호출하여 가비지 컬렉션 빈도를 줄인다.
IDisposable 활용: 리소스를 직접 관리하는 클래스에서는 IDisposable 인터페이스를 구현하여 리소스를 적시에 해제한다.
(가비지 컬렉터의 처리 작업을 줄여줌)
Finalizer 사용 제한: 가비지 컬렉션이 느려지는 원인인 Finalizer 사용을 최소화한다.
값 타입 활용: 가능한 경우 참조 타입 대신 구조체와 같은 값 타입을 사용하여 가비지 컬렉션의 대상을 줄인다.
위 전략들은 성능 최적화를 위한 것이지만, 코드의 가독성이나 유지 관리성을 저해할 수 있으므로 실제 성능 문제가 발생했을 때만 적용하는 것이 좋다.