简介:
垃圾回收(GC)是指将废弃的内存重新回收再次使用的过程。是内存管理的一部分。
原理:
Unity采用的是BOEHM GC, BOEHM GC使用的是Mark-Sweep,也就是先通过一个Root指针来遍历所有的被引用的对象,并标记。直到遍历完所有的指针。再次遍历整个,将未标记的内存释放。
机制说明:
(1)unity内部会有两个内存管理池:堆内存和堆栈内存。堆栈内存(stack)主要用来存储较小的和短暂的数据,堆内存(heap)主要用来存储较大的和存储时间较长的数据。 (2)unity中的变量只会在堆栈或者堆内存上进行内存分配 (3)只要变量处于激活状态,则其占用的内存会被标记为使用状态,则该部分的内存处于被分配的状态 (4)一旦变量不再激活,则其所占用的内存不再需要,该部分内存可以被回收到内存池中再次被使用,这样的操作就是内存回收。处于堆栈上的内存回收速度极其快速,处于堆上的内存并不是及时回收的,因此其对应的内存依然会被标记为使用状态。 (5)垃圾回收主要是指堆上的内存分配和回收,unity中会定时堆堆内存进行GC操作
何时会触发垃圾回收:
主要有三个操作会触发垃圾回收:
1) 在堆内存上进行内存分配操作而内存不够的时候都会触发垃圾回收来利用闲置的内存;
2) GC会自动的触发,不同平台运行频率不一样;
3) GC可以被强制执行。
垃圾回收的操作:
1.检测堆内存的存储变量
2.查看变量是否激活
3.标记无激活的变量为可回收
4.被标记变量移除回收
优化手段:
1.对象池
2.清除链表
3.主动调用System.GC.Collect()
4.检测不必要的堆内存代码:如字符串,LINQ和常量表达式,协程,结构体代替class
5.缓存