본문 바로가기
프로그래밍/Unity 코드

가비지 컬렉션과 메모리에 대한 정리.

by 눈야옹 2016. 1. 14.

*가비지 컬렉션 (GC)에 대한 생각 정리

1.C++에서는 메모리 구조가 콜스텍,힙, 레지스터 정적메모리 4가지로 구분된다.

하지만 C#으로오면서 콜스텍과 힙영역에만 저장된다.

2. 가비지 컬렉터(Garbage Collector)은 메모리가 부족할때 일어난다.

레퍼런스 카운팅으로 현재 힙 매모리에 있는 것중 가장 접근 하지않는(사용하지않는) 것부터 세대수를 매겨서 
(1세대, 2세대,3세대....)

그 중 가장 낮은 세대부터 메모리에 여유가 생길떄 까지 해제한다(즉 지운다)

여기서 키워드 auto , static, extern, register(C언어만)

그리고 int,char, float 등 값타입은 스택에 저장된다

목록

int, float, double, char, struct, bool, enum

unsigned, byte, long, short

 위에 aotumatic 변수들의 생명은 컴파일러에 의해서 결정된다. 즉 프로그래머가 신경쓰지 않아도 된다.

반대로 힙에저장되는 목록

class, object, string

3. 가비지 컬렉션에 의해 자동 해제가 아닌 수동으로 해제할떄는 변수에 null을 넣으면 된다.

cTestClass* TC = new cTestClass; <--생성

사용후..

TC = null <-- 이러면 자연히 세대수 가장 낮은곳으로 가게 되며 가장먼저 해제'대상'이된다. 해제 되는것이 아닌 해제대상이다.

그러므로 로딩을 할떄나 시네마틱 연출등등 플레이와 상관없는 행동을 할떄 System.GC.Collect();.을 이용하여 컬렉션 정리를 해주는것도 좋다.

* 참고로 GameObject.Find()은 그 객체의 인스터스를 리턴한다.

하지만 여기서 가비지 컬렉션 또한 프로그램이 구동되는 동안 메모리를 잡아먹는 즉 비용이 든다.

레퍼런스 카운팅을 조사하기 떄문이다.

그러므로 가볍게 변수를 가지고 있을 경우라면 struct에 다 하는것도 좋다.

ex) 이름.나이.HP.등등 간단한 수치 저장 = struct

기능을 구현 = class


그리고 유니티에서 하나의 씬에서 다음 신으로 넘어갈때 이전씬의 모든 변수들은 파괴된다. (그러니 저장하자)




참고 : http://unityindepth.tistory.com/12