사용자가 런타임중에 할당한 메모리를 자동으로 반환해주는 프로세스이다.
생산성
가비지 컬렉터를 사용하는 대표적인 언어는 C#, 자바, 파이썬 등이 있는데 이 언어들의 장점은 생산성이 높다는 것이다.
사용자가 직접 메모리를 할당하고 해제해주는 방식은 메모리를 관리하는데에 있어 개발자원이 많이 소모되기때문에 생산성이 상대적으로 낮다.
메모리누수방지
직접 메모리를 할당하고 해제하면, 메모리누수가 생길 수 있는데 메모리 누수가 있는 프로그램은 비정상적으로 프로그램이 종료되거나 성능상의 문제가 발생할 수 있다.
메모리 단편화 감소
메모리를 계속 할당하다보면 메모리공간이 따로 떨어져 메모리공간들이 파편화되는 현상이 발생할 수 있다. 가비지컬렉터에서 메모리를 재배치하고 압축하여 이를 감소시켜준다.
성능오버헤드
가비지컬렉터가 자동으로 메모리를 관리해주는 방식은 사용하지않는 메모리를 찾아내서 자동으로 반환해주는 것이다. 사용하지않는 메모리를 찾는 과정과 이를 반환하는 시점은 가비지컬렉터가 자동으로 하기때문에 사용자가 예상할 수 없다. 특정시점에 가비지컬렉터로 인한 프레임드랍, 한번에 많은 가비지컬렉터의 동작으로 병목현상으로인한 성능저하는 고치기 어려운 문제가 된다.
메모리 사용증가
사용자가 사용하지않는 메모리를 직접 해제하는 방식이 아니기때문에 메모리 사용량이 증가할 수 있다.
GC는 가비지를 빠르게 수집하게 위해서 객체에 세대를 매긴다.
0~2세대 까지 존재한다.
보통 새로운 객체가 만들어지면 0세대가 되고, 가비지컬렉터 수집이후에도 살아남은 객체는 세대가 증가해 2세대까지 증가한다.
전체 힙을 동일하게 관리하기 보다는 일부 힙을 압축하고 관리하는 것이 더 빠르기 때문에 GC는 수집을 할 때마다, 이 방법을 이용하여 전체를 다루기 보단 특정 세대의 힙 메모리를 해제하는 방식을 취한다.
GC는 객체의 크기에 따라서 세대를 다르게 매긴다. 객체의 크기가 일정이상(85,000바이트)이면 초기부터 2세대로 매겨진다.
why?) 객체의 크기가 크면 오래 사용할 객체일 확률이 크기때문
박싱은 값형 변수를 참조형 변수로 저장하는 것!
언박싱은 참조형 변수를 값형 변수로 저장하는 것!
값형 변수 : 변수에 값을 직접적으로 저장
참조형 변수 : 변수에 데이터의 참조값을 저장
실제 참조형변수에 저장된 데이터는 객체로 힙영역에 할당
박싱과 언박싱을 자주 사용하면 성능저하가 발생할 수 있다.
why?) 힙영역의 메모리할당 >> 가비지컬렉터 사용유발
박싱된 객체와 원래의 값형 변수는 독립적이다. 박싱된 객체의 값을 바꿔도 값형 변수는 바뀌지않는다.
Update는 매프레임마다 호출되는 생명주기함수인데, GetComponent와 같이 비용이 큰 메서드를 Update에서 사용하면 큰 성능저하요인이 된다.
GetComponet를 사용해야하는 경우에는 Awake나 Start에서 한 번 호출하여 캐싱하여 사용하면 되기때문에 굳이 Update문에서 할 이유가 없다.
필요하다면 RequireCompnent를 통해 의존성을 명시해두면 안전하게 Component를 캐싱할 수 있다.