unity GC机制简单介绍

GC全称是garbage collection,即垃圾回收,顾名思义就是一种释放内存垃圾的机制。这种机制主要作用在堆空间上。

堆上的变量在存储的时候,主要分为以下几步:

1)首先,unity检测是否有足够的闲置内存单元用来存储数据,如果有,则分配对应大小的内存单元;

2)如果没有足够的存储单元,unity会触发垃圾回收来释放不再被使用的堆内存。这步操作是一步缓慢的操作,如果垃圾回收后有足够大小的内存单元,则进行内存分配。

3)如果垃圾回收后并没有足够的内存单元,则unity会扩展堆内存的大小,这步操作会很缓慢,然后分配对应大小的内存单元给变量。

垃圾回收时的操作

当堆内存上一个变量不再处于激活状态的时候,其所占用的内存并不会立刻被回收,不再使用的内存只会在GC的时候才会被回收。

每次运行GC的时候,主要进行下面的操作:

1)GC会检查堆内存上的每个存储变量;

2)对每个变量会检测其引用是否处于激活状态;

3)如果变量的引用不再处于激活状态,则会被标记为可回收;

4)被标记的变量会被移除,其所占有的内存会被回收到堆内存上。

何时会触发垃圾回收

主要有三个操作会触发垃圾回收:

1) 在堆内存上进行内存分配操作而内存不够的时候都会触发垃圾回收来利用闲置的内存;

2) GC会自动的触发,不同平台运行频率不一样;

3) GC可以被强制执行。

降低GC的几种方法:

1.使用对象池

对象池,顾名思义就是一定数量的已经创建好的对象(Object)的集合。当需要创建对象时,先在池子中获取,如果池子中没有符合条件的对象,再进行创建新对象,同样,当对象需要销毁时,不做真正的销毁,而是将其setActive(false),并存入池子中。这样就避免了大量对象的创建。

2.string和StringBuilder的使用

对于执行大量字符串操作的例程 (例如在循环中多次修改字符串的应用程序) ,重复修改字符串可能会显著降低性能。 替代方法是使用 StringBuilder ,它是一个可变字符串类。 可变性是指在创建类的实例后,可以通过追加、移除、替换或插入字符来修改它。 StringBuilder对象维护缓冲区以容纳对字符串的扩展。 如果空间可用,则会将新数据追加到缓冲区;否则,将分配一个新的更大的缓冲区,将原始缓冲区中的数据复制到新缓冲区,然后将新数据追加到新缓冲区。

3.减少装箱操作

装箱指的是值类型转换成引用类型,拆箱则是反过来。

 装箱和取消装箱过程需要进行大量的计算。 对值类型进行装箱时,必须创建一个全新的对象。 这可能比一些简单的引用赋值耗时最多能长 20 倍。 取消装箱的过程所需时间也可达赋值操作的四倍,所以尽量避免装箱和拆箱。

4.关键帧限制协程调用(startcoroutine()实际上是new一个对象)

5.用for代替foreach(5.5版本以前有装箱操作,会在堆内存上产生一个system.object)

6.struct中不要有引用类型变量(struct是值类型,而如果struct中有引用类型的变量,GC会检查整个struct)【增加GC的方式是让它检查不必检查的对象】

7.主动调用GC

你可能感兴趣的:(unity,unity)